PHP4スクリプトはSYSTEMユーザで動かない?

このQ&Aのポイント
  • WindowsサーバにApache2があり、PHPでWebアプリケーションを稼動させています。サーバにはExcelがインストールされています。OLEによりWebアプリからブックを作成します。
  • しかし、対象データが多いとタイムアウトになるため、Cでプログラムを作り、複数のプロセスを同時に走らせて効率化を図りました。このプログラムをコマンドプロンプトから実行すると、狙い通りに動作し、速度は改善されました。
  • しかし、これをWebアプリのsystem関数で実行すると、何もせず即座に終了します。Cプログラムでログを取って、調べたところ、CreateProcessは成功していますが、PHP.exeが起動後即死しているようです。Apacheのアカウントはユーザとのインタフェースを持たないためかと思い、Cプログラムでユーザを偽装して起動してみました。しかし、PHP.exeはAdministratorアカウントで起動されるのですが、やはり起動後の即死は相変わらずです。
回答を見る
  • ベストアンサー

PHP4スクリプトはSYSTEMユーザで動かない?

WindowsサーバにApache2があり、PHPで Webアプリケーションを稼動させています。 サーバにはExcelがインストールされてい ます。OLEによりWebアプリからブックを 作成します。 しかし、対象データが多いとタイムアウトに なるため、Cでプログラムを作り、複数の プロセスを同時に走らせて効率化を図り ました。このプログラムをコマンドプロンプト から実行すると、狙い通りに動作し、速度は 改善されました。しかし、これをWebアプリの system関数で実行すると、何もせず即座に 終了します。Cプログラムでログを取って、 調べたところ、CreateProcessは成功して いますが、PHP.exeが起動後即死している ようです。Apacheのアカウントはユーザとの インタフェースを持たないためかと思い、 Cプログラムでユーザを偽装して起動して みました。しかし、PHP.exeはAdministrator アカウントで起動されるのですが、やはり 起動後の即死は相変わらずです。 これをPHP5のPHP.exeで実行すると正常に 動作しました。但し、実際に稼動する環境で PHP5が入る保証はありません。 PHP4では解決できないとなれば、掛け合う 余地はありますが、ダメという論拠が必要に なります。 WebアプリからPHPスクリプトを実行する方法 あるいは実行できない理由をご存知の方は ご教授くださると有り難く存じます。

  • nda23
  • お礼率90% (39/43)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 になるべき] ええ、今回も私はドキュメント以外何も確認していませんので、誤りがあるかも知れません。実際の環境で確認をしてみてください。

nda23
質問者

お礼

回答ありがとうございます。 >何となく、 PHP4 のときも php.exe (CGI) を参照しているとかってオチが脳裏をよぎったので・・・。 なるほど、確かにCLI/PHP.EXEではない方を 実行しています。 ただ、コマンドプロンプトからも絶対パス指定で メインディレクトリのPHP.EXEを実行しています。 とりあえず、CLI/PHP.EXEの方を試してみます。

nda23
質問者

補足

CLI/PHP.EXEを使ったところ期待通りの 結果を得ることができました。 とても勉強になりました。 ありがとうございました。

その他の回答 (1)

回答No.1

・タイムアウト設定の見直し 下記のサイトが参考になると思います。 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についてはあまりくわしくありませんので、誤りがあるかも知れません。実際の環境で確認をしてみてください。

nda23
質問者

お礼

回答ありがとうございます。 アカウントを偽装するため、Cプログラムを 噛ませてあります。このプログラム自体は 実行されます。 このプログラムはsystem()で起動します。 ここから先でPHP.exeを起動すると落ちます。

