<span><span>Warning: stream_socket_server(): unable to bind to tcp://127.0.0.1:8080 (Reason: Address already in use) in ...
</span></span>
通常、このエラーは、 Stream_Socket_Serverを使用して、他のプログラムで占有されているポートまたはアドレスにバインドしようとすると発生します。 2つの解決策があります。
ポートが占有されているかどうかを確認します。NetStat -Tuln (Linux)またはLSOF -I:8080コマンドを使用して、ポートが他のアプリケーションで占有されているかどうかを確認します。
別のポートを選択します:ポートが占有されている場合は、未使用のポートを選択するか、そのポートを占有するサービスを停止します。
<span><span>Warning: stream_socket_server(): unable to create socket resource in ...
</span></span>
このエラーは、システムの制限または許可の問題に関連している可能性があります。一般的な理由は次のとおりです。
不十分な権限: Linuxシステムでは、1024以下のポートにバインドするためにルートアクセスが必要です。解決策は、より高いポート番号を使用するか、管理者の特権でスクリプトを実行することです。
システムリソースの制限:システムは、開くべきファイル記述子の数に制限がある場合があります。 Ulimit -Nコマンドを介して現在の制限を表示し、 Ulimit -N <number>を介して制限を増やすことができます。
<span><span>Warning: stream_socket_accept(): unable to accept connection in ...
</span></span>
サーバーリソースを正常に作成したが、それでも接続を受け入れることができない場合は、次の理由である可能性があります。
ネットワーク構成の問題:バインドするアドレスとポートが正しいこと、およびネットワークが接続されていることを確認してください。ローカル開発環境の場合は、ポートをブロックするファイアウォールがないことを確認してください。
ブロッキングの問題:デフォルトでは、 Stream_Socket_Serverはブロッキング関数です。接続が発生しない場合、それは待ちます。非ブロッキングモードを使用して、この問題を回避できます。
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
</span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span></span>
このようにして、接続がない場合でも、プログラムは引き続き実行できます。
<span><span>Warning: stream_socket_accept(): connection reset by peer in ...
</span></span>
このエラーは、通常、クライアントが接続の直後に接続を閉じる、またはネットワークの障害がある場合です。あなたはそれを解決することができます:
接続の閉鎖イベントをキャプチャする:クライアント接続を処理するときは、例外を処理し、接続が閉じた後にリソースをリリースすることを確認する必要があります。
<span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$client</span></span><span>) {
</span><span><span class="hljs-comment">// 接続の処理</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>); </span><span><span class="hljs-comment">// 接続を閉じるようにしてください</span></span><span>
}
</span></span>
クライアントの安定性を確保する:エラーまたは予期しない理由により、クライアントが接続を閉じるかどうかを確認します。ネットワークパケットキャプチャツール(Wiresharkなど)を介してクライアントとサーバー間のネットワークインタラクションを表示して、ネットワークの問題をトラブルシューティングできます。
<span><span>Warning: stream_socket_recvfrom(): unable to read from socket resource in ...
</span></span>
このエラーは通常、クライアントからデータを読み取ろうとすると発生します。これは、クライアントがデータを送信していないか、接続を閉じているためです。解決策は次のとおりです。
クライアントの動作を確認する:クライアントがデータを送信し、データを送信した後に事前に接続を閉じないことを確認してください。
読み取りタイムアウトの増加:クライアントが遅かれ早かれデータを送信することを期待する場合は、読み取りタイムアウトを設定できます。
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// 102番目のタイムアウト</span></span><span>
</span></span>
<span><span>Warning: stream_socket_server(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac in ...
</span></span>
Stream_Socket_ServerでSSLを有効にすると、SSL/TLS関連エラーに遭遇する可能性があります。一般的な理由は次のとおりです。
証明書の問題:正しいSSL証明書と秘密キーファイルを提供し、ファイルパスが正しいことを確認してください。
OpenSSL構成の問題: PHPインストールにPHP構成ファイル(PHP.ini)でOpenSSL拡張機能が含まれており、SSLサポートが有効になっていることを確認してください。
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"ssl://127.0.0.1:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'ssl'</span></span><span> => [
</span><span><span class="hljs-string">'local_cert'</span></span><span> => </span><span><span class="hljs-string">'/path/to/cert.pem'</span></span><span>,
</span><span><span class="hljs-string">'local_pk'</span></span><span> => </span><span><span class="hljs-string">'/path/to/private.key'</span></span><span>,
</span><span><span class="hljs-string">'verify_peer'</span></span><span> => </span><span><span class="hljs-literal">false</span></span><span>,
]
]));
</span></span>
さらに、PHPのOpenSSLバージョンを確認して、必要な暗号化プロトコルをサポートしていることを確認することもできます。