首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
Task进程中使用tick,如果clear了,无法再次tick,这是正常的吗?
在task进程中启动了tick,后来又进行了clearTimer。之后还想再次启动一个tick,结果tick的函数无法执行了。使用的是1.8.10编译的。 示例代码如下: {{{ <?php /** * 测试clearTimer * * @param * @return */ $serv = new swoole_server("127.0.0.1", 10008, SWOOLE_BASE, SWOOLE_SOCK_TCP); $serv->set(array('worker_num' => 1, 'task_worker_num' => 1, 'daemonize' => false)); $serv->on('connect', function($serv, $fd){ echo "Client: Connect.\n"; }); $serv->on('receive', function($serv, $fd, $from_id, $data){ $cmd = trim($data); $serv->task($cmd); }); $serv->on('close', function($serv, $fd){ echo "Client: Close.\n"; }); $serv->on('WorkerStart', function($serv, $worker_id){ $serv->cronjob = array(); }); $serv->on('Task', function($serv, $task_id, $from_id, $data=NULL){ var_dump($data); if($data=='stop'){ if(!empty($serv->cronjob['test'])){ $serv->clearTimer($serv->cronjob['test']); } }elseif($data=='another'){ $tmp = $serv->tick(1511, function($id){ $now = microtime(true); echo "1511|{$id}|now:{$now}\n"; }); echo "another tick: {$tmp}\n"; }elseif($data=='start'){ $serv->cronjob['test'] = $serv->tick(500, function($id){ $now = microtime(true); echo "500|{$id}|now:{$now}\n"; }); echo "starting tick: {$serv->cronjob['test']}\n";//id有了,但是并无实际执行的对象 }else{ var_dump($data); } return true; }); $serv->on('Finish', function($serv, $data){ }); $serv->start(); }}} 执行时结果如下: {{{ Client: Connect. string(5) "start" starting tick: 1 500|1|now:1474189724.7422 500|1|now:1474189725.2424 500|1|now:1474189725.7424 (这是tick在正常执行) string(4) "stop" (停止tick,执行了clearTimer) string(5) "start" starting tick: 2 (并无tick实际执行,无输出) string(7) "another" another tick: 3 (并无tick实际执行,无输出) string(4) "stop" string(5) "start" starting tick: 4 (并无tick实际执行,无输出) }}}
发布于6年前 · 2 次浏览 · 来自
提问
u
username
在task进程中启动了tick,后来又进行了clearTimer。之后还想再次启动一个tick,结果tick的函数无法执行了。使用的是1.8.10编译的。 示例代码如下: {{{ <?php /** * 测试clearTimer * * @param * @return */ $serv = new swoole_server("127.0.0.1", 10008, SWOOLE_BASE, SWOOLE_SOCK_TCP); $serv->set(array('worker_num' => 1, 'task_worker_num' => 1, 'daemonize' => false)); $serv->on('connect', function($serv, $fd){ echo "Client: Connect.\n"; }); $serv->on('receive', function($serv, $fd, $from_id, $data){ $cmd = trim($data); $serv->task($cmd); }); $serv->on('close', function($serv, $fd){ echo "Client: Close.\n"; }); $serv->on('WorkerStart', function($serv, $worker_id){ $serv->cronjob = array(); }); $serv->on('Task', function($serv, $task_id, $from_id, $data=NULL){ var_dump($data); if($data=='stop'){ if(!empty($serv->cronjob['test'])){ $serv->clearTimer($serv->cronjob['test']); } }elseif($data=='another'){ $tmp = $serv->tick(1511, function($id){ $now = microtime(true); echo "1511|{$id}|now:{$now}\n"; }); echo "another tick: {$tmp}\n"; }elseif($data=='start'){ $serv->cronjob['test'] = $serv->tick(500, function($id){ $now = microtime(true); echo "500|{$id}|now:{$now}\n"; }); echo "starting tick: {$serv->cronjob['test']}\n";//id有了,但是并无实际执行的对象 }else{ var_dump($data); } return true; }); $serv->on('Finish', function($serv, $data){ }); $serv->start(); }}} 执行时结果如下: {{{ Client: Connect. string(5) "start" starting tick: 1 500|1|now:1474189724.7422 500|1|now:1474189725.2424 500|1|now:1474189725.7424 (这是tick在正常执行) string(4) "stop" (停止tick,执行了clearTimer) string(5) "start" starting tick: 2 (并无tick实际执行,无输出) string(7) "another" another tick: 3 (并无tick实际执行,无输出) string(4) "stop" string(5) "start" starting tick: 4 (并无tick实际执行,无输出) }}}
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2019-03-14
o
oceanfor99
我也碰到这个问题。偶尔tick没有执行闭包里面的代码。但有时候发现过了一段时间闭包里面的代码又被执行了。感觉tick被延时执行了。不知道是什么情况。
赞
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一直是同一个。没用使用到多进程啊。