複数のソケットをリッスンする PHP ソケット サーバーがあります。
私のクライアントでは、マシンをサスペンドすると、切断メッセージが PHP サーバーに送信されません。どのクライアントがまだ接続されているかどうかを確認したり、これらの切断イベントを取得したりするにはどうすればよいですか?
PHP では、すべてのソケットをリッスンするために socket_select を使用します。
ありがとう !
複数のソケットをリッスンする PHP ソケット サーバーがあります。
私のクライアントでは、マシンをサスペンドすると、切断メッセージが PHP サーバーに送信されません。どのクライアントがまだ接続されているかどうかを確認したり、これらの切断イベントを取得したりするにはどうすればよいですか?
PHP では、すべてのソケットをリッスンするために socket_select を使用します。
ありがとう !
リモート ソケットが適切に閉じられている場合、ソケットは読み取り可能になりますが、受信呼び出しはデータを返しません。通信にエラーがあると、次の受信または送信操作でエラーが返されます。
ただし、接続がアイドル状態になると、相手側が生きているかどうかわかりません。ソケット オプション ( SO_KEEPALIVE
) を設定して、システムが自動的に「キープアライブ」メッセージを送信し、問題があるかどうかを検出することができます。問題SO_KEEPALIVE
は、これのデフォルトのタイミングが 2 時間であることです。より短い時間が必要な場合 (ほとんどの場合)、プロトコルの一部として独自のキープアライブ メッセージングを実装することをお勧めします。
socket_read は、エラーが発生した場合は false を返し、データがない場合は空の文字列を返します。これらはイベントをトリガーしません。接続がまだ有効かどうかをテストする必要があります。