You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过PHP实现HTML向Python脚本传参及树莓派GPIO控制问题排查

我来帮你搞定这个问题!你要实现的是网页输入数字后触发树莓派GPIO定时开关,核心就是让PHP把表单里的数字传给Python脚本,再由Python控制GPIO引脚。结合你用Apache+PHP7的环境,我给你一套完整的可运行方案,连容易踩坑的权限问题都帮你考虑到了:

1. 完善index.php的表单与处理逻辑

把你的表单代码替换成下面的版本,它会处理POST请求,调用Python脚本并反馈执行状态:

<!DOCTYPE html>
<html>
<head>
    <title>RPI GPIO 定时控制器</title>
</head>
<body>
    <h1>设置GPIO开启时长(秒)</h1>
    <form action="index.php" method="post">
        <input type="number" name="seconds" min="1" required placeholder="请输入正整数">
        <button type="submit">启动计时器</button>
    </form>

    <?php
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $seconds = intval($_POST['seconds']);
        // 校验输入为正整数
        if ($seconds > 0) {
            // 务必使用Python脚本的绝对路径,避免路径问题
            $pythonScript = '/var/www/html/gpio_timer.py';
            // 执行脚本并捕获输出(包括错误信息,方便调试)
            $output = shell_exec("python3 $pythonScript $seconds 2>&1");
            echo "<h2>执行状态:</h2>";
            echo "<pre>$output</pre>";
        } else {
            echo "<p style='color:red'>请输入大于0的正整数!</p>";
        }
    }
    ?>
</body>
</html>
2. 编写Python GPIO控制脚本(gpio_timer.py)

在/var/www/html/目录下创建这个脚本,负责接收时长参数并控制GPIO:

import sys
import time
import RPi.GPIO as GPIO

# 配置GPIO模式(这里用BCM编号,你可以根据自己的引脚改成BOARD模式)
GPIO.setmode(GPIO.BCM)
# 定义要控制的GPIO引脚(示例用GPIO18,你可以替换成自己的引脚)
TARGET_PIN = 18
# 设置引脚为输出模式,初始电平为低(关闭状态)
GPIO.setup(TARGET_PIN, GPIO.OUT, initial=GPIO.LOW)

try:
    # 从命令行获取传入的时长参数
    if len(sys.argv) != 2:
        print("错误:请传入且仅传入一个数字(时长,单位秒)")
        sys.exit(1)
    duration = int(sys.argv[1])
    if duration <= 0:
        print("错误:时长必须是正整数")
        sys.exit(1)
    
    print(f"正在将GPIO{TARGET_PIN}开启,持续{duration}秒...")
    GPIO.output(TARGET_PIN, GPIO.HIGH)
    time.sleep(duration)
    GPIO.output(TARGET_PIN, GPIO.LOW)
    print(f"GPIO{TARGET_PIN}已成功关闭!")

except ValueError:
    print("错误:输入无效,请输入整数")
except Exception as e:
    print(f"发生未知错误:{str(e)}")
finally:
    # 无论成功失败,都清理GPIO资源,避免引脚状态异常
    GPIO.cleanup()
3. 关键权限配置(必做!)

Apache运行在www-data用户下,必须给它足够的权限才能控制GPIO和执行脚本:

  • 将www-data添加到GPIO组:
sudo usermod -a -G gpio www-data
  • 给Python脚本添加执行权限:
sudo chmod +x /var/www/html/gpio_timer.py
  • 确保脚本归www-data所有:
sudo chown www-data:www-data /var/www/html/gpio_timer.py
  • 重启Apache让权限生效:
sudo systemctl restart apache2
4. 常见问题排查

如果还是无法运行,按以下步骤排查:

  • 确认RPi.GPIO库已安装:
sudo pip3 install RPi.GPIO
  • 检查PHP是否禁用了执行命令的函数:打开对应版本的PHP配置文件(比如/etc/php/7.3/apache2/php.ini),搜索disable_functions,确保里面没有exec、shell_exec,如果有就删除后重启Apache。
  • 模拟Apache环境测试脚本:用www-data用户直接执行脚本,验证脚本本身是否正常:
sudo -u www-data python3 /var/www/html/gpio_timer.py 5
  • 查看Apache错误日志:/var/log/apache2/error.log里会记录PHP执行脚本时的错误信息,帮你快速定位问题。

内容的提问来源于stack exchange,提问作者Bradderz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:55:47