如何在php脚本中执行Java程序?

如何在php脚本中执行Java程序?,java,php,Java,Php,我正在写一个简单的网页上传脚本。 目标是使用php上传一个文件,然后调用java程序来处理该文件。 我已经完成了上传文件的工作,但无法从php脚本中成功运行java程序。 我尝试了exec(),shell\u exec(),和system(),但没有结果。 对于命令,我使用了“java Test”、“java/Test”、“/usr/bin/java/Test”,我甚至将应用程序设置为一个没有结果的jar文件。我实际使用的代码行是: echo shell_exec("java Test");

我正在写一个简单的网页上传脚本。 目标是使用php上传一个文件,然后调用java程序来处理该文件。
我已经完成了上传文件的工作,但无法从php脚本中成功运行java程序。
我尝试了
exec()
shell\u exec()
,和
system()
,但没有结果。
对于命令,我使用了“
java Test
”、“
java/Test
”、“
/usr/bin/java/Test
”,我甚至将应用程序设置为一个没有结果的jar文件。我实际使用的代码行是:

echo shell_exec("java Test");
通常没有输出。但是,如果我刚刚使用了
shell_exec(“java”)
,则会显示来自java的帮助的最后一行(“代码>显示具有指定图像的启动屏幕”),这表明命令已执行。例如,如果我使用s
hell\u exec(“whoami”)
返回“nobody”,这是正确的。java文件所做的唯一一件事就是创建一个文件,这样我就可以看到应用程序已经成功运行(如果我在命令行上运行它,应用程序就会成功运行)。我已将java文件的权限设置为777,以排除任何可能的权限错误。我已经为此挣扎了一段时间,尝试了各种各样的选项,但没有结果-文件从未创建(文件是用绝对路径创建的,所以它没有被创建,我就是找不到文件)。有人有什么想法吗


谢谢。

我真的不知道,但我来了一个跨PHP-JAVA的桥,也许它能帮上忙

更新:

我用Jasper Reports对此进行了测试,效果非常好。它允许您使用PHP扩展Java类,或者像使用PHP一样使用Java类

use java\lang\String as JString;
require_once("javabridge/java/Java.inc");

class String extends JString {
    function toString () {
        return "hello " . parent::toString();
    }
}
$str = new String("Java");
echo $str->toString();


更多示例:

这可能与exec默认使用的路径有关。调用java时,可能需要使用.class或jar文件的绝对路径显式定义类路径

我已经为此奋斗了一段时间 在尝试各种选择的同时 无结果-从未创建该文件 (该文件是使用绝对值创建的。) 所以它没有被创建,我 就是找不到文件)。有人吗 你有什么想法吗

我认为问题在于。Apache以“nobody”组(Apache用户)的形式运行,该组将执行java脚本,该脚本将尝试在光盘上的某个位置创建文件。我想它没有权限写到那个位置。您应该浏览该文件夹,以便apache用户可以写入该文件夹

==

首先,我想向您指出,从脚本调用exec()可能会导致服务器崩溃。我建议您改用redis(见下文)之类的工具

==

第二,我想我知道问题是什么。您应该首先尝试运行下面的简单示例,该示例对我很有用

==

首先确保权限设置正确。因为apache在大多数情况下都是以无人身份运行的

我自己在ubuntu上用repo安装的php做了这个简单的测试

test.java

class test {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
test.php
echo exec('java test');
运行test.php

$ php test.php
Hello World!
==

或者,您可以尝试以下一种解决方案(哪种方案更好):

  • 例如,将java程序作为Web服务编写在atmosphere spade服务器(简单/嵌入式jar)之上。这可能写得快得离谱。但在高负载情况下,我想这不是最好的选择。不过我认为这对你来说可能已经足够快了。即使这样,它也会比执行它快得多,因为运行JVM时不会有开销可能会炸毁您的服务器,速度不如exec()
  • 从(*nix)列表结构执行一个操作。这将非常容易在*nux上编写,因为java/php都有客户端库。我想速度最好,因为redis是用C写的。我自己用redis
  • 例如,使用like。由于良好的库支持,编写起来也很容易。我自己也没有用过JMS。我使用redis解决方案。我猜速度会比redis解决方案稍微慢一点
  • 
    
    前几天看到了这一点:您的java类是否在一个包中?如果是这样,您需要指定包,并且您的目录结构应该反映包。换句话说,如果您在同一目录下的命令行,您可以使用同一行手动运行java类吗?不,java类不在包中,我已经在命令行上测试了该命令,它在那里成功运行。我想到了这一点,并试图在我的帖子中通过使用“/usr/bin/java/Test”提到这一点,然而,当问题被发布时,“”被删除,只剩下“/Test”。很抱歉。+1表示您正在向其写入文件的文件夹的权限问题(即,检查用户无人对您要向其写入文件的文件夹具有写入权限)。
    $ php test.php
    Hello World!
    
    <?php
    $PATH="C:\Program Files\Java\jdk1.7.0_09\bin";
    
    echo exec("javac theNameOfYourJavaProgram.java 2>&1");//shows # of errors
    echo "<br />";
    echo exec("java theNameOfYourJavaProgram 2>&1");//this line executes it
    echo "<br />";
    echo shell_exec("javac theNameOfYourJavaProgram.java 2>&1 ");//compiles it 
    
    ?>