PHP Not Executing from Webpage [but is fine from PHP-CLI] on a Raspberry Pi

nginx, php, raspberry-pi

Solution

None of the given answers helped me... in fact, my updates to my posts log what was ultimately the answer, which I found through my own trial/error and Googling.

I needed to assign user www-data into the dialout group in order to have access to /dev/ACM0, and a reboot was required (of the whole server, not just nginx for some reason).

I don't know why everybody kept answering that this was a path issue, WHEN I KEPT SAYING THE PYTHON SCRIPT RAN FINE FROM SHELL, AND THE PHP FILE RAN FINE FROM PHP-CLI.

Anyway, that's what solved it in the end. Thanks to everyone for trying.

Problem

Setup: - Raspberry Pi - nginx web server - PHP5 & PHP-CLI installed My Python script "lights.py" is really cool because it turns on/off lights in my living room through a relay connected to an Arduino Uno [then connected to the Pi via USB]. I know I could've used the Pi's GPIO pins, I just didn't. That doesn't matter here anyway. I wanted to be able to activate the script from a web browser through the site hosted by my Pi, so I have /var/wwww/test/lights.php containing this code: ``` <?php exec('python lights.py'); ?> ``` Simple, no? Well, when I browse to that page in a browser, nothing shows up (expected) but the lights don't change state (unexpected). However, at the command line, logged in as user Pi, I can run "php /var/wwww/test/lights.php" and it works just fine! I imagine this is because nginx seems to use this user called www-data to do stuff, so maybe its a permissions issue? Now I'm wandering into unknown territory for me ... I tried "su - www-data" to see if I could attempt the script as that user, but it asks for a password, which I never set up (and a blank password didn't work). Any help here is greatly appreciated. UPDATE - Here is "ls -la /var/www/test/lights*" ``` -rw-r--r-- 1 www-data root 37 Feb 1 23:56 /var/www/test/lights.php -rwxr-xr-x 1 www-data root 129 Feb 1 23:51 /var/www/test/lights.py ``` SECOND UPDATE - Check it: ``` pi@raspberrypi ~ $ sudo su - www-data $ pwd /var/www $ php ./test/lights.php python: can't open file 'lights.py': [Errno 2] No such file or directory $ python ./test/lights.py Traceback (most recent call last): File "./test/lights.py", line 4, in <module> ser = serial.Serial('/dev/ttyACM0', 9600) File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 260, in __init__ self.open() File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 276, in open raise SerialException("could not open port %s: %s" % (self._port, msg)) serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0' ``` That '/dev/ttyACM0' device is my Arduino connection, so it appears the user "www-data" doesn't have access to run that Python script, since it can't output to that file. Am I able to "chmod" that device? THIRD UPDATE - I feel like we're almost at the end! Using "ls -g /dev/ttyACM0" I found that it is owned by group "dialout." Using "grep dialout /etc/group" I found that only user "Pi" is assigned to it. Therefore, I added www-data to that group with "usermod -a -G dialout www-data" Now, check it: ``` pi@raspberrypi ~ $ sudo su - www-data $ cd test $ php lights.php $ python lights.py $ ``` Both the PHP and Python script work, and the lights went on and off! BUT loading the web page "lights.php" from a browser still doesn't do anything! FOURTH UPDATE I changed the PHP file to this: ``` <?php exec('python lights.py', $output, $return); print "Output:"; print $output; print "<br />"; print "Return:"; print $return; ?> ``` From what I gather, that's the proper way to get some debug info from the exec() statement. Here's the output when I refresh the webpage: ``` Output:Array Return:1 ``` Does that help me at all?

Original source