当运行线程时,在pcntl_signal中注册的函数永远不会被触发。
<?php
declare(ticks = 1);
class Task extends Thread {
public function run () {
while (1) sleep(1); // run forever
}
}
function shutdown () { // never runs :(
echo "Good bye!\n"; exit;
}
pcntl_signal(SIGTERM, 'shutdown');
$task = new Task;
$task->start();然后,在航站楼:
# kill -TERM 123当没有线程时,工作正常:
<?php
declare(ticks = 1);
class Task {
public function run () {
while (1) sleep(1); // run forever
}
}
function shutdown () {
echo "Good bye!\n"; exit;
}
pcntl_signal(SIGTERM, 'shutdown');
$task = new Task;
$task->run();如何在运行线程时发送SIGTERM时执行一些代码?我使用的是: php-5.6.7,p线程-2.0.10,debian-7
发布于 2015-07-03 00:28:25
在试图加入线程时,主线程忽略了已注册的信号。这在本质上是在$task->start()之后发生的。
你必须做两件事:
exit。至于1,您可以将主线程放在一个无休止的sleep循环中。虽然PHP是sleep,但它仍然可以对信号作出反应。
第二,您可以在kill函数中使用shutdown线程。
在代码中
$task->start()后
for (;;) {
sleep(PHP_INT_MAX);
}更改后的shutdown函数:
function shutdown ()
{
echo "Good bye!\n";
$GLOBALS['task']->kill();
exit;
}注意:不要在现实世界中使用kill。找到一种让线程自行优雅终止的方法。
适切信号
我不建议使用declare(ticks = 1),因为它不利于性能。尝试使用派遣()代替,例如,在sleep之后。
https://stackoverflow.com/questions/29711473
复制相似问题