3

テキストのみのUnixドメインソケットを介してローカルCサーバープログラムに接続するPHPクライアントがあります。ただし、正常にシャットダウンできる唯一の方法は、次のコマンドでソケットセッションを終了することです。

stream_socket_shutdown($sock, 1); // shutdown socket writing
usleep(500 * 1000);           // wait for 0.5 seconds
fclose($sock);                // actually close the socket (finally)

Cクライアントのように正常にシャットダウンしたい:-

shutdown(connection_fd, SHUT_WR);     // tell server we've stopped sending queries
// Read from the socket until poll(connection_fd) yields POLLRDHUP / POLLHUP / POLLERR / POLLNVAL
shutdown(connection_fd, SHUT_RDWR);   // tell connection we've stopped listening
close(connection_fd);                 // close the whole connection (finally)

ただし、PHPには直接ソケットpoll()に相当するものがないようです。PHPにローカルソケットを正常にシャットダウンさせるにはどうすればよいですか?

4

1 に答える 1

5

stream_set_blocking()を試しましたか? ストリームを非ブロッキングに設定すると、接続を閉じる前に保留中のデータをすべて消費できるはずです。

socket_shutdown($sock, STREAM_SHUT_WR); 
stream_set_blocking($sock, 0);
while( fgets($sock) !== false ) { ; }
fclose($sock);

編集:定数を使用し、正しい値を使用するように set-blocking コマンドを修正しました。

説明:ストリームをノンブロッキングに設定し、そこからすべてを読み取ることにより、入力バッファーに既にあるすべてのデータを消費します。これにより、ピアにバッファがクリアされ、より多くのメッセージ (FIN パケットなど) を送信できることが通知されるため、シャットダウン プロセスが大幅に高速化されます。

シャットダウンが遅くなる可能性は依然としてありますが、その可能性ははるかに低くなります。

于 2012-11-08T21:01:49.880 に答える