我有一个想要从终端运行的简单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中进行了尝试...无法按预期工作。
问题
问题是您正在使用socket_read()
哪个执行阻塞IO。如果PHP处于阻塞的IO操作中,则无法处理信号。
解决方案
使用非阻塞IO从套接字读取数据。您可以socket_select()
在循环中将函数与超时一起使用,以确保不会阻塞读取。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句