PHP的exec()不会运行所有的命令

我在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/rohitnotify-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 

当你这样做的时候请注意安全问题。