2

我对套接字有一个相当特殊的问题。设置的基础是一个用​​ 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 秒内没有。

不过,发送过来的实际内容很好。

关于发生了什么的任何线索?

(上面的代码是伪代码,不知道实际示例是否有效,但这是发生了什么的大体思路)

4

2 回答 2

0

几点:

  • 您指定超时 500 毫秒,但不发送输入 5 秒,所以选择应该真的超时并返回零。
  • 您不检查从 中返回的错误,根据文档(信号中断,例如)`stream_select(),这应该类似于下面的内容:

    if (false === ($num_changed_streams = stream_select(...

于 2012-08-31T15:11:31.203 回答
0

您的代码通过错误条件吹。如果fgets失败,你仍然输出。如果套接字关闭,您可能希望stream_select失败,但它不会。它只会告诉您需要检查套接字。

我得到:

'blah'
 read from socket.''
 read from socket.''
 [... repeats]
于 2012-08-31T15:12:33.330 回答