workerman中調(diào)用pcntl_fork 實(shí)現(xiàn)多進(jìn)程時(shí),無法回收子進(jìn)程問題
$pid = pcntl_fork();
//父進(jìn)程和子進(jìn)程都會(huì)執(zhí)行下面代碼
if ($pid == -1) {
//錯(cuò)誤處理:創(chuàng)建子進(jìn)程失敗時(shí)返回-1.
die('could not fork');
} else if ($pid) {
//父進(jìn)程會(huì)得到子進(jìn)程號(hào),所以這里是父進(jìn)程執(zhí)行的邏輯
pcntl_wait($status); //等待子進(jìn)程中斷,防止子進(jìn)程成為僵尸進(jìn)程。
} else {
//子進(jìn)程邏輯
exit()
}
如上,正常情況下 子進(jìn)程邏輯結(jié)束之后,需要手動(dòng)調(diào)用exit結(jié)束子進(jìn)程。
但是現(xiàn)在的問題是,在workerman里不能手動(dòng)調(diào)用 exit(),否則會(huì)造成整個(gè)進(jìn)程退出。
但是不調(diào)用的話,沒法手動(dòng)結(jié)束子進(jìn)程,并且會(huì)報(bào)錯(cuò):
process_timeout:
1 /home/hero/workspace/php/hero_data/vendor/workerman/workerman/Events/Select.php(261): pcntl_signal_dispatch()
2 /home/hero/workspace/php/hero_data/vendor/workerman/workerman/Worker.php(2430): Workerman\Events\Select->loop()
3 /home/hero/workspace/php/hero_data/vendor/workerman/gateway-worker/src/BusinessWorker.php(197): Workerman\Worker->run()
4 /home/hero/workspace/php/hero_data/vendor/workerman/workerman/Worker.php(1554): GatewayWorker\BusinessWorker->run()
5 /home/hero/workspace/php/hero_data/vendor/workerman/workerman/Worker.php(1384): Workerman\Worker::forkOneWorkerForLinux(Object(GatewayWorker\BusinessWorker))
6 /home/hero/workspace/php/hero_data/vendor/workerman/workerman/Worker.php(1358): Workerman\Worker::forkWorkersForLinux()
7 /home/hero/workspace/php/hero_data/vendor/workerman/workerman/Worker.php(542): Workerman\Worker::forkWorkers()
8 /home/hero/workspace/php/hero_data/application/command/SupportCenter.php(82): Workerman\Worker::runAll()
9 /home/hero/workspace/php/hero_data/thinkphp/library/think/console/Command.php(175): app\command\SupportCenter->execute(Object(think\console\Input), Object(think\console\Output))
10 /home/hero/workspace/php/hero_data/thinkphp/library/think/Console.php(675): think\console\Command->run(Object(think\console\Input), Object(think\console\Output))
11 /home/hero/workspace/php/hero_data/thinkphp/library/think/Console.php(261): think\Console->doRunCommand(Object(app\command\SupportCenter), Object(think\console\Input), Object(think\console\Output))
12 /home/hero/workspace/php/hero_data/thinkphp/library/think/Console.php(198): think\Console->doRun(Object(think\console\Input), Object(think\console\Output))
13 /home/hero/workspace/php/hero_data/thinkphp/library/think/Console.php(115): think\Console->run()
怎么解。。求助。。
1個(gè)回答
年代過于久遠(yuǎn),無法發(fā)表回答