0

在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 却无法自动停止才使用了析构函数。

大家都是怎么回收执行完毕的脚本的呢?

广训 328
2017-03-26 提问
0 个回答

撰写答案

推广链接