1

运行线程时,使用 注册的函数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、pthreads-2.0.10、debian-7

4

1 回答 1

0

您的主线程在尝试加入线程时忽略了注册信号。这基本上是之后发生的事情$task->start()

你必须做两件事:

  1. 找到一种方法让你的主线程对信号做出反应。
  2. 停止线程执行,因此它不会阻塞exit

至于1,您可以将主线程置于无限sleep循环中。当 PHPsleep运行时,它仍然可以对信号做出反应。

2,你可以kill在你的shutdown函数中使用线程。

在代码中

之后$task->start()

for (;;) {
    sleep(PHP_INT_MAX);
}

改变的shutdown功能:

function shutdown ()
{
    echo "Good bye!\n";
    $GLOBALS['task']->kill();
    exit;
}

注意:不要kill在现实世界中使用。找到一种方法让线程自行优雅地终止。

适当的信号

我不建议使用declare(ticks = 1),这对性能不利。尝试使用pcntl_signal_dispatch()代替,sleep例如。

于 2015-07-03T00:28:25.183 回答