PHP exec()函数无法运行所有命令

3

我正在使用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");

我尝试将PHP-FPM用户从www-data更改为我的用户名rohit,但没有成功。我哪里做错了吗?


你有检查过php-fpm错误日志吗?还是只是设置了E_ALLdisplay_errors=on - tylerl
这是在开发机器上,所以所有的错误都是打开的。我通过 shell(su www-data)进行了检查,除了 notify-send 外,所有的命令都正常工作。notify-send 静默失败了。我的错误是使用 notify-send 进行调试。 - Rohit
3个回答

1
问题在于您正在从服务中运行notify-send。Notify-send是一个面向桌面的程序,它与显示器交互。但是nginx在没有连接到显示器的情况下运行。
例如,假设有3个人同时登录计算机,每个人都有不同的显示器。当notify-send运行时,它不知道将通知发送到哪个显示器。

有道理 - 如果没有可用的X显示来挂钩,那么由www-data启动的notify-send必须一直向黑洞发送消息。在通过exec()启动任务时要记住这一点。 - Rohit
假设你设置了$ DISPLAY,它应该可以工作。但是仍然有一些x auth的内容需要匹配,所以不要依赖它。 - tylerl

1

可能是运行nginx服务器的用户没有访问/home/rohit和notify-send命令的权限...

要么给nginx用户执行这些命令和脚本的权限,要么将它们移动到他有权限访问的位置。


确实。notify-send命令对www-data不可用(从CLI检查)。控制台脚本本身可以由www-data运行。 - Rohit
@tylerl解释了情况,为什么notify-send本身似乎“失败”了。 - 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

请注意在进行此操作时的安全问题。

这对与桌面进行交互非常有用,但却偏离了我的初衷——验证exec()是否正在启动我的脚本。notify-send“不起作用”是一个误导。 - Rohit

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