2

私の Web サイトでは、バックグラウンドで Java プログラムを実行するために PHP が必要です。そのため、PHP はexec()メソッドを発行して Java にすべての作業を任せます。実装は Windows では問題なく動作しますが、Ubuntu では完全に失敗しました。動作しませexec()んが、コンソールを使用したスタンドアロン テストは問題なく動作します。

test.php問題を絞り込むためにセットアップしました:

<?php
$output = exec("java -cp ~/path/to/java/class/file/folder Hello 2>&1");
//$output = exec("whoami");
echo $output;
?>


Hello.java単純です:

public class Hello {
   public static void main(String[] args) {
      System.out.println("Hello, world!");
   }
}


test.phplocalhost で実行すると、次のように表示されます。

Error: Could not find or load main class Hello


エラーの原因を絞り込んでみましたが、次のように考えました。

  1. exec()apache-user が期待どおりに出力される

    ため、それ自体に問題があります。whoami

  2. エラー メッセージの意味:

    このエラーについて検索しました。this oneのような投稿は、 classpathがないことが原因です。コンソールでは機能するため、私にとってもそうではありません。したがって、エラーメッセージは何も意味しません (そうですか?)

  3. ユーザー/グループの許可:

    apache-user がクラス ファイルの実行を許可されていない可能性はありますか?
    確認したところ、 の許可コードはHello.classでありrw-r--r--、所有者は であることがわかりましたapache-user:webmasters
    ただし、誰もxファイルのアクセス許可を持っていなくても、コンソールで (自分のユーザーを使用して) 実行できます。
    ここの状況はよくわかりません。しかし、私の理解では、Javaプログラムを実行することで、実際にそれをJVM実行しています(または他の何か)。したがって、の許可は関係ありHello.classません。


    別の投稿に同様の状況があることがわかりました。しかし、その解決策 - Java bin へのフルパスを指定する/usr/bin/java- はうまくいきません...


エラーの原因は何ですか?

誰でも助けることができますか?詳細な解決策は大歓迎です!初心者です@_@

よろしくお願いします!!!

4

3 に答える 3

0

私は問題を解決しました...それはかなり予想外です。

クラスパスを変更しました。

以前は のようなもの~/myproject/to/java/class/file/folderです。そして、私はそれをに変更しました/home/myuser/myproject/to/java/class/file/folder

~しかし、表記法が で機能しない理由がまったくわかりませんexec()

于 2012-12-16T10:25:33.420 に答える
0

試しましたjava -cp /path/to/folder/containing/class/file Hello 2>&1か?クラスファイル自体をクラスパスにするべきではないようです。クラスパスにあるはずです。一方、これが .jar ファイルの場合は、クラスパスにファイル名を指定します。

于 2012-12-16T09:39:38.843 に答える
0

パスと Hello.java ファイルを解放します。

次のコマンドを使用して、apache ユーザーの権限をテストします。

sudo -u webmasters java -cp /path/to/java/class/file/folder Hello

chmod a+r Hello.class
于 2012-12-16T09:50:54.577 に答える