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

一、需求

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);
		});	
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值