PHPのexec()でフリーズします

WinXp32+apache2.2.13+php5.3.0でWEB画面を運用しています。
PHPのexec()でコマンド(コンソール)プログラムを起動していますが、ごくたまにexec()から返らない(?)問題が発生します。この時WEB画面はフリーズして操作できず、Windowsのプロセスには"cmd.exe"が残ったままになります。コードは以下です。
$dmy = exec(XXX_EXE . ' ' . $command, $output, $return_var);
(XXX_EXE:コマンド(コンソール)プログラムのフルパス、$commandにパラメータを設定)
似たような事を経験された方、何か情報をお持ちの方はいませんでしょうか?
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/04/26 11:51:05
  • 終了:2012/05/03 11:55:03

回答(1件)

id:TransFreeBSD No.1

TransFreeBSD回答回数667ベストアンサー獲得回数2682012/04/26 14:32:12

呼び出したコンソールプログラムが入力待ちかなにかで終了しないためだと思います。
http://www.php.net/manual/ja/function.exec.php

注意:
プログラムがこの関数で始まる場合、 バックグラウンドで処理を続けさせるには、 プログラムの出力をファイルや別の出力ストリームにリダイレクトする必要があります。 そうしないと、プログラムが実行を終えるまで PHP はハングしてしまいます。

本質的には、そのように子プロセスが止まってしまう条件を排除して、必ず終了するようにすべきですが、予防的には

  1. 子プロセスの終了までブロックしないように、popenやproc_openを使い、異常時は子プロセスを強制終了できるようにする。
  2. set_time_limitなどで強制終了させるか、または強制終了するようにラップする。

などが考えられます。

id:y199201

ご回答ありがとうございます。
コマンドプロンプト(cmd.exe)は残りますが、コンソールプログラム(XXX_EXE=hoge.exe)自体は終了してプロセスには残っていません。通常は問題ないですがたまにこのようになります。
本質的な処理についてはもっともだと思います。予防策も参考にさせていただきます。

2012/04/26 16:34:32
  • id:studiocherry
    Windows XP を サーバー用途で、使用する場合に 長期間再起動しないため、使用可能メモリが少なくなり、Windows のメモリ不足で、外部コマンドが、異常終了した際に cmd.exe が、残るのを経験したことがありますが...

    うちの環境では、それ以外の原因での発生は、いまのところ起きていないです。
    参考になればいいのですが...

  • id:y199201
    コメントありがとうございす。
    なるほど、Windows側ですか。そちらからのアプローチもしてみます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません