首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
swoole_timer_tick定时器创建成功,但是不运行
### 问题描述 在进程池\Swoole\Process\Pool中使用swoole_timer_tick创建一个定时器,创建的位置为onWorkerStart回调中,创建后能得到定时器ID,并且调试信息为[2020-06-24 16:37:14 @15451.0] TRACE swTimer_add(:198): id=1, exec_msec=1000, msec=1000, round=0, exist=1,但是定时器并没有得到运行,并且没有抛出任何报错信息,请大神帮忙定位一下问题。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole4.5.2 PHP 7.1.4 Ubuntu 16.04.6 LTS ### 相关代码 ```php <?php namespace app\core\controller; use Swoole\Server; use think\Controller; use \Swoole\Database\PDOConfig; use \Swoole\Database\PDOPool; use think\Db; class Processtask extends Controller{ public $process_pool; public $pair_id; public function __construct(){ $this->process_pool = new \Swoole\Process\Pool(4); $this->process_pool->on('workerStart',[$this,'onWorkerStart']); $this->process_pool->on('WorkerStop',[$this,'onWorkerStop']); $this->process_pool->set(["log_level"=>SWOOLE_LOG_DEBUG]); swoole_set_process_name('coin_task'); $this->process_pool->start(); } public function indexAction(){ var_dump("我是index"); } public function onWorkerStart($pool, $workerId){ $running = true; pcntl_signal(SIGTERM, function () use (&$running) { $running = false; }); switch ($workerId){ case 0: swoole_set_process_name('coin_task_deposit_order_0'); var_dump("下单进程{$workerId}启动"); model("api/UserOrder")->depositOrderToOrder($running,$workerId); break; case 1: swoole_set_process_name('coin_task_deposit_order_1'); var_dump("下单进程{$workerId}启动"); model("api/UserOrder")->depositOrderToOrder($running,$workerId); break; case 2: cache("swoole_time_out",11,25); swoole_set_process_name('coin_task_deposit_order_2'); var_dump("下单进程{$workerId}启动"); model("api/UserOrder")->depositOrderToOrder($running,$workerId); break; case 3: swoole_set_process_name('coin_task_master_clear_3'); \Swoole\Timer::tick(1000,function($timer_id){ var_dump("定时器id为:"); }); //3000ms后执行此函数 swoole_timer_after(3000, function ($timer_id) { file_put_contents(ROOT_PATH."runtime/log/".date("Ym")."/".date("d")."_start.log","定时器id为:".$timer_id,FILE_APPEND); echo "after 3000ms.\n"; }); file_put_contents(ROOT_PATH."runtime/log/".date("Ym")."/".date("d")."_start.log","定时器id为:",FILE_APPEND); $who_are_you = swoole_timer_tick(2000,[$this,"testTimers"]); $pool->groupError_timer_id = $who_are_you; var_dump("成团结算进程启动"); model("api/UserOrder")->groupClear($running,$workerId); default: break; } } public function testTimers($timer_id){ var_dump("定时器id为:"); file_put_contents(ROOT_PATH."runtime/log/".date("Ym")."/".date("d")."_start.log","定时器id为:".$timer_id,FILE_APPEND); } public function onWorkerStop($pool, $workerId){ switch ($workerId){ case 0: var_dump("下单进程{$workerId}停止"); break; case 1: var_dump("下单进程{$workerId}停止"); break; case 2: var_dump("下单进程{$workerId}停止"); break; case 3: $clear_status = \Swoole\Timer::clear($pool->groupError_timer_id); var_dump("成团失败定时器".$pool->groupError_timer_id."结束,结束状态为:".$clear_status); var_dump("成团结算进程停止"); break; default: break; } } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待结果为启动后能打印出定时器中的输出内容,结果为没有任何信息被打印出来,系统一切运行正常,打印出来的都为我正常的业务输出内容,如下: [2020-06-24 17:07:06 @16003.0] TRACE php_swoole_reactor_init(:254): init reactor [2020-06-24 17:07:06 @16003.0] TRACE swTimer_add(:198): id=1, exec_msec=1000, msec=1000, round=0, exist=1 [2020-06-24 17:07:06 @16003.0] TRACE swTimer_add(:198): id=2, exec_msec=3000, msec=3000, round=0, exist=2 [2020-06-24 17:07:06 @16003.0] TRACE swTimer_add(:198): id=3, exec_msec=2000, msec=2000, round=0, exist=3 string(24) "成团结算进程启动" string(19) "下单进程0启动" string(19) "下单进程1启动" string(19) "下单进程2启动" string(31) "下单进程2没有取到数据" string(36) "成团结算进程没有取到数据" string(31) "下单进程1没有取到数据" string(31) "下单进程0没有取到数据" string(31) "下单进程2没有取到数据" string(36) "成团结算进程没有取到数据" string(31) "下单进程1没有取到数据" string(31) "下单进程0没有取到数据"
发布于4年前 · 5 次浏览 · 来自
提问
Swoole_Echo
### 问题描述 在进程池\Swoole\Process\Pool中使用swoole_timer_tick创建一个定时器,创建的位置为onWorkerStart回调中,创建后能得到定时器ID,并且调试信息为[2020-06-24 16:37:14 @15451.0] TRACE swTimer_add(:198): id=1, exec_msec=1000, msec=1000, round=0, exist=1,但是定时器并没有得到运行,并且没有抛出任何报错信息,请大神帮忙定位一下问题。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole4.5.2 PHP 7.1.4 Ubuntu 16.04.6 LTS ### 相关代码 ```php <?php namespace app\core\controller; use Swoole\Server; use think\Controller; use \Swoole\Database\PDOConfig; use \Swoole\Database\PDOPool; use think\Db; class Processtask extends Controller{ public $process_pool; public $pair_id; public function __construct(){ $this->process_pool = new \Swoole\Process\Pool(4); $this->process_pool->on('workerStart',[$this,'onWorkerStart']); $this->process_pool->on('WorkerStop',[$this,'onWorkerStop']); $this->process_pool->set(["log_level"=>SWOOLE_LOG_DEBUG]); swoole_set_process_name('coin_task'); $this->process_pool->start(); } public function indexAction(){ var_dump("我是index"); } public function onWorkerStart($pool, $workerId){ $running = true; pcntl_signal(SIGTERM, function () use (&$running) { $running = false; }); switch ($workerId){ case 0: swoole_set_process_name('coin_task_deposit_order_0'); var_dump("下单进程{$workerId}启动"); model("api/UserOrder")->depositOrderToOrder($running,$workerId); break; case 1: swoole_set_process_name('coin_task_deposit_order_1'); var_dump("下单进程{$workerId}启动"); model("api/UserOrder")->depositOrderToOrder($running,$workerId); break; case 2: cache("swoole_time_out",11,25); swoole_set_process_name('coin_task_deposit_order_2'); var_dump("下单进程{$workerId}启动"); model("api/UserOrder")->depositOrderToOrder($running,$workerId); break; case 3: swoole_set_process_name('coin_task_master_clear_3'); \Swoole\Timer::tick(1000,function($timer_id){ var_dump("定时器id为:"); }); //3000ms后执行此函数 swoole_timer_after(3000, function ($timer_id) { file_put_contents(ROOT_PATH."runtime/log/".date("Ym")."/".date("d")."_start.log","定时器id为:".$timer_id,FILE_APPEND); echo "after 3000ms.\n"; }); file_put_contents(ROOT_PATH."runtime/log/".date("Ym")."/".date("d")."_start.log","定时器id为:",FILE_APPEND); $who_are_you = swoole_timer_tick(2000,[$this,"testTimers"]); $pool->groupError_timer_id = $who_are_you; var_dump("成团结算进程启动"); model("api/UserOrder")->groupClear($running,$workerId); default: break; } } public function testTimers($timer_id){ var_dump("定时器id为:"); file_put_contents(ROOT_PATH."runtime/log/".date("Ym")."/".date("d")."_start.log","定时器id为:".$timer_id,FILE_APPEND); } public function onWorkerStop($pool, $workerId){ switch ($workerId){ case 0: var_dump("下单进程{$workerId}停止"); break; case 1: var_dump("下单进程{$workerId}停止"); break; case 2: var_dump("下单进程{$workerId}停止"); break; case 3: $clear_status = \Swoole\Timer::clear($pool->groupError_timer_id); var_dump("成团失败定时器".$pool->groupError_timer_id."结束,结束状态为:".$clear_status); var_dump("成团结算进程停止"); break; default: break; } } } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待结果为启动后能打印出定时器中的输出内容,结果为没有任何信息被打印出来,系统一切运行正常,打印出来的都为我正常的业务输出内容,如下: [2020-06-24 17:07:06 @16003.0] TRACE php_swoole_reactor_init(:254): init reactor [2020-06-24 17:07:06 @16003.0] TRACE swTimer_add(:198): id=1, exec_msec=1000, msec=1000, round=0, exist=1 [2020-06-24 17:07:06 @16003.0] TRACE swTimer_add(:198): id=2, exec_msec=3000, msec=3000, round=0, exist=2 [2020-06-24 17:07:06 @16003.0] TRACE swTimer_add(:198): id=3, exec_msec=2000, msec=2000, round=0, exist=3 string(24) "成团结算进程启动" string(19) "下单进程0启动" string(19) "下单进程1启动" string(19) "下单进程2启动" string(31) "下单进程2没有取到数据" string(36) "成团结算进程没有取到数据" string(31) "下单进程1没有取到数据" string(31) "下单进程0没有取到数据" string(31) "下单进程2没有取到数据" string(36) "成团结算进程没有取到数据" string(31) "下单进程1没有取到数据" string(31) "下单进程0没有取到数据"
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2020-07-01
郭新华
`model("api/UserOrder")->groupClear($running,$workerId);`这行是不是阻塞了
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。