当来自 PHP 的 运行 脚本时,RPi GPIO 控制丢失(没有任何错误)

RPi GPIO control lost (without any error) when running script from PHP

我一直在创建一个小程序,允许我通过 Python 控制 GPIO 引脚。这一切进行得很顺利。当我尝试从 PHP 调用此 python 脚本时出现问题。它似乎失去了控制 GPIO 引脚的功能,并且无声地崩溃,没有任何错误。

存在以下文件:

当 运行 python3 RRR.py -c ON -r 5 的示例命令时,它正确地控制了第 5 个设备映射的引脚。

我可以通过放置以下 URL -> 192.168.x.x/control.php?com=ON&dev=5 来获得相同的命令 PHP 回显显示 $command var 包含以下内容 python3 RRR.py -c ON -r 5

我使用 PHP 使用以下命令执行此命令 -> $output = shell_exec($command); 然后使用 -> echo "<pre>$output</pre>"

查看输出

我得到以下输出:

Sending command (ON) to device (5)
Performing operation. This will take 1 second(s)...
Please wait...

这是指通过 RRR.py 文件中的以下行控制 GPIO 引脚的时间:

 GPIO.setup(devPin, GPIO.OUT)
 GPIO.output(devPin, GPIO.LOW)
 time.sleep(sleepTime)
 GPIO.output(devPin, GPIO.HIGH)

其中 devPin 是从 config.ini 计算出的 GPIO 引脚号。不要担心这部分,它工作正常。从 PHP 变为 运行 时,引脚号仍然正确。 GPIO 命令根本不起作用。

这让我相信问题完全出在文件的第一行,但是没有产生任何错误。第一行是:

import RPi.GPIO as GPIO

也许 PHP 的 shell_exec 没有使用 GPi.GPIO python 模块的正确权限?任何人都知道我将如何解决这个问题?我将不胜感激任何和所有建议。我真的很想让这个项目发挥作用:)


tl;dr:在命令行中一切正常,但在从 PHP.

调用完全相同的命令时完全中断

根据 Access GPIO pins without root. No access to /dev/mem. Try running as root!,您的 python 脚本将写入 /dev/gpiomem

这不起作用,因为不允许运行您的 python 脚本 (www-data) 的用户写入此设备:

  • 要在此处写入,您需要是 root 用户或在 gpio 组中。
  • 用户 www-data 既不在 root 也不在 gpio 组中。

为了访问 gpio 端口,您需要将 www-data 用户放在正确的组中:

sudo usermod -aG gpio www-data

不要忘记重新启动您的 HTTP 服务器(和 php-fpm,如果适用的话)。否则您不会注意到差异。