PHPネットワークプログラミングでは、Socketは基礎となる通信方法であり、開発者がクライアントとサーバー間のデータ交換をより柔軟に制御できるようにします。ただし、その根本的な特性のため、プログラマーは自分でリソースとエラー処理を管理する必要があります。この記事では、一般的ではあるが見過ごされがちな問題について説明します。Socket_Clear_Error ()を呼び出した後、ソケットを再独立化することを忘れた結果です。
socket_clear_error()は、最後のソケット操作で記録されたクリアエラーステータスにPHPによって提供される関数です。通常、 socket_last_error()で使用されます。これは、最後のソケット操作のエラーコードを取得するために使用されます。
使用法は次のとおりです。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "作成に失敗しました: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
}
この機能の当初の意図は、開発者が複数のソケット操作を実行するときに現在のエラーが新規であるか、以前の操作によって残されているかどうかを明確に知ることができるようにすることです。
多くの開発者は、ソケットの作成または接続障害に遭遇した後、エラーコードを習慣的にクリアし、このソケットオブジェクトを使用して、再び接続やデータの送信など、次の操作を実行し続けます。ただし、このプラクティスは、ソケットが再活性化されていない場合、一連の問題を引き起こす可能性があります。
次の例を考えてみましょう。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "作成する socket 失敗: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
}
// 再目的化するのを忘れました socket
$result = socket_connect($socket, "m66.net", 80);
if ($result === false) {
echo "连接失敗: " . socket_strerror(socket_last_error()) . PHP_EOL;
}
このシナリオでは、 socket_create()が作成に失敗した場合、 falseが返され、次のsocket_connect()は無効なリソースで動作することです。これは成功しないだけでなく、PHPに警告を投げたり、プログラムの実行を中断したりする可能性があります。
socket_connect() 、 socket_send() 、またはその他のソケット機能を呼び出すと、着信がfalseまたは破損したソケットの場合、重大なランタイムエラーが発生します。
エラーコードをクリアするが、基礎となる問題を修正しない(つまり、ソケットの無効)により、その後のエラーメッセージが混乱します。開発者は、問題のトラブルシューティング時にエラーの実際の原因を無視する場合があります。
複数のソケット操作が並行している環境では、I/Oプロセスに誤って初期化されたソケットが参加し、データを予想どおり送信できなくなる可能性があり、ビジネスロジックもエラーを引き起こします。
socket_clear_error()を呼び出してエラーコードをクリアした後、ソケットを再初期化する必要があるかどうかを確認する必要があります。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "作成に失敗しました: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
// 重新作成する socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("再次作成する socket 失敗: " . socket_strerror(socket_last_error()));
}
}
$result = socket_connect($socket, "m66.net", 80);
if ($result === false) {
echo "连接失敗: " . socket_strerror(socket_last_error()) . PHP_EOL;
}
これにより、後続の操作で無効または未定義のソケットの使用が回避されます。
socket_clear_error()は、エラー処理の精度を向上させるための補助ツールですが、ソケット自体を固定しません。実際の開発では、覚えておく必要があります。ソケットの作成が失敗または失敗したら、古いリソースを継続するのではなく、再作成する必要があります。それ以外の場合、コミュニケーションの失敗は少なくとも、最悪の場合、アプリケーション全体の論理につながり、セキュリティリスクさえ引き起こします。
適切なエラー処理とリソース管理の習慣を開発することによってのみ、堅牢で信頼性の高いPHPネットワークアプリケーションを真に記述できます。