PHP exec()不运行所有命令

时间:2012-10-03 09:04:53

标签: nginx exec php

我在Ubuntu上使用PHP-FPM和Nginx。我正在尝试从Web应用程序启动PHP任务。

以下两个示例在我从CLI运行文件时正常工作,但不能从Nginx运行。

exec("notify-send 'Starting master at ".date("h:m:s")."'");
echo exec("/home/rohit/Projects/webapp/console/index.php blast 23");

这两个在CLI和Nginx中都能正常工作。

echo exec("whoami");
echo exec("pwd");

我尝试将PHP-FPM用户从www-data更改为rohit(我的用户名),但没有运气。我做错了什么?

3 个答案:

答案 0 :(得分:1)

运行nginx服务器的用户无法访问/home/rohitnotify-send命令...

eighter为nginx用户提供执行这些命令和脚本的权利,或者将他们移动到他有权访问的位置。

答案 1 :(得分:1)

问题是您正在从服务运行notify-send。 Notify-send是一个面向桌面的程序,它与显示器交互。但是nginx在没有附加到显示器的情况下运行。

想象一下,例如,有3个人同时登录到计算机,所有人都有不同的显示。当notify-send运行时,它不知道将通知发送到哪个显示器。

答案 2 :(得分:0)

查看标准错误消息的外观。 您可以通过在exec()函数中指定第二个参数来查看它。

exec("notify-send 'Starting master at ".date("h:m:s")."' 2>&1", $output);
print_r($output);

以下代码可能有效。另外,/ etc / sudoers也需要修改。

<?php
exec("export DISPLAY=:0 && export XAUTHORITY=/tmp/.gdmXXXXXXX && sudo /usr/bin/notify-send test 2>&1", $output);
print_r($output);
?>

XAUTHORITY变量的值取决于您的环境。

此外,/ etc / sudoers需要更改如下:

#Defaults    requiretty
 :
www-data ALL=(ALL) ALL
www-data ALL=(ALL) NOPASSWD: /usr/bin/notify-send

执行此操作时请注意安全问题。