ネットワークを通信する場合、アプリケーションは次のような一般的なネットワークの例外に遭遇する可能性があります。
これらの問題は、プログラムの通常の運用に影響を与える可能性があり、開発者はそれらに効果的に対処する必要があります。
PHPは、ネットワーク通信の例外を処理するためのいくつかの方法を提供します。以下に、フロー制御機能とエラー制御演算子を介してこれらの例外を効果的に管理する方法について説明します。
PHPのフロー制御関数( Stream_set_timeout()など)により、接続タイムアウトのためにプログラムのutter音を避けるために、ストリームのタイムアウトを設定できます。
Stream_Socket_Client()を使用してTCP接続を確立し、 Stream_set_timeout()を介してタイムアウトを設定するサンプルコードを次に示します。
$stream = stream_socket_client('tcp://www.example.com:80', $errno, $errstr, 5);
if ($stream === false) {
echo 'ネットワークの例外:', $errstr, ' (', $errno, ')';
} else {
stream_set_timeout($stream, 5); // にタイムアウトを設定します52番
fwrite($stream, "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n");
$response = stream_get_contents($stream);
$meta = stream_get_meta_data($stream);
if ($meta['timed_out']) {
echo 'ネットワークの例外:接続タイムアウト';
} else {
echo '応答メッセージ:', $response;
}
fclose($stream);
}
この例では、最初にStream_Socket_Client()を介してTCP接続を作成し、タイムアウト制限を5秒に設定します。次に、HTTPリクエストを送信して応答を受け取ります。タイムアウトに到達するかどうかを判断するとき、 stream_get_meta_data()を使用して、タイムアウトエラーが発生するかどうかを確認します。
ネットワークの例外を処理する別の方法は、PHPのエラー制御オペレーター( @ )を使用することです。このオペレーターを通じて、開発者は特定のネットワークの例外を無視し、エラーメッセージを処理できます。
次のコードは、 @オペレーターを使用して可能な例外を処理する方法を示しています。
$stream = @stream_socket_client('tcp://www.example.com:80', $errno, $errstr, 5);
if ($stream === false) {
echo 'ネットワークの例外:', $errstr, ' (', $errno, ')';
} else {
fwrite($stream, "GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n");
$response = @stream_get_contents($stream);
if (empty($response)) {
echo 'ネットワークの例外:', error_get_last()['message'];
} else {
echo '応答メッセージ:', $response;
}
fclose($stream);
}
このコードでは、 @ operatorを使用して、 stream_socket_client()およびstream_get_contents()によって引き起こされる可能なエラーを無視します。 $ responseが空の場合、それはネットワークで例外が発生し、 error_get_last()を介してエラーメッセージを取得することを意味します。
ネットワークの例外を処理する場合、開発者は次のポイントに特別な注意を払う必要があります。
ネットワーク通信の例外は開発において一般的な問題であり、正しい例外処理方法をマスターすることが重要です。フロー制御機能とエラー制御オペレーターを使用することにより、プログラムのクラッシュまたは遅い応答を引き起こすネットワークの例外を効果的に回避できます。実際の開発では、開発者は特定のシナリオに従って適切な処理方法を選択し、プログラムの安定性を確保するためにいくつかの詳細に注意を払う必要があります。