PHP exec()不能正常工作

我有PHP的exec()函数的困难。 它似乎不是要调用某些function。 例如,代码echo exec('ls'); 不产生任何输出(它应该,目录中有文件)。 这是我的一个问题,主要原因是我试图执行一个PHP的exec()调用.jar。

据我所知我正在调用Java程序,但我没有得到任何的输出。 .jar可以从服务器上的命令行执行。 (为了logging,这是一个Apache服务器)。

我的php的.jar执行如下所示:

 $output = array(); exec('java -jar testJava.jar', $output); print_r($output); 

我所得到的这个exec()调用的输出是Array()

exec()执行'whoami''pwd'已经成功了。 我不明白为什么有些function正在工作,有些则不是。 我也不是PHP中最有经验的人,所以我不太确定如何诊断问题。 任何和所有的帮助,将不胜感激。

您无法执行ls的原因是因为权限。

如果您以用户A的身份运行Web服务器,则只能选择对用户A具有权限的那些目录。

您可以更改目录的权限,也可以通过更改httpd.conf文件(假设您使用的是Apache)来更改运行服务器的用户。

如果您要更改目录的权限,请确保您更改父目录的权限。

要更改Web服务器用户,请按照以下步骤操作:

打开以下文件:

 vi /etc/httpd/conf/httpd.conf 

搜索

 User apache Group apache 

更改用户和组名称。 更改用户和组后,使用以下命令重新启动服务器。

 /sbin/service httpd restart 

那么你将能够执行所有可以由该用户运行的命令。

编辑:

“用户”应该是httpd.conf中的非root用户。 默认情况下,Apache以root身份运行时不提供页面。 您必须将用户设置为非root用户,否则您将会遇到错误。 如果你想强制Apache以root身份运行,那么你必须设置一个环境变量如下:

 env CFLAGS=-DBIG_SECURITY_HOLE 

然后你必须重建Apache,然后才能以root身份运行它。

我有一个解决方案:命令从控制台运行,但不是从通过exec / system / passthru的PHP运行。 问题是通往命令的路径。 它与命令的绝对路径一起工作

以便:

 wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf" 

变为:

 /usr/local/bin/wkhtmltopdf "htm1Eufn7.htm" "pdfIZrNcb.pdf" 

现在,它是从PHP通过执行命令二进制您可以通过whereis wkhtmltopdf看到

我发现这个问题 – SELinux阻止PHP访问某些功能。 把SELinux放到宽松模式已经解决了这个问题(尽管我宁愿不必离开SELinux进入宽松模式;我宁愿找到允许某些功能的方法)。

你的问题不是执行问题,而是exec命令的语法。 第二个参数总是以数组的形式返回,并在每个索引中包含一行输出。 exec函数的返回值将包含命令输出的最后一行。 要显示您可以使用的输出:

foreach($ output as $ line)echo“$ line \ n”;

有关详细信息,请参阅http://php.net/manual/en/function.exec.php 。 你也可以用第三个参数获得命令的退出值。