プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

現在、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)



もし、お分かりになる方がおられましたら、ご教示お願い致します。

A 回答 (4件)

訂正: エラーハンドラ内でErrorExceptionをスローしない場合は最後に「return true;」が必要

    • good
    • 0

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

参考URL:http://php.net/manual/ja/language.exceptions.php
    • good
    • 0

PHPでは「エラー」と「例外」は区別されており、キャッチできるのは「例外」だけですね。


(Catchable Fatal Error は字のごとくキャッチ可能)

set_error_handler関数を使ってErrorをErrorExceptionに変換する方法もあります。
http://php.net/manual/ja/function.set-error-hand …
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');
}

とかすると思いますが。
    • good
    • 0

マニュアルに書かれています。



http://www.php.net/manual/ja/language.exceptions …
----- 引用ここから
PHP の内部関数の多くは エラー報告 を使っており、例外を使っているのは新しい オブジェクト指向 の拡張モジュールのみです。 しかし、ErrorException を使えば簡単にエラーを例外に変換することができます。
----- 引用ここまで

サンプルも例示されていますね。

http://www.php.net/manual/ja/class.errorexceptio …

つまり

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";
}

とすれば「例外」として捕捉できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!