PHP不是从Raspberry Pi上的网页执行[但在PHP-CLI中很好]

arm*_*ani 7 php nginx raspberry-pi

建立:

  • 覆盆子皮
  • nginx web服务器
  • 安装了PHP5和PHP-CLI

我的Python脚本"lights.py"非常酷,因为它通过连接到Arduino Uno [然后通过USB连接到Pi]的继电器打开/关闭我客厅的灯光.我知道我可以使用Pi的GPIO引脚,但我没有.无论如何,这无关紧要.

我希望能够通过我的Pi托管的网站从Web浏览器激活脚本,所以我的/var/wwww/test/lights.php包含以下代码:

<?php
 exec('python lights.py');
?>
Run Code Online (Sandbox Code Playgroud)

简单,不是吗?好吧,当我在浏览器中浏览该页面时,没有任何显示(预期),但灯光不会改变状态(意外). 但是,在命令行,以用户Pi身份登录,我可以运行"php /var/wwww/test/lights.php",它运行正常!

我想这是因为nginx似乎使用这个名为www-data的用户来做东西,所以也许它的权限问题呢?现在我正在为我徘徊在未知领域...我尝试了"su - www-data",看看我是否可以尝试使用该用户的脚本,但它要求输入密码,我从未设置过(并且空白密码不起作用).

非常感谢任何帮助.

更新 - 这是"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
Run Code Online (Sandbox Code Playgroud)

第二次更新 - 检查:

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'
Run Code Online (Sandbox Code Playgroud)

'/ dev/ttyACM0'设备是我的Arduino连接,因此看起来用户"www-data"无权运行该Python脚本,因为它无法输出到该文件.我可以"chmod"那个设备吗?

第三次更新 - 我觉得我们快要结束了!

使用"ls -g/dev/ttyACM0"我发现它由"拨出"组拥有.使用"grep dialout/etc/group"我发现只分配了用户"Pi".因此,我使用"usermod -a -G dialout www-data"向该组添加了www-data

现在,检查一下:

pi@raspberrypi ~ $ sudo su - www-data
$ cd test
$ php lights.php
$ python lights.py
$
Run Code Online (Sandbox Code Playgroud)

PHP和Python脚本都可以正常工作,灯光也会打开和关闭! 但是从浏览器加载网页"lights.php"仍然没有做任何事情!

第四次更新 我将PHP文件更改为:

<?php

exec('python lights.py', $output, $return);

print "Output:";
print $output;
print "<br />";
print "Return:";
print $return;

?>
Run Code Online (Sandbox Code Playgroud)

从我收集的内容来看,这是从exec()语句中获取调试信息的正确方法.这是刷新网页时的输出:

Output:Array
Return:1
Run Code Online (Sandbox Code Playgroud)

这对我有帮助吗?

arm*_*ani 3

给出的答案都没有帮助我......事实上,我对帖子的更新记录了最终的答案,这是我通过自己的试验/错误和谷歌搜索找到的。

我需要将用户 www-data 分配到 dialout 组中才能访问 /dev/ACM0,并且需要重新启动(整个服务器,而不仅仅是 nginx 出于某种原因)。

我不知道为什么每个人都一直回答这是一个路径问题,当我一直说 Python 脚本从 shell 运行良好,而 PHP 文件从 PHP-CLI 运行良好时。

不管怎样,最后就是这样解决的。感谢大家的尝试。