人に聞けない痔の悩み、これでスッキリ >>

バッチファイルを使って、サーバーにインストールを起動させようとしています。

が、PHPのexec関数が動きません。
バッチファイルを開こうとすると固まってしまいます。


xxx.bat
----------------------
cd C:\Program Files\xxx
setup.exe
----------------------

xxx.php
------------------------------
$cmd = "cmd.exe /c start xxx.bat";
exec( $cmd );
------------------------------

Windowsサーバー2003 R2
Apache2.2

お手数ですが、どなたかご教示下さい。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>権限の問題なのでしょうか?


権限の問題じゃないのかな
dirはcmd.exeが持ってるんだっけ?(ちょっと良く覚えてない)
実行しようとしているコマンド(?)がphp側からの起動(webアクセスだからeveryoneあたり?)に対して拒否されてるだけなんじゃないのかな
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

一つ下の階層からディレクトリに権限をつけてみました。
Evryone → フルコントロール
exec( 'xxx.txt' );
を実行しましたが動きませんでした。

匿名のアクセスに使用する IUSR アカウントが、既定で Guests グループのメンバに設定されているらしいので、
Guests → フルコントロール
に。

しかし、開くことはできませんでした。

権限の設定方法が違うのでしょうか。。。。

お礼日時:2008/03/26 20:59

QNo.3895760 から引用


> バッチファイルを開こうとすると固まってしまいます。
> setup.exe

この「setup.exe」はウィンドウを持つアプリケーション(GUI)なのでしょうか?

> Windowsサーバー2003 R2
> Apache2.2

ANo.1 の補足から引用
> 画面が固まります。

実行環境からすると、この"固まります"と仰っているのはブラウザの画面でしょうか?

※ 以下は「setup.exe」がウィンドウを持つ GUI アプリケーションでありブラウザで開いていると仮定して
  記述していますので、異なるのであればご容赦下さい。

そうであるとすると、基本的に標準出力にデータを吐き出して即時終了するようなアプリケーションしか
呼び出すべきではないと思われます。

言い替えるとウィンドウを持つプログラムを実行すればプロセスだけが残り、最悪はタスクマネージャからも
終了できないような状態になると思われます。

Windows Server 2003 R2 にローカルログインされてタスクマネージャなどでプロセスが残っていないか
確認されてはいかがでしょうか?

# ただし GUI でもインタラクティブな操作を必要とせずに、処理が即時終了するようなものであれば、
# 動作(おそらくブラウザには何の表示も出ませんが)するのかもしれません。

この回答への補足

ご回答ありがとうございます。

>画面が固まります。
これは、setup.exeを起動させる為にPHPを実行しているブラウザが固まるということです。

setup.phpは、GUIアプリケーションではなく、
データの出力が終了したら即事終了するアプリケーションです。

実際、PHPで呼び出しはしていてもサーバー側では何も動いていないので、プロセス自体発生していない状況です。

補足日時:2008/03/27 09:24
    • good
    • 0
この回答へのお礼

やはり権限の問題だったようです。

IISのインストール、インターネットゲストアカウント(IUSR)への権限付与によって動くようになりました。

ご回答頂いた皆様、どうもありがとうございました。

お礼日時:2008/03/27 14:20

exec関数は危険な関数ですから、デフォルトで実行禁止になっていませんか?


具体的には、php.iniファイルに次のような定義がないか確認することです。


disable_functions = "exec, shell_exec, suexec"

これはexec, shell_exec, suexecを実行禁止にした設定例です。

>バッチファイルを開こうとすると固まってしまいます。
この際に出るログを見れば、もっとよく分かると思います。

また、いきなり自作のバッチを実行するのではなく、もっと簡単なコマンド(例えばdir でファイルリストを取得するとか)を使った例を試してはいかがでしょう。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

pup.iniを確認したところ、「disable_functions」は何も設定されていませんでした。

dirにするとファイルリストが返ってきますので動いていないわけではないようです。

例えば、xxx.phpのファイルと同じディレクトリにxxx.txtをおいて

exec('xxx.txt');

とするとやはり画面が固まります。
固まって、そのままなので、ログに反映もされません。

exec('cmd.exe /c start');
この場合、コマンドの起動自体していないようです。

権限の問題なのでしょうか?
外部からのアクセスが許可されていないとか。。。

ちなみに
管理>サービス>Apache2.2 では、「デスクトップとの対話サービスに許可」にチェックをいれています。

お手数ですが宜しくお願いします。

お礼日時:2008/03/26 13:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qexec()で他ディレクトリのexeプログラムを実行したい

url2bmpという、指定したURLのスクリーンショットを作成できるコマンドライン対応のソフトを使用しています。これをPHPから実行させたく、exec()関数を使っています。PHPプログラムとexeプログラムは同じ階層にあり、コードは

exec("url2bmp.exe 以下、引数");

のようにしており、問題なく動作していました。
その後、url2bmp.exeを1階層下のフォルダに移し、コードも修正したのですが、動かなくなってしまいました。コードは以下の通りで

exec("kasou/url2bmp.exe 以下、引数");

ディレクトリ指定は間違っていないはずであり、原因は明らかにurl2bmp.exeがPHPプログラムと同じディレクトリにないことなのですが、これの対処法は存在しないのでしょうか?同じコードをコマンドプロンプトで実行するとうまくいくのに、exec()関数では動かないという点に納得がいきません。

Aベストアンサー

ディレクトリのセパレータは、OSによってちがいます。
大ざっぱにいえば、Windowsでなら \ で、UNIXなら /です。

ただし、WindowsのPHP上では、 パスを / でセパレートして記述してもよいように、PHP側の処理側で吸収されてます。

しかし、PHPのexec関数は、外部コマンドを呼び出すシステムコールですから、
PHPの管理外となり、OSのネイティブな機能を使うことになりますので
そのOSでの方言を考慮して、記述する必要があります。

たとえば、Windows(というかDOSというか)では、/ はセパレータでなく、コマンドの オプション指定と解釈され、
dir/w としたら、dirディレクトリのしたのwコマンドを実行するという意味ではなく、
dirコマンドに対して、w というオプションを指定したという意味になります。


人気Q&Aランキング