pcntl_signal函数未被命中,CTRL + C在使用套接字时不起作用

时间:2014-11-14 16:11:34

标签: 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_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);
}

CTRL + C不会终止应用程序或命中该功能 如果我删除pcntl_signal函数,CTRL + C会按预期杀死程序。

根据我已完成的研究,此设置应该有效。我已经在PHP 5.5和5.6中尝试过了......无法按预期工作。

1 个答案:

答案 0 :(得分:3)

<强>问题

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

<强>解决方案

使用非阻塞IO从套接字读取数据。您可以在循环中使用函数socket_select()并确保读取不会阻塞。