全局变量/对象上的pcntl_signal(php)

时间:2017-03-09 16:40:05

标签: php signals

我正在尝试捕获一个信号(即SIGUSR1)并从一个对象调用一个函数。

class obj {
...
  public function debug() {
    var_dump($this->varfoo);
  }
}

$o = new obj();
declare(ticks = 1);
function sig_handler($signo) {
    switch ($signo) {
        case SIGUSR1:
            echo "Caught SIGUSR1...\n";
            $o->debug();
            break;
        default:
            // handle all other signals
    }
}
pcntl_signal(SIGUSR1, "sig_handler");

一旦发出信号,我就会收到一个php致命错误: 调用成员函数debug();

所以,我尝试了别的东西:

而不是:

function sig_handler($signo) {
...
}

pcntl_signal(SIGUSR1, "sig_handler");

我用过:

pcntl_signal(SIGUSR1, function ($signal, $o) {
    echo gettype($o); //this prints null, I was hoping for object
    echo "Caught SIGUSR1...\n";
    $o->debug();
});

我知道它看起来不对,但我无法弄清楚如何在信号处理程序中传递$ o。

谢谢

1 个答案:

答案 0 :(得分:1)

它通过在类中添加处理程序来实现:

class obj {
...
public function __construct() {
    ...
    pcntl_signal(SIGUSR1, function ($signal) { 
        echo "Caught SIGUSR1...\n";
        $this->debug();
    });
}

不确定这是否是最佳方式,但似乎正在发挥作用。