Php pcntl#U信号功能未被命中,且CTRL+;C不';使用插座时不工作

Php pcntl#U信号功能未被命中,且CTRL+;C不';使用插座时不工作,php,pcntl,Php,Pcntl,我有一个简单的PHP脚本,我想从终端运行,并能够处理信号代码。该脚本创建TCP服务器并处理连接。不知道为什么,但我无法让信号处理工作: <?php declare(ticks = 1); // Register shutdown command. pcntl_signal(SIGINT, function ($sig) { echo 'Exiting with signal: ' . $sig; global $sock; global $client; socket_c

我有一个简单的PHP脚本,我想从终端运行,并能够处理信号代码。该脚本创建TCP服务器并处理连接。不知道为什么,但我无法让信号处理工作:

<?php
declare(ticks = 1);

// Register shutdown command.
pcntl_signal(SIGINT, function ($sig) {
  echo 'Exiting with signal: ' . $sig;
  global $sock;
  global $client;
  socket_close($sock);
  socket_close($client);
  exit(1);
});

$address = '127.0.0.1';
$port = 1234;

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port) or die('Could not bind to address.');
socket_listen($sock);

while (TRUE) {
  $client = socket_accept($sock);
  if ($client) {
    $input = socket_read($client, 1024000);
    socket_write($client, var_export($input, TRUE));
    socket_write($client, 'End of data transmission.');
    socket_close($client);
  }
  usleep(100);
}

问题

问题是您正在使用执行阻塞IO的
socket\u read()
。如果PHP挂起在阻塞IO操作中,则无法处理信号

解决方案


使用非阻塞IO从套接字读取数据。您可以在循环中使用函数
socket\u select()
和超时,以确保读取不会被阻塞。

这是有效的!我已经将我的问题更新为我正在尝试设置的真实示例。由于某种原因,它在那里不起作用。我想这可能是一般插座的问题?。。。有没有更好的设置方法?重新编辑。我将创建一个新的、更具体的问题,谢谢@好的,我想这是最好的。因为你所描述的问题非常有趣,所以它会被提升。另外,已经为您准备好了答案;)谢谢,我已将所有细节添加到问题中,这样其他人就不会感到困惑。您是否使用了
socket\u select()
?我应该举个例子吗?