为什么我可以在命令行中执行命令,但不能通过PHP exec()函数执行?

5

好的,

我做了一些创造性的搜索,但似乎遇到了瓶颈。

我正在尝试使用 Linux 程序 "sox"。 我想从我的 PHP 脚本中调用它。 如果我在命令行中使用该命令,则脚本可以正常工作。 但是,当我使用 PHP exec 时,它不起作用。

例如:

sox file1.mp3 file2.mp3 tempfile.mp3 -V3

“V3”指定详细输出。

在命令行中以“用户X”或root身份执行时,我能够创建新文件。但是,当我以以下命令执行时:

<?php
exec('sox file1.mp3 file2.mp3 tempfile.mp3  -V3', $output);
foreach($output as $line){
print $line;
}

它没有生成新文件。此外,应该返回命令结果的数组为空。

我已经用简单的文本进行了测试。

exec(ls,$output);

我通过使用PHP命令get_current_user()获取到了根目录的内容。

然而,当我使用Linux命令whoami时,发现它将当前用户视为“apache”。我需要给apache使用该程序的权限吗?

我将继续在网上搜索并进行尝试来找出我的错误。感谢任何帮助。

澄清

  • 我不在安全模式下(我已经检查过phpinfo()页面)

好的,这里的要点是1)你需要指定sox的完整路径而不是只输入“sox”,2)执行脚本的用户(apache)需要有权限访问输出文件夹。 - Scott
3个回答

4

通常这是路径问题。你尝试调用的应用程序可能不在Web服务器用户帐户的搜索路径中。我只使用完整路径从PHP调用应用程序。我将该路径存储在设置文件中,以便在任何系统上都可以使用。


那么这里的解决方法是定位整个目录结构中程序的路径,然后调用它?但是“正常”的命令行会查找程序的位置或以某种方式知道吗?如果我的问题听起来很傻,请原谅我。我正在出于必要学习Linux。 - Scott
看起来可以用“which”命令完成,我会试一下。 - Scott
1
每个Linux上的shell账户都有一个典型命令行应用程序的搜索路径(例如/usr/bin)。通常,Web服务器账户的搜索路径为空。我不会让PHP找到该应用程序,而是在某个地方硬编码路径(例如exec('/usr/local/sox/bin/sox file1...)。对于我的Web应用程序,我使用每个服务器的设置文件,并且每个文件都会包含该特定系统上sox的路径。 - Matt S
好的,我找到了完整路径,但它并没有解决问题。我将命令复制到带有完整路径的命令行中,它确实起作用了。所以看来,我对Linux有了一些了解,但这并不能单独解决问题! - Scott
你觉得我是按照你的建议去做的,而那不是问题的原因吗? - Scott
显示剩余2条评论

2

我确定php是以运行您的apache的用户身份运行的,而这往往是没有权限创建目录的用户。尝试在每个人都被允许写入的地方创建输出,并检查apache运行的用户。


whoami 返回了 "apache"。最好的方法是授予 apache 使用该程序的权限,还是使用 exec 命令作为具有更多权限的用户进行身份验证?如果可能的话... - Scott
请使用一个Apache可以写入的输出目录。通常,web应用程序包含一个/cache/文件夹用于此类操作。 - Daniel
好的,我创建了一个名为“tempfiles”的新文件夹。我将输出路径指向这个新文件夹,并将所有者设置为Apache。如果我从命令行运行该命令,则可以正常工作,但是在PHP exec中无法正常工作。 - Scott
看起来这可能是解决方案...我的代码中有一些元素让问题变得混乱了... - Scott

0

检查当前是否在运行 PHP 的 safe_mode 模式


我不在安全模式下:“safe_mode - Off - Off” - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接