人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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にパラメータを設定)
似たような事を経験された方、何か情報をお持ちの方はいませんでしょうか?
よろしくお願いします。


●質問者: y199201
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● TransFreeBSD

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

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

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

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

などが考えられます。


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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