首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
addProcess添加了一个用户进程不执行定时器
### 问题描述 Swoole\Http\Server 使用addProcess添加了一个用户进程 在用户进程内使用 Timer::after 也返回了定时器ID 但是不执行定时器的回调函数 求助 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.5.2 php 7.4.14 centos7.9 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图) ``` ```php //http服务 $this->_server->addProcess((new JobProcess($this->_server,$this->_config))->getProcess()); //JobProcess /** * getProcess * @return Process */ public function getProcess() { $process = new Process(function (Process $process) { while(true){ //Swoole\Table判断是否有数据改动 if (FlagTable::getInstance()->getFlag()){ $jobTable = JobTable::getInstance(); $data = []; foreach ($jobTable->getTable() as $key =>$value){ if($value['status']){ JobFacade::getExecute($process,$key,$value); } $data[$key] = $value; } if(is_writable($this->_jobDataFile)) file_put_contents($this->_jobDataFile,serialize($data)); FlagTable::getInstance()->setFlag(false); } }; }, false, 2, true); $process->name('SwooleCrontabProcess'); return $process; } //JobFacade /** * getExecute * @param Process $process * @param $key * @param $data */ public static function getExecute($process,$key,$data) { Timer::after(1*1000,function (){ file_put_contents('time.log',time().PHP_EOL,FILE_APPEND); }); return; } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待执行定时任务
发布于5年前 · 1 次浏览 · 来自
提问
拍皇片
### 问题描述 Swoole\Http\Server 使用addProcess添加了一个用户进程 在用户进程内使用 Timer::after 也返回了定时器ID 但是不执行定时器的回调函数 求助 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.5.2 php 7.4.14 centos7.9 ### 相关代码 ```php 请将代码粘贴至此处(请勿用截图) ``` ```php //http服务 $this->_server->addProcess((new JobProcess($this->_server,$this->_config))->getProcess()); //JobProcess /** * getProcess * @return Process */ public function getProcess() { $process = new Process(function (Process $process) { while(true){ //Swoole\Table判断是否有数据改动 if (FlagTable::getInstance()->getFlag()){ $jobTable = JobTable::getInstance(); $data = []; foreach ($jobTable->getTable() as $key =>$value){ if($value['status']){ JobFacade::getExecute($process,$key,$value); } $data[$key] = $value; } if(is_writable($this->_jobDataFile)) file_put_contents($this->_jobDataFile,serialize($data)); FlagTable::getInstance()->setFlag(false); } }; }, false, 2, true); $process->name('SwooleCrontabProcess'); return $process; } //JobFacade /** * getExecute * @param Process $process * @param $key * @param $data */ public static function getExecute($process,$key,$data) { Timer::after(1*1000,function (){ file_put_contents('time.log',time().PHP_EOL,FILE_APPEND); }); return; } ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 期待执行定时任务
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-03-04
鲁飞
以下代码正常 ```php $http = new Swoole\Http\Server('0.0.0.0', 9501); $process = new Swoole\Process(function ($process) { $str = "Swoole"; Swoole\Timer::after(1000, function() use ($str) { echo "Hello, $str\n"; }); }, false, 2, 1); $http->addProcess($process); $http->on('Request', function ($request, $response) { $response->header('Content-Type', 'text/html; charset=utf-8'); $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>'); }); $http->start(); ```
赞
0
回复
2021-03-05
拍皇片
$process = new Process(function (Process $process) { $flag = true; while(true){ if($flag){ $str = "Swoole"; $id = Timer::after(1000, function() use ($str) { file_put_contents(__DIR__.'/test.log',$str); }); print_r($id); $flag = false; } } }, false, 2, true); 这样添加用户进程为什么不执行定时器呢 没看到test.log写入,用的root用户执行的
赞
0
回复
2021-03-05
鲁飞
回复
拍皇片
加个sleep ```php $process = new Swoole\Process(function ($process) { $flag = true; while(true){ if($flag){ $str = "Swoole"; $id = Swoole\Timer::after(1000, function() use ($str) { echo "Hello, $str\n"; }); print_r($id); $flag = false; } co::sleep(.1); } }, false, 2, 1); ```
赞
1
回复
2021-03-05
拍皇片
回复
鲁飞
为什么加了`Coroutine::sleep(1)`就执行了呢?里面的时间还必须大于等于1 小于1试了还不行.
赞
0
回复
2021-03-05
鲁飞
回复
拍皇片
我这里是`.1`,就是`0.1`...
赞
0
回复
2021-03-05
拍皇片
回复
鲁飞
为什么`while`里加上`co::sleep(.1);`就执行了呢
赞
0
回复