2

ソケットに関してはかなり特殊な問題があります。セットアップの基礎は、PHP で書かれた forking ソケット サーバーです。(私は知っています、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 秒間入力を送信しないため、select は実際にタイムアウトしてゼロを返す必要があります。
  • から返されたエラーをチェックしません。ドキュメント`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 に答える