PHP网页调用含cv2的Python脚本无法读取视频,终端运行PHP正常
问题根本原因
终端执行PHP时使用的是当前登录用户的权限和环境变量,网页访问时PHP由Web服务器(Nginx/Apache等)的运行用户(通常是www-data、apache、nobody等)执行,二者的工作目录、环境变量、系统权限限制存在差异,才会出现执行结果不一致的情况。
解决步骤
- 统一使用绝对路径,避免相对路径找不到文件
- 先在终端执行
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')
- 复现问题排查具体报错
完成路径修改后,在终端切换到Web服务器的运行用户执行脚本,复现网页场景的错误:
比如你的Web运行用户是www-data,执行:sudo -u www-data /usr/bin/python3 /home/customro/www/video2frames.py
如果执行后出现报错,直接根据报错内容针对性解决即可,常见报错有两类:
- 提示找不到视频文件:再检查路径和文件权限,确认web用户对视频文件有可读权限
- 提示cv2相关动态库加载失败:属于环境变量问题,参考下一步解决
- 补全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依赖库安装位置调整。
- 排查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
相关产品推荐
相关产品推荐

