2

被信号中断时是否可以跳出循环?当我运行以下代码时,如果我在循环的第一次迭代期间发送 SIGINT,则会调用信号处理程序,但随后我又回到了循环中。我想处理信号,然后跳过循环的其余部分(不退出脚本)。

<?php
  declare(ticks = 1);

  function sig_handler($signo) {
    switch($signo) {
      case SIGINT:
        echo 'SIGINT' . PHP_EOL;
        break;
      default:
    }
  }

  pcntl_signal(SIGINT, 'sig_handler');

  $vars = array('foo', 'bar', 'baz');
  foreach ($vars as $var) {
    echo $var . PHP_EOL;
    sleep(3);
  }

  // Do other stuff
?>

输出(每次睡眠时按 ctrl+C):

$ php foreach_test.php
foo
SIGINT
bar
SIGINT
baz
SIGINT
4

1 回答 1

0

从它的外观来看,你的“break”语句打破了“switch”,而不是循环。而是这样说:

if ($signo == SIGINT){
    echo 'SIGINT' . PHP_EOL;
    break;
}
于 2013-12-06T16:10:28.407 回答