当前位置: 首页 > 工具软件 > php-timer > 使用案例 >

Workerman给Timer定时器里的方法传参数

路思源
2023-12-01

一、需求

1、进程启动时onWorkerStart()里有一个Timer定时器,我想把$worker->id进程ID传递到另一个Demo类的run()方法里。

<?php
namespace app\kj\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
use app\kj\controller\Demo;

class Worker extends Server {
	protected $socket = 'http://0.0.0.0:2345';
	//线程数量
	protected $processes = 3;
	/**
     * 进程启动时
     * @param $worker
     */
	public function onWorkerStart($worker) {
            $id=$worker->id;
            Timer::add(5, function (){		
				Demo::run();
			});	
	}
	/**
     * 收到信息
     * @param $connection
     * @param $data
     */
	public function onMessage($connection, $data) {
		//$connection->send('我收到你的信息了');
	}
	/**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
	public function onConnect($connection) {
		//echo $connection->getRemoteIP();
	}
	/**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
	public function onClose($connection) {
		//echo $connection->id . 'disconnect \r\n';
	}
	/**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
	public function onError($connection, $code, $msg) {
		//echo "error $code $msg\n";
	}
}

2、如果我直接写成如下方法,运行是会报错的,原因是Timer的这个add函数为匿名函数(闭包)。

	public function onWorkerStart($worker) {
            $id=$worker->id;
            Timer::add(5, function (){		
				Demo::run($id);
			});	
	}

二、解决方案:

1、在类内部使用定时器

	/**
     * 进程启动时
     * @param $worker
     */
	public function onWorkerStart($worker) {
		$id=$worker->id;
		/*
		 * 定时函数为类方法(类内部使用定时器)5秒后执行任务
		 * 1、回调的方法属于当前的类,则回调数组第一个元素为$this,第二个元素为函数名
		 * 2、第二个参数为传递给回调函数的值,传递多个可以使用array(参数一,参数二)
		 * 3、最后一个参数传递false,表示只运行一次
		 */
		Timer::add(5, array($this, 'task'),$id, true);
	}
	// 回调函数属性必须是public
	public function task($id){
		Demo::run($id);
	}

 2、use闭包方式传递

	/**
     * 进程启动时
     * @param $worker
     */
	public function onWorkerStart($worker) {
		$id=$worker->id;
		// 要想让$id能正确传递到匿名函数内部,$id前面必须加地址符 &
		Timer::add(5, function ()use(&$id){		
			Lottery::run($id);
		});	
	}
 类似资料: