- 締切済み
fsockopenの例外について
お世話になります。 現在、fsockopen関数を利用してソケット通信を行うシステムを開発しております。 上記、システムを利用する中で考えられる例外として「apacheが停止しているサーバーに通信を行った場合」というのを想定して、例外処理を作成しております。 例外処理をtry catchによって検知しようとしたのですが、try catchでは受け取れませんでした。 ソースは下記のとおりです。 $api_url = "http://localhost/webapp/test"; $api_arr = parse_url($api_url); try{ // ソケット通信開始 $fp = fsockopen($api_arr["host"], 80, $errno, $errstr, 30 ); }catch(ErrorException $e){ echo "Error - failed to connect to the API - ".$e->getMessage(); exit; }catch(Exception $e){ echo "hoge2"; } 上記、ソースをunixのコマンドから実行した場合に出力されたエラーは下記のとおりです。 Error: fsockopen(): unable to connect to localhost:80 (Connection refused) もし、お分かりになる方がおられましたら、ご教示お願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
訂正: エラーハンドラ内でErrorExceptionをスローしない場合は最後に「return true;」が必要
- cheese014
- ベストアンサー率85% (12/14)
fsockopen() は例外を投げてはくれませんので、自前で例外を投げてやる必要があります。 ※↓超手抜きなコードなので適宜修正してください。 try { if (!$sock = stream_socket_client(略)) { throw new Exception(略); } } catch (Exception $e){ _err($e); } のように書いて、_err() で受け取ってから処理するような流れにすると、見通しの良いコードになると思います。 fsockopen() や stream_socket_client() は、エラー時に E_WARNING レベルのエラーを出しますので、@fsockopen() としてエラーを抑制して、自前でエラー処理を書くと良いでしょう。 環境に依存しますが、cURLも有用だと思います。ご参考までに。 http://jp2.php.net/manual/ja/ref.curl.php
PHPでは「エラー」と「例外」は区別されており、キャッチできるのは「例外」だけですね。 (Catchable Fatal Error は字のごとくキャッチ可能) set_error_handler関数を使ってErrorをErrorExceptionに変換する方法もあります。 http://php.net/manual/ja/function.set-error-handler.php http://php.net/manual/ja/class.errorexception.php E_NOTICEを除外したければ set_error_handler (function ($errno, $errstr, $errfile, $errline) { throw new ErrorException($errstr, $errno, 0, $errfile, $errline); }, E_ALL ^ E_NOTICE); とか。 私なら単純に $fp = @fsockopen(…); if (!$fp) { throw new RuntimeException('Failed to connect to the API'); } とかすると思いますが。
- shimix
- ベストアンサー率54% (865/1590)
マニュアルに書かれています。 http://www.php.net/manual/ja/language.exceptions.php ----- 引用ここから PHP の内部関数の多くは エラー報告 を使っており、例外を使っているのは新しい オブジェクト指向 の拡張モジュールのみです。 しかし、ErrorException を使えば簡単にエラーを例外に変換することができます。 ----- 引用ここまで サンプルも例示されていますね。 http://www.php.net/manual/ja/class.errorexception.php つまり function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, $errno, 0, $errfile, $errline); } set_error_handler("exception_error_handler"); を設定しておいてから try{ $fp = fsockopen($api_arr["host"], 80, $errno, $errstr, 30 );} catch (ErrorException $e) { echo "Error - failed to connect to the API - ".$e->getMessage(); exit; } catch(Exception $e) { echo "hoge2"; } とすれば「例外」として捕捉できます。