2012-10-03 118 views
2

我在Ubuntu上使用Nginx的PHP-FPM。我正尝试从Web应用程序启动PHP任务。PHP exec()不运行所有命令

以下两个示例在从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(我的用户名),但没有运气。我究竟做错了什么?

+0

你检查了php-fpm错误日志吗?或者只设置'E_ALL'和'display_errors = on' – tylerl

+0

这是在开发机器上,所以所有的错误都在。我通过shell(su www-data)检查,除notify-send之外的所有命令都正常工作。通知 - 发送失败。我的错误使用notify-send进行调试。 – Rohit

回答

1

问题是,您正在运行通知 - 从服务发送。通知发送是一种面向桌面的程序,与显示器交互。但nginx运行时不会连接到显示器。

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

+0

有意义 - 如果没有X显示器可用于挂接,通知发送(由www数据启动)必须已将消息拍摄到黑洞中。通过exec()启动任务时需要注意的事项。 – Rohit

+0

假设你设置$ DISPLAY,你可以使它工作。但仍然有一些x auth的东西必须适合,所以不要依赖它。 – tylerl

1

propbaly运行Nginx的服务器的用户必须/home/rohit没有准入和notify-send命令

eighter给nginx的用户执行这些命令脚本或将其移动到他有权访问的地点的权利。

+0

确实。通知发送命令不可用于www数据(从CLI检查)。控制台脚本本身可以通过www-data运行。 – Rohit

+0

@tylerl更好地解释了情况 - 为什么通知发送本身出现“失败”。 – Rohit

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 

请注意安全问题,当你做到这一点。

+0

这对于与桌面交互很有用,但与我的意图不同 - 验证exec()是否启动我的脚本。通知发送“不工作”是一个红色的鲱鱼。 – Rohit