// 开始运行进程
$process->start();
// 进程回调
$process->on('start',function(){
$timeout = 10;
pcntl_async_signals(true);
while (true) {
pcntl_signal(SIGALRM, function () {
posix_kill(getmypid(), SIGKILL);
});
pcntl_alarm($timeout);
// handle your job
}
});
其中超时的实现是使用 pcntl_async_signals
结合 pcntl_alarm
。pcntl_alarm
多次设置,后面的会覆盖前面的设置,所以不用担心在 while 循环中重复实现。
参考源码: vendor/laravel/framework/src/Illuminate/Queue/Worker.php
文章:https://segmentfault.com/a/1190000010224426