自定义进程/自定义指令 怎么优雅的退出

buyer

问题描述

我有一些任务是周期性执行的,并且时间比较长。当我退出的时候,我希望当前任务执行完才退出

为此你搜索到了哪些方案及不适用的原因

stop_timeout没效果 他执行完会开启下一个任务

121 2 0
2个回答

jack10082009

同问:只看见reload有平滑重启,但是没看见平滑关闭。
也遇到这个需求了,同求解答。

  • 暂无评论
buyer

写了一个小Demo感觉可以 但是还有点小问题 stop_timeout必须大于单个任务时间 reloadable必须为false 不支持reload

namespace app\process;

use support\Db;
use Workerman\Worker;

class FooProcess
{
    private bool $isExit = false;

    public function onWorkerStart()
    {
        echo "启动".PHP_EOL;
        pcntl_async_signals(true);

        pcntl_signal(SIGTERM, function (){
            echo "SIGTERM".PHP_EOL;
            $this->isExit = true;
        });
        pcntl_signal(SIGINT, function (){
            echo "SIGINT".PHP_EOL;
            $this->isExit = true;
        });

        while (!$this->isExit){
            $this->doJob();
        }

        Worker::stopAll();
    }

    private function doJob()
    {
        echo "开始执行".PHP_EOL;
        $i = 0;
        while ($i < 10){
            echo "执行中".$i.PHP_EOL;
            Db::table('demo')
                ->selectRaw('sleep(1)')
                ->get();
            $i++;
        }
        echo "执行结束".PHP_EOL;
    }
}
🔝