套接字我有一个特殊的问题。设置的基础是一个用PHP编写的分叉套接字服务器。 (我知道,PHP,嘘等等)
这是一个非常基本的代码示例......
$controlSockets = stream_socket_pair();
$pid = pcntl_fork();
if($pid == -1)
throw new Exception("Fork error");
else if($pid) {
fclose($controlSockets[0]);
while(true) {
$read = array($controlSockets[1]);
$write = array();
$except = array();
// Sleep for half a second if there's nothing to read
while(stream_select($read, $write, $except, 0, 500000) > 0) {
$r = fgets($controlSockets[1]);
echo "'$r'\n read from socket."; // This outputs ''
}
// Re-set the read array as stream_select alters the array
$read = array($controlSockets[1]);
}
} else {
fclose($controlSockets[1]);
// do some work ...
sleep(5);
// end of work ...
$result = 'blah';
fputs($controlSockets[0], $result);
exit;
}
现在,问题在于即使套接字包含在读集合中,但是它返回一个空字符串,据我所知,它应该永远不会发生,除非达到了feof,或者实际上有一些内容。 执行的前5秒没有。
但是发送的实际内容到达时很好。
有关正在发生的事情的任何线索?
(上面的代码是伪代码,不知道实际样本是否有效,但它是一般的想法是怎么回事)
答案 0 :(得分:0)
几点:
您不会检查从`stream_select()
返回的错误,根据docs(信号中断,例如),它应该类似于bellow:
if (false === ($num_changed_streams = stream_select(...
答案 1 :(得分:0)
您的代码会遇到错误情况。如果fgets
失败,您仍然输出。如果套接字关闭,也许你期望stream_select
失败,但事实并非如此。它只会告诉您需要检查套接字。
我明白了:
'blah'
read from socket.''
read from socket.''
[... repeats]