FFMPEG配合PHP转视频本地及Linux终端正常、网站无法运行如何解决
问题排查&解决方案
1. 检查目录权限
确认站点根目录下的original和converted两个目录,对web服务运行用户(常见为www-data、apache、nginx)开放读写权限,可执行以下命令授权(按需替换用户和路径):chown -R www-data:www-data /path/to/your/site/original /path/to/your/site/converted chmod -R 755 /path/to/your/site/original /path/to/your/site/converted2. 验证FFmpeg可执行权限&编码支持
先确认web用户有权限调用FFmpeg,执行以下命令测试(替换为实际的web运行用户):
再确认FFmpeg已编译libx264编码支持:sudo -u www-data /usr/bin/ffmpeg -version
无输出则说明缺少x264依赖,Debian/Ubuntu可执行/usr/bin/ffmpeg -encoders | grep libx264apt install -y ffmpeg x264 libx264-dev安装完整版本。3. 检查PHP配置限制
查看php.ini配置,确认以下项符合要求:disable_functions中未禁用exec、shell_exec等执行函数upload_max_filesize、post_max_size大于你要上传的视频大小max_execution_time、max_input_time调大到600以上,避免视频转换超时被中断
4. 修复代码逻辑缺陷
你当前代码没有做错误判断,且命令拼接存在风险,建议做以下修改:- 所有执行命令的参数用
escapeshellarg转义,避免特殊文件名导致命令执行失败 - 执行完FFmpeg后先判断返回状态,失败则输出
convert.txt日志排查原因 - 用绝对路径拼接文件,避免相对路径出错
参考修改后的代码片段:
// 用绝对路径避免目录匹配错误 $uploads_dir = __DIR__ . '/original/'; $converted_dir = __DIR__ . '/converted/'; // 目录不存在则自动创建 if (!is_dir($uploads_dir)) mkdir($uploads_dir, 0755, true); if (!is_dir($converted_dir)) mkdir($converted_dir, 0755, true); // 转义命令参数 $input_path = escapeshellarg($uploaded_file); $output_path = escapeshellarg($converted_dir . $video_mp4); exec($ffmpeg . ' -i ' . $input_path . ' -c:v libx264 ' . $output_path . ' -y 1>convert.txt 2>&1', $output, $convert_status['mp4']); // 执行失败输出错误日志 if ($convert_status['mp4'] !== 0) { echo "转换失败,错误日志:<br>"; echo nl2br(file_get_contents(__DIR__ . '/convert.txt')); exit; }- 所有执行命令的参数用
5. 关闭SELinux测试(仅适用于CentOS/RHEL系列系统)
线上环境默认开启的SELinux可能会限制web用户调用外部程序、写入文件,临时关闭测试:
测试正常的话可以配置SELinux规则放行,或者按需调整。setenforce 0
内容的提问来源于stack exchange,提问作者margie
相关产品推荐
相关产品推荐

