首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
定时器创建成功却不执行是为什么?
### 问题描述 定时器创建成功却不执行是为什么? ### Swoole版本,PHP版本,以及操作系统版本信息 php7.2,swoole 4.4.15 ,centos ### 相关代码 ```php /* * 队列定时加入定时器 */ public function dealTimerQueue(){ $this->onWork = true; try { $queue = new Queue(); $list = $queue->fetchlist('timer_type=2'); } catch (\throwable $e) { return false; } foreach ($list as $k=>$v){ $v['space'] = $v['space'] ? $v['space'] :2; $timer_id = \Swoole\Timer::tick($v['space']*1000, function ($timer_id)use($v) { $this->send($v['controller'] , $v['method'] ,$v['param'],$timer_id); }); $queue->delete($v['id'], $timer_id); \Swoole\Coroutine\System::sleep(0.06); } $this->onWork = false; unset($queue); } /** * 绑定定时器 * @param unknown $controller * @param unknown $method * @param unknown $param */ public function send($controller , $method , $param = '' ,$timerId=0){ $param = json_decode($param ,true); $param['timerId'] = $timerId; $param['timer_type'] = 2; wlog($param); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 循环创建的定时器,目前一次性创建7000+定时器,都返回正常的定时器iD了。但是就是不执行 send 函数。 下面的打印打不出来。
发布于5年前 · 4 次浏览 · 来自
提问
C
Caption
### 问题描述 定时器创建成功却不执行是为什么? ### Swoole版本,PHP版本,以及操作系统版本信息 php7.2,swoole 4.4.15 ,centos ### 相关代码 ```php /* * 队列定时加入定时器 */ public function dealTimerQueue(){ $this->onWork = true; try { $queue = new Queue(); $list = $queue->fetchlist('timer_type=2'); } catch (\throwable $e) { return false; } foreach ($list as $k=>$v){ $v['space'] = $v['space'] ? $v['space'] :2; $timer_id = \Swoole\Timer::tick($v['space']*1000, function ($timer_id)use($v) { $this->send($v['controller'] , $v['method'] ,$v['param'],$timer_id); }); $queue->delete($v['id'], $timer_id); \Swoole\Coroutine\System::sleep(0.06); } $this->onWork = false; unset($queue); } /** * 绑定定时器 * @param unknown $controller * @param unknown $method * @param unknown $param */ public function send($controller , $method , $param = '' ,$timerId=0){ $param = json_decode($param ,true); $param['timerId'] = $timerId; $param['timer_type'] = 2; wlog($param); } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 循环创建的定时器,目前一次性创建7000+定时器,都返回正常的定时器iD了。但是就是不执行 send 函数。 下面的打印打不出来。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-09-27
鲁飞
不要带你业务提问,发最简复现代码来
赞
0
回复
2020-09-28
鲁飞
未复现问题,正常输出 ```php class Test { public function index() { $list = ['foo' => 'bar', 'test' => 'test1', 'test2' => 'test3']; foreach ($list as $k => $v){ $timer_id = \Swoole\Timer::tick(1000, function ($timer_id) use ($v) { $this->send($v, $timer_id); }); \Swoole\Coroutine\System::sleep(0.06); } } public function send($data, $id) { var_dump($data, $id); } } go(function () { (new Test)->index(); }); ```
赞
0
回复
2020-09-28
C
Caption
解决了!
赞
0
回复