- ベストアンサー
PHP4スクリプトはSYSTEMユーザで動かない?
- WindowsサーバにApache2があり、PHPでWebアプリケーションを稼動させています。サーバにはExcelがインストールされています。OLEによりWebアプリからブックを作成します。
- しかし、対象データが多いとタイムアウトになるため、Cでプログラムを作り、複数のプロセスを同時に走らせて効率化を図りました。このプログラムをコマンドプロンプトから実行すると、狙い通りに動作し、速度は改善されました。
- しかし、これをWebアプリのsystem関数で実行すると、何もせず即座に終了します。Cプログラムでログを取って、調べたところ、CreateProcessは成功していますが、PHP.exeが起動後即死しているようです。Apacheのアカウントはユーザとのインタフェースを持たないためかと思い、Cプログラムでユーザを偽装して起動してみました。しかし、PHP.exeはAdministratorアカウントで起動されるのですが、やはり起動後の即死は相変わらずです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
整理すると、 コマンドプロンプトならうまくいく (PHP4だとうまくいかない? PHP5 だとうまくいく) C program -> php.exe script.php サーバから system() で起動させると C program は実行できるが、そこから php.exe が異常終了する。 Apache -> CGI(PHP) -> php system() -> C program -> (X)php.exe script.php (X) 死亡推定箇所 常識的に考えると、 CreateProcess から PHP4 と PHP5 の非互換性問題の範囲が疑われますかね。 PHP4 があやしいことになります・・・。 ペラペラ 下位互換性のない変更点 http://www.php.net/manual/ja/migration5.cli-cgi.php >CLI と CGI > PHP 5 では、CLI および CGI のファイル名にいくつかの変更があります。 PHP 5 では、CGI版は php-cgi.exe に変更されました。 (以前は php.exe) CLI版はメインディレクトリに 置かれるようになりました。(以前は、cli/php.exe)) >PHP 5では、新しいモード php-win.exe が追加されました。 これは、CLI版と同じですが、php-win は出力を行わず、コンソールを提供しない ところが異なります。("DOS窓"は現れません。) この動作は、php-gtk に似ています。 >PHP 5では、CLI版は常にグローバル変数$argv と $argcを設定します。 整理すると PHP 4 CGI: php.exe CLI: cli/php.exe PHP 5 CLI: php.exe CGI: php-cgi.exe WIN: php-win.exe ※CLI => コマンドライン板 ・・・。 念のために確認しますが、このややこしいファイル名の変更には対応していますか? 何となく、 PHP4 のときも php.exe (CGI) を参照しているとかってオチが脳裏をよぎったので・・・。 PHP4のときは、 cli/php.exe (CLI) を参照しているか確認してみてください。 もし、「そんなところは、とっくに確認済み」でしたらコマンドプロンプトで実行したコマンド(どこの php.exe を実行したのかが分かるように絶対パス指定で起動したもの)と結果の関係を一度、提示してください。 C program -> PHP4_HOME/php.exe の結果: [NG になるべき。] C program -> PHP4_HOME/cli/php.exe の結果: [OK になるべき] C program -> PHP5_HOME/php.exe の結果: [OK になるべき] ええ、今回も私はドキュメント以外何も確認していませんので、誤りがあるかも知れません。実際の環境で確認をしてみてください。
その他の回答 (1)
- OrangeCup150
- ベストアンサー率62% (109/174)
・タイムアウト設定の見直し 下記のサイトが参考になると思います。 http://kikky.net/pc/php_timeout.html ・system関数が使用できるか検証 セーフモードを無効に設定しているか確認する safe_mode_exec_dir string PHPがセーフモードで動作する場合、system()や その他のプログラム実行関数を、 このディレクトリ以外で起動することは拒否されます。 Windowsを含む全ての環境において ディレクトリのセパレータとして/を使用する必要があります。 http://www.php.net/manual/ja/ini.sect.safe-mode.php#ini.safe-mode-exec-dir ※ページ上部に、「PHP 5.4.0 で削除されました。」がいっぱいです。 まあ、常識的に考えてsystem関数はセキュリティの対象になります。 たとえば、不正侵入者がsystem関数を実行するPHPスクリプトをサーバに勝手に置いただけで好き放題できるようになりますから。使えない方が当たり前です。 なお、私はPHPについてはあまりくわしくありませんので、誤りがあるかも知れません。実際の環境で確認をしてみてください。
お礼
回答ありがとうございます。 アカウントを偽装するため、Cプログラムを 噛ませてあります。このプログラム自体は 実行されます。 このプログラムはsystem()で起動します。 ここから先でPHP.exeを起動すると落ちます。
お礼
回答ありがとうございます。 >何となく、 PHP4 のときも php.exe (CGI) を参照しているとかってオチが脳裏をよぎったので・・・。 なるほど、確かにCLI/PHP.EXEではない方を 実行しています。 ただ、コマンドプロンプトからも絶対パス指定で メインディレクトリのPHP.EXEを実行しています。 とりあえず、CLI/PHP.EXEの方を試してみます。
補足
CLI/PHP.EXEを使ったところ期待通りの 結果を得ることができました。 とても勉強になりました。 ありがとうございました。