我在Ubuntu上使用Nginx的PHP-FPM。 我试图从一个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");
我试图从www数据更改为PHP-FPM用户rohit(我的用户名),但没有运气。 我究竟做错了什么?
问题是你正在运行notify-send服务。 通知发送是一个桌面导向的程序,与显示器交互。 但是nginx运行时没有连接到显示器。
想象一下,例如,有三个人同时登录到计算机,所有的显示都不一样。 当notify-send运行时,它不知道将通知发送到哪个显示器。
propbaly运行nginx服务器的用户无法访问/home/rohit
和notify-send
命令…
eighter赋予nginx用户执行这些命令和脚本的权利,或者将它们移动到他有权访问的位置。
看看标准的错误消息是什么样的。 你可以通过在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
当你这样做的时候请注意安全问题。