传入信号是否在php应用程序中的流上崩溃阻塞

时间:2013-04-02 11:11:32

标签: php stream signals pcntl

我在我的代码中使用了pcntl扩展,如下所示:我将处理程序绑定到某个信号,例如SIGUSR1,并且有一个脚本将信号发送到我的应用程序。

pcntl_signal(SIGUSR1, function ($signo){
 echo 'Signal:' . $signo . PHP_EOL; 
});

我有这样的错误:

stream_get_contents(): Failure 'would block' (-9) 

此外,我还有一个ssh执行远程命令的代码(函数的一部分):

  $stream = ssh2_exec(
    $this->connection,
    $command,
    $options['pty'],
    $options['env'],
    $options['width'],
    $options['height'],
    $options['width_height_type']
  );
  if ($options['waitOut']) {
    stream_set_blocking($stream, true);

如果此处出现信号,将发生以下错误:“失败”将阻止'( - 9)“

    $output = stream_get_contents($stream);
  }
  fclose($stream);
  return $output; 

有什么方法可以避免这种情况吗?

1 个答案:

答案 0 :(得分:0)

嗯,stream_get_contents函数通常不能与unix信号一起使用。 我使用下一个代码而不是“stream_get_contents”

  $finisher = "SSH_FINISHED_COMMAND";
  $command .= " && echo \"{$finisher}\"";
  $command  = str_replace(' &&' , ' 2>&1 &&', $command);
  $stream = ssh2_exec(
      $this->connection,
      $command,
      $options['pty'],
      $options['env'],
      $options['width'],
      $options['height'],
      $options['width_height_type']
  );
  stream_set_blocking($stream, true);
  $block = false;
  $isFinished = false;
  while (! feof($stream) && ! $isFinished){
       $block = fread($stream, 256);
       $output .= $block;
       $isFinished = substr($output , -strlen($finisher)-2) == $finisher . '\n';           
  }
  $output = str_replace($finisher . "\n", '', $output);
  fclose($stream);
  return $output;