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 回答