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

PHP网页调用含cv2的Python脚本无法读取视频,终端运行PHP正常

问题根本原因

终端执行PHP时使用的是当前登录用户的权限和环境变量,网页访问时PHP由Web服务器(Nginx/Apache等)的运行用户(通常是www-data、apache、nobody等)执行,二者的工作目录、环境变量、系统权限限制存在差异,才会出现执行结果不一致的情况。


解决步骤

  1. 统一使用绝对路径,避免相对路径找不到文件
  • 先在终端执行which python3获取Python3的绝对路径,比如输出为/usr/bin/python3
  • 确认你的项目根目录绝对路径,比如为/home/customro/www/
  • 修改bootscript.php代码,先切换工作目录到项目根目录,再用全路径调用脚本,同时把错误输出重定向到标准输出方便排查:
<?
    // 替换为你自己的项目根目录绝对路径
    chdir("/home/customro/www/");
    // 替换为Python3的绝对路径和Python脚本的绝对路径,末尾加2>&1输出所有报错
    $out = shell_exec("/usr/bin/python3 /home/customro/www/video2frames.py 2>&1");
    echo "$out";
?>
  • 修改video2frames.py的视频路径为绝对路径:
# 替换为你自己的视频文件绝对路径
cam = cv2.VideoCapture('/home/customro/www/video.mp4')
  1. 复现问题排查具体报错
    完成路径修改后,在终端切换到Web服务器的运行用户执行脚本,复现网页场景的错误:
    比如你的Web运行用户是www-data,执行:
    sudo -u www-data /usr/bin/python3 /home/customro/www/video2frames.py
    如果执行后出现报错,直接根据报错内容针对性解决即可,常见报错有两类:
  • 提示找不到视频文件:再检查路径和文件权限,确认web用户对视频文件有可读权限
  • 提示cv2相关动态库加载失败:属于环境变量问题,参考下一步解决
  1. 补全Web用户的环境变量
    如果是动态库加载失败的问题,在PHP调用命令前添加cv2依赖的动态库路径即可:
$out = shell_exec("export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:$LD_LIBRARY_PATH; /usr/bin/python3 /home/customro/www/video2frames.py 2>&1");

路径可以根据你自己的cv2依赖库安装位置调整。

  1. 排查SELinux权限限制
    如果是CentOS/RHEL类系统,默认开启的SELinux会限制Web服务器进程的权限,可临时关闭SELinux测试:
    setenforce 0
    如果测试后网页访问恢复正常,说明是SELinux限制,执行以下命令给项目目录添加允许Web访问的安全上下文即可:
chcon -R -t httpd_sys_content_t /home/customro/www/
setsebool -P httpd_execmem 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:27:03