お世話になります。
現在、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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
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
No.2
- 回答日時:
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');
}
とかすると思いますが。
No.1
- 回答日時:
マニュアルに書かれています。
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";
}
とすれば「例外」として捕捉できます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース AWSドメイン名でApacheテスト・ページを表示させる方法を教えて下さい。 1 2023/04/26 15:59
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- 英語 分離不定詞 1 2023/07/16 17:29
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォントの色を変えるには?
-
PHP8を使うと、大量のWarningが...
-
PHPで、エラーがない場合のみ画...
-
ワードプレスサイト PHP8.0.25...
-
phpでPEAR::DBを使っているので...
-
PHPで特定のURLにジャンプす...
-
awsにApacheとPHPを入れて、何...
-
パースエラーとは?
-
PHP 文字列を代入した配列を変...
-
php5.6でsimplexml_load_string...
-
「@$変数」の「@の意味は?」
-
windows環境でphpのfopenが使用...
-
php pear mdb2に質問です。
-
最小公倍数をPHPで求めるには
-
これは例外処理でしょうか?
-
onedrive にexcelファイルをア...
-
バッチを用いたフォルダの自動移動
-
phpとaspの違いについて
-
form actionで二つ送信先を指定...
-
phpで画像がどうしても文字化け...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP8を使うと、大量のWarningが...
-
フォントの色を変えるには?
-
ワードプレスサイト PHP8.0.25...
-
トランザクションが原因?DBに...
-
PHPでfatal errorが出ても無視...
-
PHPでネットワークドライブのop...
-
「@$変数」の「@の意味は?」
-
パースエラーとは?
-
PHPで特定のURLにジャンプす...
-
正規表現での最後尾のバックス...
-
phpでクラスのメソッドで同名の...
-
error_reporting(0);にも関わら...
-
PHPで、エラーがない場合のみ画...
-
php7のhtmlentitiesはEUC-JPを...
-
phpのrenameでエラーが出ます
-
phpでget_headers()が使えない?
-
メールアドレスにメールが届い...
-
phpのエラー(T_LNUMBER)について
-
urlの直接入力を防ぐには
-
これは例外処理でしょうか?
おすすめ情報