PHPを使用してネットワーク通信関連プログラムを構築する場合、 Socket Extensionは開発者に強力な機能を提供します。 socket_create() 、 socket_bind() 、 socket_listen() 、 socket_accept()を使用して基本サーバーの例を構築する方法を学習するときに、エラー処理のメカニズムを理解することが特に重要です。この記事では、socket_clear_error()関数をチュートリアルで正しく使用して、誤判断エラーや論理的混乱を避ける方法に焦点を当てます。
socket_clear_error()関数の関数は、以前のソケットエラーをクリアすることです。この関数は、オプションのパラメーター$ソケットを渡すことができます。渡された場合、ソケットのエラーをクリアできます。渡されない場合は、グローバルな最後のソケットエラーをクリアします(通常、最新のソケット操作によって引き起こされるエラー)。
socket_clear_error(resource $socket = null): void
値を返さず、失敗時にエラーを投げません。これは、慎重に使用し、クリアするエラーの範囲とコンテキストについて明確にする必要があることを意味します。
最も基本的なソケットサーバーを構築し、 socket_clear_error()の使用を実証しましょう。
<?php
$host = '0.0.0.0';
$port = 8888;
// 作成する socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket 作成する失败: " . socket_strerror(socket_last_error()) . "\n");
}
// 残留エラーをクリアします,きれいになり始めるようにしてください
socket_clear_error($socket);
// バインド socket アドレスに移動します
if (!socket_bind($socket, $host, $port)) {
die("Socket バインド失败: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 接続を聞き始めます
if (!socket_listen($socket)) {
die("Socket リスニングが失敗しました: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "サーバーが開始されます,ポートを聞いてください {$port}...\n";
do {
$client = @socket_accept($socket);
if ($client === false) {
$error = socket_last_error($socket);
if ($error !== SOCKET_EAGAIN && $error !== SOCKET_EWOULDBLOCK) {
echo "接続を受け入れなかった: " . socket_strerror($error) . "\n";
}
socket_clear_error($socket); // クリアエラー,次のサイクルへの干渉を避けてください
continue;
}
$msg = "ようこそ m66.net テストサーバー!\n";
socket_write($client, $msg, strlen($msg));
socket_close($client);
} while (true);
socket_close($socket);
ループ構造での使用: socket_accept() 、 socket_read() 、またはその他の操作をしばらく処理する場合、または接続に連続的に耳を傾ける場合、コールが失敗した場合、 socket_clear_error()はエラーメッセージを処理した直後に呼び出して、次のコールが前のエラーを誤って報告しないようにする必要があります。
誤判定のエラーステータスを回避:PHPのsocket_last_error()は、その後のコールが成功する前に最後のエラーを返し続けることがあります。クリアしない場合、ログまたはエラー処理ロジックで古いエラーメッセージが繰り返し出力される場合があります。
socket_strerror()で使用: socket_last_error()はエラーコードを返しますが、 socket_strerror()で意味のある情報のみを取得できます。これは、デバッグまたはログ出力の場合に特に重要です。
クリアランスを乱用しないでください:実際のエラーが処理されない前に、 socket_clear_error()に電話しないでください。 「エラーを排除する」ためのショートカットではなく、エラーが処理されたことを知った後に状態をクリアするツールです。
ソケットチュートリアルを構築する場合、 socket_clear_error()は単純な機能ですが、エラー処理メカニズムにおけるその役割は非常に重要です。合理的に使用すると、ソケットサービスがより堅牢になり、エラー汚染と論理的な誤判断を回避できます。覚えておいてください:それをクリアする時が来たときにエラーをクリアし、それをクリアすることになっていないときに盲目的に呼び出さないでください。