pcntl_signal回调在对象方法上设置

时间:2014-03-11 15:21:35

标签: php pcntl

我一直试图在对象方法上设置SIGTERM处理程序,但我发现了一些我不了解的东西。我们来考虑以下代码:

function _log($msg, $arr=array()){
    $str = vsprintf($msg, $arr);
    fprintf(STDERR, "$str\n");
}

class A
{
    public static $running = true;

    public function start()
    {
        while($this->run()) sleep(2);
    }

    public function run()
    {
        _log('run called');

        if( ! self::$running)
        {
            return false;
        }

        sleep(3);
        _log('run end');
        return true;
    }

    public function signal_handler($signo){
        _log("Caught a signal %d", array($signo));
        switch ($signo) {
            case SIGINT:
                A::$running = false;
                break;
            default:
                fprintf(STDERR, "Unknown signal ". $signo);
        }
    }
}

$a = new A;

if(version_compare(PHP_VERSION, "5.3.0", '<')){
    declare(ticks = 1);
}

pcntl_signal(SIGINT, array($a, "signal_handler"));

if(version_compare(PHP_VERSION, "5.3.0", '>=')){
    pcntl_signal_dispatch();
    _log("Signal dispatched");
}

//while($a->run()) sleep(2);
$a->start();

如果我调用$ a-&gt; start(),SIGTERM只会中断sleep(),但永远不会调用handler。但是,如果我尝试while($ a-&gt; run())sleep(2);,这实际上与以前相同,则调用handler并按预期停止执行。任何人都可以解释这种行为吗?

0 个答案:

没有答案