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);
});
}