Closed fanybook closed 5 years ago
// swoole_timer_tick(1000, function() {
while (true) {
if (!$this->queueWorkerPids) {
$this->createQueueWorker();
} else {
foreach ($this->queueWorkerPids as $idx => $pid) {
$current_time = date('H:i:s');
if (\Swoole\Process::kill($pid, 0)) {
echo "PID[{$pid}] is alived({$current_time}).\n";
} else {
echo "PID[{$pid}] is died.\n";
unset($this->queueWorkerPids[$idx]);
$this->createQueueWorker($idx);
}
}
}
sleep(1);
}
// });
改成死循环,创建的孙程序就没问题
swoole_timer_tick(1000, function() {
echo '2333333';
});
// swoole_timer_tick(1000, function() {
while (true) {
if (!$this->queueWorkerPids) {
$this->createQueueWorker();
} else {
foreach ($this->queueWorkerPids as $idx => $pid) {
$current_time = date('H:i:s');
if (\Swoole\Process::kill($pid, 0)) {
echo "PID[{$pid}] is alived({$current_time}).\n";
} else {
echo "PID[{$pid}] is died.\n";
unset($this->queueWorkerPids[$idx]);
$this->createQueueWorker($idx);
}
}
}
sleep(1);
}
// });
在死循环外,加timer,创建出孙程序也变成僵尸
请使用协程模式
<?php
go(function() {
while(1)
{
co::sleep(1);
var_dump(co::exec("ps aux"));
}
});
swoole_event_wait();
懂了 👍
timer 本身是个子进程,托管在manager下。 看官方文档,好像说 start会清除父进程的 timer,但是我这个timer可以一直打印log,但是孙进程创建出来就是僵尸(它的父进程是这个timer进程,而timer进程没死)
说明:创建孙进程时无报错,成功返回pid。孙进程里的 exec 不会有错,跟它没关,写什么都这样。