• ベストアンサー

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()から実行しましたが、ファイルは生成されていませんでした。コマンドプロンプトから実行したところ、生成されていました。 宜しくお願い致します。

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
回答No.2

Webではなく、コマンドラインでPHPを実行してみると、 (ご存知かもしれませんが、コマンドラインでPHPを使うこともできます。) >php test.php おそらくphpo.iniで、safe_mode=onにしていなければ、普通にHello.と出力できると思います。 でも普通Webではできません。なぜWebではできないのか。 注意すべきなのは、コマンドを誰が実行しているかということです。 PHPがApacheのモジュールであれば、Apacheのプロセスが実行するわけですから、その権限以上のコマンドは実行できません。 普通、Apacheは、すごく弱い権限しかあたえられていませんので、 自分のドキュメントルートのファイルを作ったり、消したりする程度のことはできますが。Apacheのプロセスが、Javaコマンドを実行することはおそらく出来ないと思います。 ではもっと強い権限を与えればよいかというと、それもノーです。実験する分にはよいかもしれませんが、公開サーバでやるとセキュリティ上非常に危険なことになってしまいます。 本来、system()関数が用意されている意図としては、Webからコマンドを実行するというより、バッチ処理をPHPで書いて、OSのスケジューラに登録しておきたいときに使うのではないかと思います。

satsukima
質問者

お礼

すみません、windowsの再起動でメッセージ出力がされるようになりました。 PATHやCLASSPATHの変更をしてjavaだけを実行する分にはその変更が反映されていたものですから、windowsの再起動は必要がないと思い込んでいました。。 apacheには権限が少ししか与えられていないのですね。 メッセージは出力されるようにはなりましたが、最終的にやりたいことはファイル生成なので、権限の問題があって生成できなければphpをコマンドラインで使う方法を探ることにします。 考えられる原因を提示して下さり、そして権限についても詳しく説明してくださって本当にありがとうございました。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

コマンドのパスや実行したいファイルの置き場所の話ではないかと思います。 javaコマンドにパスが通っていて、"TestHello.class"が PHPスクリプトと同じディレクトリにあれば、 system("java TestHello"); で所定の結果を得るのではないでしょうか。

satsukima
質問者

補足

早速の回答ありがとうございます。 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"でも試しましたが、これでも出力されませんでした。 やはり、他に考えられる可能性などは無いでしょうか?

