首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
定时器tick内执行的外部命令,只能保持在当前的定时器空间内,一旦退出或者下一次tick就会被杀死进程
### 问题描述 原程序是为了实现一个循环存监控视频的程序,这里我把关键部分抽取出来运行,可以把问题还原出来 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole版本4.5.1,php版本7.4 操作系统Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-142-generic x86_64) ### 相关代码 ```php use Swoole\Coroutine\System; use Swoole\Coroutine; use Swoole\Database\PDOConfig; use Swoole\Database\PDOPool; use Swoole\Timer; Coroutine\run(function () { Timer::tick(10*1000,function ($timer_id){ //Coroutine::create(function () { $process=System::exec("nohup /usr/local/ffmpeg/bin/ffmpeg -rtsp_transport tcp -i rtsp://39.128.2.131:8557/h264 -fflags flush_packets -max_delay 1 -an -flags -global_header -hls_time 10 -hls_list_size 864000000 -vcodec copy -y /www/wwwroot/test_save/52/20201108/162750/7c8149f32327b5211a8edc4a05c8bf84.m3u8 1>/dev/null 2>&1 & echo $!"); var_dump($process); System::sleep(10); return; //}); }); }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 定时器执行的时候产生了一个ffmpeg进程,理论上这个进程和当前的php应该已经没有关系了(我命令行查看这个ffmpeg进程的时候ppid也是1),然而这个进程只存在10秒,下一次tick的时候,这个产生的ffmpeg进程就被杀死了,我又试了下第一次tick就立刻结束当前进程,结果ffmpeg进程还是被杀死了,有点没搞清楚为啥?
发布于5年前 · 6 次浏览 · 来自
提问
chen0520
### 问题描述 原程序是为了实现一个循环存监控视频的程序,这里我把关键部分抽取出来运行,可以把问题还原出来 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole版本4.5.1,php版本7.4 操作系统Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-142-generic x86_64) ### 相关代码 ```php use Swoole\Coroutine\System; use Swoole\Coroutine; use Swoole\Database\PDOConfig; use Swoole\Database\PDOPool; use Swoole\Timer; Coroutine\run(function () { Timer::tick(10*1000,function ($timer_id){ //Coroutine::create(function () { $process=System::exec("nohup /usr/local/ffmpeg/bin/ffmpeg -rtsp_transport tcp -i rtsp://39.128.2.131:8557/h264 -fflags flush_packets -max_delay 1 -an -flags -global_header -hls_time 10 -hls_list_size 864000000 -vcodec copy -y /www/wwwroot/test_save/52/20201108/162750/7c8149f32327b5211a8edc4a05c8bf84.m3u8 1>/dev/null 2>&1 & echo $!"); var_dump($process); System::sleep(10); return; //}); }); }); ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 定时器执行的时候产生了一个ffmpeg进程,理论上这个进程和当前的php应该已经没有关系了(我命令行查看这个ffmpeg进程的时候ppid也是1),然而这个进程只存在10秒,下一次tick的时候,这个产生的ffmpeg进程就被杀死了,我又试了下第一次tick就立刻结束当前进程,结果ffmpeg进程还是被杀死了,有点没搞清楚为啥?
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2020-11-09
鲁飞
看下文档定时器校正部分
赞
0
回复
2020-11-09
chen0520
回复
鲁飞
所以现在有没有办法在swoole中创建一个不受协程关闭影响的外部命令呢?
赞
0
回复
2020-11-09
鲁飞
回复
chen0520
proc_open
赞
0
回复
2020-11-11
chen0520
回复
鲁飞
感谢谢,问题解决了,还有2个小问题 1.整个php进程强制关闭的时候外部命令的进程还是会关闭,这个时候还有办法不关闭么?毕竟希望不要因为php崩了就让所有录制进程都崩了。 2.filectime在协程中无法获取实时的时间,是因为这个函数还没有一键协程化么?
赞
0
回复
2020-11-12
chen0520
回复
鲁飞
纠正一下,发现的2个小问题, 首先第一个现在应该已经没问题了,我之前都是在命令行直接ctrl+c,所以进程估计是连带清空了,直接kill 没啥问题,我又加了接受kill信号柔和地中断当前的进程,现在应该基本完善了 然后第二个,自己也小测试了几个,发现如果使用当前协程如果只有一个相同的path进行filectime的话,这个时间是不会变的,如果一旦有2个以上的路径,则还是正常的,不知道为啥,代码如下 ```php Coroutine\run(function () { Timer::tick(3*1000,function (){ var_dump(filectime("/www/dd.m3u8"));//只打印这个filectime时间不变 var_dump(filectime("/www/ee.m3u8"));//同时打印这个,2个filectime时间都是可以随文件的修改而变化的 return; //}); }); }); ```
赞
0
回复
2020-11-12
鲁飞
回复
chen0520
请使用 clearstatcache() 来清除缓存。
赞
0
回复
2020-11-12
chen0520
回复
鲁飞
哦,好吧,一直在swoole下编程,思维定式了,忘了函数本身是有缓存的。。。。
赞
0
回复