有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何通过PHP代码运行shell命令?

我试图在php代码的后端运行一个Jar文件。但我没有得到它想要的输出。有一个jar文件在后台运行,并返回给定给它的任何关键字和域的页面排名。 我附上代码,请给我任何解决方案,因为当我在终端上运行它时,它给出了正确的输出

以下是代码:

    <?php
set_time_limit(0);
function returnJarPath()
{
    $jarPath = $_SERVER['DOCUMENT_ROOT'] . "myFolder/tools_new/includes/Rank.jar";
    return $jarPath;
}
$jar = returnJarPath();
$command = "java -jar $jar aspdotnet/microsoft.com";//Passing the Argument to the Jar file.


$shellOutput = shell_exec($command);
    print "The Shell Output is : " ; var_dump($shellOutput);print "<br />";
exec($command,$executeCommmand);
    print "The Exec returns the value : " ; var_dump($executeCommmand);print "<br />";
passthru($command,$passthruCommand);
    print "The Passthru returns the value : " . $passthruCommand. "<br />";
?>

我刚刚查看了apache的错误日志,发现的最后一个错误是:

sh: java: command not found

但正如我已经说过的,我一直在通过SSH使用相同的命令来运行Java命令。所以不可能不在服务器上安装JAVA。请帮我摆脱困境


共 (4) 个答案

  1. # 1 楼答案

    如果jar文件写入标准输出,则可以使用exec

    下面是我如何使用它的一个例子:

    may be first: exec("cd jar dir"); // if jar fine needs to be executed from the same dir
    $output = exec("/usr/bin/java -jar $jar aspdotnet/microsoft.com");
    

    但正如你所说:

    sh: java: command not found
    

    这意味着从php到java没有路径别名。只需使用可执行文件/usr/bin/java的完整java路径

  2. # 2 楼答案

    鉴于您正在呼叫java。我敢打赌,输出显示在Java控制台中,而不是在shell中,PHP可以在shell中提取文本信息

    如何解决这个困境

    如果有java源代码需要修改,可以将结果写入文件,然后通过php读取该文件以获得结果。这里发生碰撞的可能性很大。另一个选项是让Java连接到MySQL数据库(如果有),然后运行Java,然后查询数据库以获得响应。当然,您需要向Java传递一种方法,让它输入数据,以插入一个您可以识别的记录(某种哈希),我在Java中从来没有这样做过,只是一个关于您如何能够做到这一点的理论

    更新

    您可能还想尝试darko petreski建议的标准输出作为另一个选项

  3. # 3 楼答案

    如果PHP代码要在服务器上执行(而不是通过命令行),那么运行java可执行文件的用户是www数据,而不是您。在这种情况下,请确保www数据具有读取jar文件和执行java可执行文件的权限

  4. # 4 楼答案

    我要检查/更改的第一件事是函数中的一行,在该行中,您将根据以下内容构建$jarPath变量:

    $jarPath = $_SERVER['DOCUMENT_ROOT'] . "myFolder/tools_new/includes/Rank.jar";
    

    为此:

    $jarPath = $_SERVER['DOCUMENT_ROOT'] . "/myFolder/tools_new/includes/Rank.jar";
    

    尾随斜杠可能不在$_SERVER['DOCUMENT_ROOT']中,这可能会导致问题

    我假设,当您说它从控制台运行时,您正在运行java命令,如下所示:

    $ java -jar /rest/of/path/myFolder/tools_new/includes/Rank.jar aspdotnet/microsoft.com
    

    我会确保在$command变量中包含java二进制文件的路径,如下所示

    $command = "/path/to/java -jar $jar aspdotnet/microsoft.com";
    

    拥有web服务器进程的用户可能没有包含Java二进制文件路径的$PATH变量