gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:14:08 25 4
gpt4 key购买 nike

我有一个简单的 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 中尝试过...无法按预期工作。

最佳答案

问题

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

解决方案

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

关于php - pcntl_signal 函数未被命中,使用套接字时 CTRL+C 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26934216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com