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」ステートメントはループではなく「スイッチ」を壊します。代わりに次のように言います。

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