関連するQ&A

  • PHPでのsystem関数の処理ができないです。

    PHPでsystem関数を使ってアプリケーションを実行するだけの 簡単なプログラムを作ったのですが、 ブラウザでPHPのページが開き終わって 処理は全て終わった状態になるのですが、 アプリケーションが全く起動しません。 PHPのプログラムは以下の通りです。 ************************************************ <html><head> <title>アプリケーション起動</title> </head><body> <?php $user_cmd = "C:\phpdev5\www\himekuri\Himekuri.exe"; $cmd = escapeshellarg($user_cmd); system($cmd); ?> </body></html> ************************************************ $user_cmdで指定したアドレスにあるHimekuri.exeという アプリケーションを起動しようとしています。 開発環境は OS:Windows2000 phpdev5(MySQL,Apache)を使用 といった感じです。 system関数を使用するのに何か設定などがいるのでしょうか? 分かる方ご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHP5の設定が上手く行かない

    WindowsXP HomeEdition上でApache2.2.4とPHP5の設定をしているのですが、エラーになってしまってApacheを起動できません。 ちなみにActivePerlとApacheでは動作確認が取れています。 Googleで「インストール PHP5」と入れて表示する設定方法は3~4件試しました。 起動時にコマンドプロンプトに表示されるエラーメッセージは httpd.exe: Syntax error on line 115 of C:/Program Files/Apache Software Foundation/Apache2.2/conf/httpd.conf: Cannot load C:/php/php5apache.dll into server: \x8ew\x92\xe.......... というものです。 httpd.confの該当行には確かに LoadModule php5_module C:/php/php5apache2.dll という記述があり、C:/phpにはphp5apache2.dllが存在しています。 検索で引っかかったどの方法を試してもそこで躓いてしまいます。 Perlの設定が邪魔をしているとか、何か考えられることがあるでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • phpをWEBサーバー上で実行できない

    現在,WEBサーバー上でコンタクトフォームを作り,PHPでメールに送信したり, ありがとうページにうつるプログラムを書いています。 内部サーバーで構築した時には,問題なく作動したのですが, WEBサーバーにうつしたところ 動かなくなってしまい,困っています。 具体的には, phpの内容がテキスト形式で表示されるだけで実行されません。 Apacheの設定かと思い,Apacheに設定したところ, ダウンロードを要求されるようになってしまいました。 ちなみに,OSは Scientific Linux release 6.1 (Carbon) です。 フォルダや,実行ファイルの権限は755に変更しています。 Apacheには, http://www.adminweb.jp/apache/php/ を参考にして情報を入れてみたのですが, 1.Windowsでないので,モジュールが無い(もしくは見つけられなかっただけ?) 2.PHPIniDir "c:/php"に従って,php.iniがある"/etc"を入力するとエラーが出ます。 ちなみに内部サーバーではApacheに設定をしなくても動作をしていました。 内部サーバーのOSはRed Hat Linux release 6.2 (Zoot)です。 もしかしたらOSの違いもあるのかと思ったのですが,そんなことはありうるのでしょうか。 原因となるような手がかりを教えていただければ幸いです。 よろしくお願いします。

    • 締切済み
    • PHP
  • php or shellでのユーザ変更について

    phpからShellを呼び出すプログラムを作っています。 OSはApacheを使用しているので、 phpを起動した際「Apache」というユーザになっているようなのですが、 shell起動時に別のユーザに変更をしたいと思っています。 パスワードをshellの中に記述して、うまくユーザ変更をしたいのですがうまくいきません。 phpもしくは、shell内で、ユーザ変更を行なうにはどのようにすればよいでしょうか? もしくは、Apacheユーザのパスワードが分かれば、別の方法で回避できそうなのですが、ご存知の方はいますでしょうか? 大変困っているので、よろしくお願いします。

    • 締切済み
    • PHP
  • 拡張子がhtmlでもphpスクリプト実行したい

    webサーバがApacheの、レンタルサーバーでホームページを作っております。フレームの代わりにphpのincludeを使ってメニュー等を表示しています。しかし最終的に表示されるページの拡張子がphpでないと、きちんと表示されません。拡張子がhtmlでもphpスクリプトが実行されるようにしたくて、色々調べていたのですが、それらしき方法を発見しました。 Apacheで言えばhttpd.confの AddType application/x-httpd-php .php というところを例えば AddType application/x-httpd-php .php .html にするだけで、*.phpでも*.htmlなファイルであってもそこに埋め込まれているPHPスクリプトは実行されるようになる。 …とあったのですが、何をどう加えるか、もしくは変えればいいのかサッパリです。 もっとこっちの方が簡単だ、など、詳しい方いらっしゃいましたら、どうか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • phpからツールを起動する際の権限

    phpからexeを起動するとエラーとなり、権限の問題かと睨んでいるのですが対処法が分かりません。 windows server上でapache2.2.14、PHP5.2.6を使用しています。 phpのexec関数を使用してバックアップツールを起動するとツールがファイルのコピーに失敗して正常終了できません。 phpを使わず、エクスプローラから直にexeを起動すると正常終了します。 ツールはc++で作っており、CopyFile関数にてエラーが発生。 悪戦苦闘中ですが、あれこれいじってみても以下のいずれかのエラーとなり正常終了となりません。 「ネットワーク名が見つかりません。」 「アクセスが拒否されました。」 調べる中で、phpから起動するとapacheユーザの権限で云々といった情報がネットで見つかり、さては権限が怪しいかと思っているのですが、知識不足で何をどうすれば良いのか分かりません。 ダメ元でhttpd.exeのプロパティを開き、「管理者としてこのプログラムを実行する」のチェックボックスをONにしてapacheを再起動してみましたが状況に変化がありませんでした。 問題の原因や対処法、権限の設定についてなど、何か分かることがあれば教えていただけないでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • IIS 5.2 上での PHP 5.3.5 の実行

    下記サイトを参考にサーバー(OS: MS Small Business Server & IIS 5.2) に PHP 5.3.5をインストールしました。 http://network.station.ez-net.jp/server/microsoft/windows/2008/iis7_php535.asp Command Line で PHP -v と入力すると正常にバージョンが返ってくるので PHP のインストールそのものは正常に終わったと考えていますが、 PHP の実行が出来ません。 例えば中身が <?php phpinfo(); ?> という内容のテストプログラムを他の cgiプログラムと同じフォルダに置き、ブラウザでアクセスしても動作しないのです。 IIS: WEB サイト→プロパティ→ホームディレクトリ→構成 の 拡張子 .php の設定は "C:\Program.Files\PHP\php-cgi.exe" としました。勿論 exe ファイルは上記パスで指定したフォルダに存在します。 XAMPP というパッケージソフトを使用し、PCのLocal Hostをサーバーに見立てて PHPを実行する事は出来ます。 この環境で作成した PHP をサーバー上で稼動させ、外部に公開したいのです。 初歩的なところで躓いているのだと思います。 PHPに詳しい方、教えて下さい

  • PHP(Windows)でコマンド実行

    Windows上のapacheとPHPで、ベーシック認証のIDとパスワードを登録する仕組みを作成しているのですが、execが思ったように動きません。 以下にその部分だけを実行できるものを書きます。 <?php $com="C:\\Program Files\\xampp\\apache\\bin\\htpasswd.exe C:\\Program Files\\xampp\\apache\\.htpasswd id pass"; //$com="\"C:\\Program Files\\xampp\\apache\\bin\\htpasswd.exe\" \"C:\\Program Files\\xampp\\apache\\.htpasswd\" id pass"; //$com="dir"; exec($com,$output); print_r($output); ?> 原因はなんとなく、プログラムとパスワードファイルのパスの中にあるスペース(Program Files)だと思い、二重引用符で囲ってみたりした(一つ目のコメントのように)のですが、結果は同じでした。 二つ目のコメントのようなdirコマンドはちゃんと動きます。 どのようにすれば、パスを指定した実行ファイルが動作するのでしょうか?

    • 締切済み
    • PHP
  • PHPのユーザと権限

    apacheのモジュールとして実行するPHPを実行させるユーザを指定する方法か、PHPでファイルを新規作成した時に、そのファイルの所有者を指定する方法を教えてください。 apacheの設定ファイルかPHPの設定ファイルで何とかできませんか?

    • 締切済み
    • PHP
  • system関数

    以下のように、phpでsystem関数を用いて $command = "php4 -q <ファイル名>.php"; system($command); コマンドラインからプログラムを実行していたんですが、ファイルを別サーバに移動させたところ、 実行できなくなりました。 双方ともphpのバージョンは4.0.6、 コマンドラインからphpを実行できるように設定されています。 変わった点はapacheのuserがnobodyから 他の名前に変更されています。 やはり、実行できないのはapacheのuserが変更されたのが 原因なのでしょうか? もし、そうならばどのように対処すればよいのでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう