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

我试图在我的php代码的后端运行Jar文件。但我没有得到所需的输出到它。有一个jar文件,在后台运行,并返回任何关键字和域的网页排名给定到它。 我附上的代码,请给我任何解决scheme,因为当我在terminal上运行它,它是给出正确的输出。

代码如下:

<?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.Please帮我摆脱这个混乱…

Solutions Collecting From Web of "如何通过PHP代码运行一个shell命令?"

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

鉴于你正在调用java 。 我敢打赌,输出是显示在Java控制台,而不是在shell中,PHP可以拉文本信息。

如何解决这个困境?

那么你可以把结果写到一个文件中,如果你有java源文件修改,然后通过php读取这个文件来得到结果。 这里碰撞的可能性会很好。 另一种选择是让Java连接到你的MySQL数据库(如果有的话),然后运行java,然后查询数据库中的响应。 当然,你需要通过Java的方式来输入数据来插入一个你可以识别的记录(某种类型的散列),我从来没有用Java做过,只是一个理论,你可能能够这样做

更新

你可能想要尝试darko petreski建议的标准输出作为另一种选择。

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

我要检查/更改的第一件事是你正在从这个构建$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变量。