関連するQ&A

  • systemについて

    Perlからsystemを使ってjavaを呼び出し、ブラウザに表示させようとしているのですがうまくいきません。バッククオートを用いても効果がないようです。 この問題を解決するにはどうすればよいのでしょうか? プログラムの中身は次のようになっています ***Hello.java*** class Hello{ public static void main(String args[]){ System.out.println("Hello World."); } } ***perlのよびだし部分*** $iti = system("java Hello"); print "\$iti = ", $iti,"<br>"; $ni = `java Hello`; print "\$ni = ", $ni, "<br>"; ***実行結果*** $iti = -1 $ni = (なにも表示されない)

    • ベストアンサー
    • Perl
  • JAVA

    コマンドプロンプトで C:\java>Hello.java などのコマンドを実行すると Hello.javaのテキストが開かれて、実行できないのですが。。 どうしたら直るんでしょうか??

    • ベストアンサー
    • Java
  • "java" が実行できません("java.exe" は実行できる)

    先日 J2SDK 5.0 Update 6 をインストールした際、 この問題に遭遇しました。 PATH も CLASSPATH も正常に設定されています。 しかし、"java" が実行できません。 ところが、"java.exe" とすると実行できます。 これはいったいどういうことなのでしょうか? 以下にいくつかの実行例を載せます。 OS は Windows XP SP1 です。 [実行例] C:\>java [結果] 'java' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 となるのですが、.exe をつけると以下のように Usage が表示されます。 [実行例] C:\>java.exe [結果] Usage: java [-options] class [args...] (to execute a class) 以下、絶対パス指定した場合も同じ結果です。 [実行例] C:\java\jdk1.5.0_06\bin\java [結果] 'C:\java\jdk1.5.0_06\bin\java' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 [実行例] C:\java\jdk1.5.0_06\bin\java.exe [結果] Usage: java [-options] class [args...] (to execute a class)

  • 簡単なプログラムhello worldが実行できない。(初心者)

    java VMとjava 2 SDKをインストールすれば良いと調べて分かったのでそれらを済ませました。そしてコマンドプロンプトを開いて ・「cd c:\java」と入力してjavaフォルダへ移動(\は半角の¥) ・「C:\java>javac hello.java」と入力。 すると、 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と表示されました。どういう意味なのでしょうか? そして解決方法を教えてもらえませんか? ついでに、hello.javaの内容は下記です。 class Print{   public static void main(String[] args){     System.out.println("Hello World!");   } }

    • ベストアンサー
    • Java
  • システム環境変数で設定したJAVAと違うバージョンのJAVAが動いています。

    超初心者です。コマンドプロンプトでJAVA -versionと入力したところ、システム環境変数のJAVA_HOMEやPATHで設定してあるJAVAとは違うバージョンのものが動いているようです。どうしてなのでしょうか?教えて下さい。

  • php5でjavacを含むシェルの実行ができない

    こんにちは。シェル、php5初心者です。 まずはそれぞれのソースを記します。 j.sh ~~~~~~~~~~~~~~~~~~~~~~ #!/bin/bash javac Hello.java java Hello ~~~~~~~~~~~~~~~~~~~~~~ Hello.java ~~~~~~~~~~~~~~~~~~~~~~ public class Hello { public static void main(String[] args) { System.out.println("Hello, World"); } } ~~~~~~~~~~~~~~~~~~~~~~ test.php ~~~~~~~~~~~~~~~~~~~~~~ <?php $output = shell_exec('./j.sh'); echo "<pre>$output</pre>"; ?> ~~~~~~~~~~~~~~~~~~~~~~ 以上のプログラムを使用しtest.phpを実行したときにshell_exec関数によってWebブラウザ上にHello,Worldと表示させたいのですが、コンパイルすらされていないみたいです。どうしたらよいでしょうか。 端末から./j.shのようにシェルを実行するとしっかりとHello,Worldと結果が返ってくるのですが。 ちなみにjavacを含まないシェル(ls -l,cpなど)はphpから実行できました。 どうかよろしくお願いします。 os vine linux 4.3

    • 締切済み
    • PHP
  • Javaでコンパイルできなくなりました

    javaでコンパイルできなくなりました。今まではJava2 SDK バージョン1.4.2_03をインストールしてコマンドプロンプトからjavac、javaコマンドを用いコンパイル、実行していました。 そして、Eclipse(バーション3.0)というIDE環境に興味を持ちインストールした後にとりあえずもう一度コマンドプロンプトからjavacコンパイルしてみたらエラーがでるようになりました。 ソースを書くと長くなってしまうので簡単に説明すると、String sに"Hello World"を代入してSystem.out.println()で表示させるだけのプログラムです。Eclipseをインストールする前は実行できたのでソースに問題があるという事はありません。エラーメッセージは以下のような感じでした //エラーメッセージ 検出値 : java.lang.String 期待値 : String String s = "Hello World"; その後にソースで String s="Hello World";としていた行を java.lang.String s = "Hello World";に変更しました するとjavacではエラーが出なくなるのですがjavaコマンドで実行すると Exception in thread "main" java.lang.NoSuchMethodError: main というメッセージが出て実行できないです。 環境変数は、SDKインストール後、PATHC:\j2sdk1.4.2_03\bin;を加え、Eclipseインストール後は何も変更していません。 何が問題なのでしょうか?お願いします。

    • ベストアンサー
    • Java
  • JAVA環境にインストールについて(JAVA初心者です。)

    JAVA環境にインストールについて(JAVA初心者です。) ・JAVAでの開発が必要になったため、JAVA(SE)をインストールしました。 ・PATH等を設定 ・コマンドプロンプトからjavac -version を実行してバージョンが表示するのを確認しました。 次に、JDK内のdemoのapplets内のdemoを実行してみたのですが実行できませんでした。 まだ何かインストールするものが必要ですか? あと、JAVA SE と JAVA EEの違いはなんですか? なにぶん、JAVA生まれて初めてやるもので、上司から本を渡され、本を見て悪戦苦闘してます。 (その上司もJAVA全然知らなく、すべて私に押し付けています。) 何か参考になるHP等ありましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • コマンドプロンプトに文字を表示

    コマンドプロンプトに文字を表示したいと思っています。 public class Print { public static void main(String[] args) { System.out.println("test"); } } とソースを作り、 Print.java java Print とコマンドプロンプトより実行すると、"test"と予想通りに表示されます。 しかし、eclipsより「Print.jar」とjarファイルを作成して、コマンドプロンプトより実行すると表示されません。 C:\>Print.jar C:\> jarファイルよりコマンドプロンプトに文字を出力する事は出来るのでしょうか。 batファイルを作成して、 java Print と入力して実行するしかないでしょうか。 要はバッチ処理中に処理経過を表示したいのです。

  • VScode Java 文字化け。

    public static void main(String[] args){ if(args.length<3){ System.out.println("引数が足りません"); }else{ System.out.println(args[0]); //1番目の引数 System.out.println(args[1]); //2番目の引数 System.out.println(args[2]); //3番目の引数 } } } C:\Java>javac ArgsTestB.java C:\Java>java ArgsTestB 蠑墓焚縺瑚カウ繧翫∪縺帙s 実行が文字化けします。 何故でしょうか? ご多忙のところ恐れ入ります。 ご回答お待ち申し上げております。 ご回答 Windowsのコマンド・プロンプトのデフォルト・エンコードはShift_JIS系のCP932(Windows-31J)です、UTF-8を使うと文字化けします、Shift_JIS系のCP932(Windows-31J)でセーブして下さい。 VScodeでやっているのですが、CP932(Windows-31J)がエンコードで 見つかりません。 shiftjisでやると文字化けします。 どうしたら文字化けしないでしょうか・・・? ご多忙のところ恐れ入ります。 ご回答お待ち申し上げております。

    • ベストアンサー
    • Java

専門家に質問してみよう