在yii2框架中
1、初始化,注册信号处理
public function init()
{
parent::init();
$this->myPid = getmypid();
...
// 注册信号处理函数,处理子进程结束时的回收工作
\swoole_process::signal(SIGCHLD, [$this, 'finished']);
}
2、信号函数
public function finished($signo)
{
// $blocking 参数可以指定是否阻塞等待,默认为阻塞
while (($result = \swoole_process::wait(false))) {
$pid = $result['pid'];
$exitCode = $result['code'];
......
// 释放工作表
unset($this->works[$pid]);
}
}
使用swoole_process::wait()后,脚本一直停留在控制台。即执行完毕,但是一直处于等待中,直到手动按下Ctrl + C 后命令才终止执行,不得已才使用
3、使用析构函数来终止主进程
public function __destruct()
{
if (!count($this->works)) {
\swoole_process::kill($this->myPid);
}
}
但是其它具体执行的命令是正常结束的,比如一个报告文件report.txt
当前机器: 192.168.1.149 当前用户: zhgxun 当前代码分支: * master@* master 345f5bc fix app file
当前引导命令: ./yii etl/default/test
运行日志目录: /Users/zhgxun/Public/html/logs/20170326/18021
18037 : 启动 "./yii default/test 2017-01-01 2030-02-01"
18038 : 启动 "./yii default/a 2016-10-01 2016-12-01"
18039 : 启动 "./yii default/b 2016-10-01 2016-12-01"
18040 : 启动 "./yii default/c 2016-10-01 2016-12-01"
18038 : 结束: ./yii default/a 2016-10-01 2016-12-01 [begin:2017-03-26 16:39:30 end:2017-03-26 16:39:30] 历时:00秒
18039 : 结束: ./yii default/b 2016-10-01 2016-12-01 [begin:2017-03-26 16:39:30 end:2017-03-26 16:39:30] 历时:00秒
18040 : 结束: ./yii default/c 2016-10-01 2016-12-01 [begin:2017-03-26 16:39:30 end:2017-03-26 16:39:30] 历时:00秒
就是说具体的命令,比如18037 : 启动 "./yii default/test 2017-01-01 2030-02-01"都是在正常终止的,但是引导脚本(即控制台中启动的命令)./yii etl/default/test 却无法自动停止才使用了析构函数。
大家都是怎么回收执行完毕的脚本的呢?