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

时间:2010-09-10 12:52:59

标签: java php linux

我正在尝试在我的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:找不到命令

但正如我已经说过的,我一直在使用相同的命令通过SSH来运行Java命令。所以没有可能没有在服务器上安装JAVA。请帮我摆脱这个混乱... < / p>

4 个答案:

答案 0 :(得分:3)

如果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路径。

答案 1 :(得分:0)

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

如何解决这个难题?

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

<强>更新

您可能还需要按照darko petreski的建议尝试标准输出作为另一种选择。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我要检查/更改的第一件事是函数中您从中构建$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变量。