PHP exec()不运行所有命令

I am using PHP-FPM with Nginx on Ubuntu. I am trying to launch a PHP task from a web application.

The following two examples work correctly when I run the files from CLI, but not from Nginx.

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

These two work correctly from both CLI and Nginx.

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

I tried changing the PHP-FPM user from www-data to rohit (my username), but no luck. What am I doing wrong?

The problem is that you're running notify-send from a service. Notify-send is a desktop-oriented program which interacts with the display. But nginx runs without being attached to a display.

Imagine, for example, that there are 3 people logged on to the computer at the same time, all with different displays. When notify-send runs, it wouldn't know which display to send the notification to.

propbaly the user running the nginx server has no access to /home/rohit and the notify-send command...

eighter give the nginx user the rights to execute those command and script or move them to a location he has access to.

See what the standard error message looks like. You can see it by specifying the second parameter in the exec() function.

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

The following code may work. In addition, /etc/sudoers also needs to be modified.

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

The value of XAUTHORITY variable depends on your environment.

Also, /etc/sudoers needs to be changed as follow:

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

Please pay attention to security issues when you do that.