2

私は自分のウェブサイトにフォームを設定しています。フォームに関する情報を電子メールで送信する PHP コードで、フォームに関する情報を印刷する Java プログラムも実行する必要があります。ここに私のPHPコードがあります

$name = $_POST['name']; 
$email_address = $_POST['email']; 
$date = $_POST['date'];
$time = $_POST['time'];
$message = $_POST['message']; 
$info = array($name, $email_address, $date, $time, $message);

exec('java -jar "C:\SomePathTo\HelloWorld.jar" $info 2>&1' , $output);`
var_dump($output);

そして私のJavaコード

public class HelloWorld {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}

私のウェブサイトがこのコードを実行すると、次の出力/エラーメッセージが表示されます

array(1) { [0]=> string(197) "Error: Unable to access jarfile C:\SomePathTo\HelloWorld.jar" }

ヘルプ!

4

1 に答える 1

3

明らかに、バックスラッシュのエスケープは問題ではありません。エラー メッセージに正しいバックスラッシュがリストされているからです。問題バックスラッシュに関するものである場合、これは当てはまりません。(バックスラッシュの特別な意味を取り除く単一引用符を使用しました。)

さらに、エラー メッセージを生成したものは何でも、それが「jarfile」を探していることを認識していることがわかります。あなたのスタックで、それは何をしますか?PHP ではありません。オペレーティング システムのカーネルではありません。どうやら、Java VM を実行するようになっているようです。それはおそらく良いことです。

Java VM が jar ファイルにアクセスできないのはなぜですか? その名前のつづりを間違えたかもしれませんが、これは非常に明白であるため、コードを再確認したときに出てきたはずです. これは、jar ファイルがホーム ディレクトリのどこか深い場所にあるために発生する可能性が高くなります (ファイル名をサニタイズしたときにエラー メッセージの長さを 197 のままにしたという事実から、「深い」と結論付けることができます)。 Java VM が読み取れません。Web サーバー経由で PHP を実行しているため、これは Web サーバーの構成によって決まりますが、「www-data」や「Internet Scripts」などの名前の専用ユーザー アカウントを使用してコードを実行するのが一般的です。 . システム上にあるものを見つける必要があります。

それが完了したら、いくつかのオプションがあります。PHP (およびこのコンテキストでは Java VM) を実行しているユーザーに、jar ファイルへの読み取りアクセスを許可できます。jar ファイルが他のファイルにアクセスしたい場合は、そのユーザー アカウントにもそれらのファイルへのアクセスを許可する必要があります。(重要なものを上書きまたは削除できないことを確認してください。) または、ユーザー コンテキストで作成したスクリプトを実行するように、Web サーバーを再構成する (または Web サーバーの管理者に依頼する) こともできます。

于 2013-11-13T22:40:05.583 に答える