みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPのsystem()でjava

いつも皆様、回答をありがとうございます。

PHPからsystem()でjavaを呼び出した時の動作について質問があります。

[現状]
phpファイルで
$system = "java TestHello";
system($system);
とすると、結果のメッセージが出力されません。
TestHello.javaは
public class TestHello {
public static void main(String[] args) {
System.out.println("Hello.");
}
}
です。コマンドプロンプトからjava TestHelloとするとHello.と出力されます。

[質問]
メッセージを出力させるためには何か設定が必要なのでしょうか?
それともphpからjavaを呼び出すことはできないのでしょうか?

[環境]
windows XP home
java 1.5.0_11
php 5.2.2

[その他 試したこと]
・linuxで試しましたが同じ結果でした。
・system("java -verbose TestHello"); とするとクラス名などのデバッグ情報は出力されましたが、"Hello."は出力されませんでした。
・ファイル生成をするjavaのコードをsystem()から実行しましたが、ファイルは生成されていませんでした。コマンドプロンプトから実行したところ、生成されていました。

宜しくお願い致します。

投稿日時 - 2007-05-10 23:48:56

QNo.2990160

困ってます

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

Webではなく、コマンドラインでPHPを実行してみると、
(ご存知かもしれませんが、コマンドラインでPHPを使うこともできます。)
>php test.php
おそらくphpo.iniで、safe_mode=onにしていなければ、普通にHello.と出力できると思います。

でも普通Webではできません。なぜWebではできないのか。
注意すべきなのは、コマンドを誰が実行しているかということです。
PHPがApacheのモジュールであれば、Apacheのプロセスが実行するわけですから、その権限以上のコマンドは実行できません。
普通、Apacheは、すごく弱い権限しかあたえられていませんので、
自分のドキュメントルートのファイルを作ったり、消したりする程度のことはできますが。Apacheのプロセスが、Javaコマンドを実行することはおそらく出来ないと思います。
ではもっと強い権限を与えればよいかというと、それもノーです。実験する分にはよいかもしれませんが、公開サーバでやるとセキュリティ上非常に危険なことになってしまいます。

本来、system()関数が用意されている意図としては、Webからコマンドを実行するというより、バッチ処理をPHPで書いて、OSのスケジューラに登録しておきたいときに使うのではないかと思います。

投稿日時 - 2007-05-12 03:05:23

お礼

すみません、windowsの再起動でメッセージ出力がされるようになりました。
PATHやCLASSPATHの変更をしてjavaだけを実行する分にはその変更が反映されていたものですから、windowsの再起動は必要がないと思い込んでいました。。

apacheには権限が少ししか与えられていないのですね。
メッセージは出力されるようにはなりましたが、最終的にやりたいことはファイル生成なので、権限の問題があって生成できなければphpをコマンドラインで使う方法を探ることにします。

考えられる原因を提示して下さり、そして権限についても詳しく説明してくださって本当にありがとうございました。

投稿日時 - 2007-05-12 08:13:40

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

コマンドのパスや実行したいファイルの置き場所の話ではないかと思います。

javaコマンドにパスが通っていて、"TestHello.class"が
PHPスクリプトと同じディレクトリにあれば、
system("java TestHello");
で所定の結果を得るのではないでしょうか。

投稿日時 - 2007-05-11 10:34:39

補足

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

javaコマンドには既にパスが通っていることを確認しました。
"TestHello.class"をPHPスクリプトと同じディレクトリに移動し、CLASSPATHにそのディレクトリを追加しました。
ところがまだメッセージは出力されません。

javaコマンドを絶対パスにし、"C:\Program Files\Java\jre1.5.0_11\bin\java"や"C:\\Program Files\\Java\jre1.5.0_11\\bin\\java"でも試しましたが、これでも出力されませんでした。

やはり、他に考えられる可能性などは無いでしょうか?

投稿日時 - 2007-05-11 20:51:51

あなたにオススメの質問