質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7387閲覧

php.exeプロセスが終了しない

xxhiroxx_chan

総合スコア41

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2015/10/23 07:17

xxhiroxx_chanと申します。

以下のバッチファイルで5分毎にphpで書かれた処理を実行しているのですが、
php.exeプロセスが終了せず、どんどん増えていきました。
原因と、今後の対応について、教えてください。
C:\php\php.exe -f "phpファイル名"

環境は以下です。
Windows Server 2008 R2 64bit OS
Apache 2.221 (Win32)
PHP 5.2.17

先日、あるタイミングで、エラーを補足するコードが書かれていない場所でエラーが出てexitできませんでした。
その後、5分毎に実行→同じエラーが発生して、そのたびにphp.exe等のプロセスが発生して、累積していったようです。
つまり、エラーが発生した後、正常終了したときやexitできたときのようにphp.exeプロセスが落ちなかったということです。

この結果サーバの動作が不安定になり、イベントビューアよりメモリ不足(Windowsは仮想メモリの不足状態を診断しました。)を確認し、サーバ再起動することで解決しました。

なお、エラーの原因は、別のDBサーバとの接続が出来なくなり、ODBC接続に失敗したことが原因でした。

そこでお聞きしたいのですが、
(1)エラーを補足しなかった場所(=exitを明記しなかった場所)でエラーが起こったためphp.exeプロセスが終了しなかった、というのは正しい解釈なのでしょうか?
(2)php.iniの設定等によりエラー捕捉できなくてもphp.exeを強制的に終了する方法、または例えば、VBで使われるon error go to ・・・のようにどこでエラーが起こっても処理をある場所に飛ばす方法、などにより、今回のようなことを回避できないでしょうか?

以上よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

xxhiroxx_chanさん

(1)エラーを補足しなかった場所(=exitを明記しなかった場所)でエラーが起こったためphp.exeプロセスが終了しなかった、というのは正しい解釈なのでしょうか?

PHPでスクリプト実行が停止するような致命的エラーの発生時は強制終了されます。
ですので、終了しなかったのは別問題(例えば、無限ループ、ODBC接続終了の無限待ち)ではないかと推察されます。
もし指定時間内でプログラムを終了させなければならないのでしたら、以下の手段があります。
set_time_limit 関数

(2)php.iniの設定等によりエラー捕捉できなくてもphp.exeを強制的に終了する方法、または例えば、VBで使われるon error go to ・・・のようにどこでエラーが起こっても処理をある場所に飛ばす方法、などにより、今回のようなことを回避できないでしょうか?

PHPにはエラー/例外それぞれを取得できるよう、以下のようなハンドラがあります。
set_error_handler 関数
set_exception_handler 関数

PHP

1 function custom_error_handler($errno, $errmsg, $errfile, $errline, $errcontext) { 2 # エラーログ処理 3 # ・エラーコード:$errno 4 # ・メッセージ :$errmsg 5 # ・対象ファイル:$errfile 6 # ・対象行番号 :$errline 7 # ・オプション :$errcontext 8 } 9 function custom_exception_handler($exception) { 10 # エラーログ処理 11 # ・例外コード :$exception->getCode() 12 # ・メッセージ :$exception->getMessage() 13 # ・対象ファイル:$exception->getFile() 14 # ・対象行番号 :$exception->getLine() 15 # ・例外クラス名:get_class($exception) 16 } 17 set_error_handler("custom_error_handler"); 18 set_exception_handler("custom_exception_handler");

また、PHPではエラーレベルが非常に高い(いわゆる致命的なエラー)場合にスクリプトが強制終了する為、上記2つの関数でキャッチする事ができません。
この場合には以下のハンドラを使ってPHP終了を検知して処理する必要があります。
register_shutdown_function 関数
上記で設定された関数は強制終了時にも実行されますので、
error_get_last 関数
を使ってE_PARSE等の高レベルエラーを判定して処理させる事が可能です。

PHP

1function custom_error_checker() { 2 $error = error_get_last(); 3 if ($error["type"] == E_PARSE || 4 $error["type"] == E_ERROR || 5 $error["type"] == E_CORE_ERROR || 6 $error["type"] == E_CORE_WARNING || 7 $error["type"] == E_COMPILE_ERROR || 8 $error["type"] == E_COMPILE_WARNING) { 9 # エラーログ等の処理 10 # : 11 } 12} 13register_shutdown_function("custom_error_checker");

投稿2015/10/23 08:15

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxhiroxx_chan

2015/12/07 06:18

お礼が大変遅くなり申し訳ありませんでした。 頂いたアドバイスを参考にエラーを補足し、解決することができました。 ありがとうございました。
guest

0

こちらのサイト
PHPにfinallyはないけどデストラクタがあるよ
に記載されているデスクトラクタを使用してみてはいかがでしょうか?

投稿2015/10/23 07:34

Alice0225

総合スコア206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxhiroxx_chan

2015/12/07 06:19

お礼が遅くなり申し訳ありませんでした。 アドバイス頂きありがとうございました。 今後もよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問