fgets()在socket_select之后返回空字符串

时间:2012-08-31 14:51:25

标签: php sockets

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

但是发送的实际内容到达时很好。

有关正在发生的事情的任何线索?

(上面的代码是伪代码,不知道实际样本是否有效,但它是一般的想法是怎么回事)

2 个答案:

答案 0 :(得分:0)

几点:

  • 您指定500毫秒的超时,但不发送输入5秒,因此选择应该真的超时并返回零。
  • 您不会检查从`stream_select()返回的错误,根据docs(信号中断,例如),它应该类似于bellow:

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

答案 1 :(得分:0)

您的代码会遇到错误情况。如果fgets失败,您仍然输出。如果套接字关闭,也许你期望stream_select失败,但事实并非如此。它只会告诉您需要检查套接字。

我明白了:

'blah'
 read from socket.''
 read from socket.''
 [... repeats]