根本原因是PHP进程环境PATH未包含ffmpeg路径,与终端环境隔离;需在php-fpm.conf中显式配置env[PATH]、检查禁用函数、文件权限及Web用户读写权限,并推荐使用绝对路径调用。

PHP调用 ffmpeg 时提示 command not found,根本原因不是 ffmpeg 没装好,而是 PHP 进程运行的环境里压根“看不见”这个命令——它没在 PHP 所用的 PATH 中,也不在系统默认搜索路径下。
PHP 运行环境和终端环境是两套独立的 PATH
你在 SSH 终端里能执行 ffmpeg -version,不代表 PHP 的 exec() 或 shell_exec() 就能调到。因为:
- 终端 Shell(如 zsh/bash)加载了你的
.zshrc或.bashrc,PATH 已包含/usr/local/bin等路径; - PHP-FPM 或 Apache 的 PHP 进程通常以
www、www-data或apache用户启动,不读取你个人的 Shell 配置文件; - 它的环境变量是精简的,PATH 往往只有
/usr/bin:/bin,而 ffmpeg 实际装在/usr/local/ffmpeg/bin或其他自定义位置。
PHP-FPM 需要显式注入 PATH
Linux 下用 PHP-FPM 时,必须在 php-fpm.conf 或对应 pool 配置中手动声明 PATH:
- 打开配置文件(如
/etc/php/{version}/fpm/pool.d/www.conf); - 添加或取消注释这一行:
env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/ffmpeg/bin; - 确保把 ffmpeg 所在的
bin目录完整写进去(例如/opt/ffmpeg/bin); - 重启服务:
sudo systemctl restart php{version}-fpm。
不要依赖系统 PATH,直接写绝对路径更可靠
即使 PATH 配对了,也建议在 PHP 中用绝对路径调用,避免歧义和权限绕过问题:
立即学习“PHP免费学习笔记(深入)”;
- 先确认 ffmpeg 实际位置:
which ffmpeg或find /usr -name ffmpeg 2>/dev/null; - PHP 中这样写:
exec('/usr/local/bin/ffmpeg -i input.mp4 -c:v libx264 out.mp4 2>&1', $output);; - 特别注意:宝塔面板或某些定制环境里,ffmpeg 可能叫
ffmpeg4(CentOS/Rocky),或需软链:sudo ln -sf /usr/bin/ffmpeg4 /usr/local/bin/ffmpeg。
还要检查三个隐藏关卡
PATH 正确 ≠ 一定能跑通,下面三点漏一个都会失败:
-
PHP 禁用函数:检查
disable_functions是否禁了exec、shell_exec,修改php.ini并重启 Web 服务; -
文件执行权限:运行
ls -l /usr/local/bin/ffmpeg,确保有x权限(如-rwxr-xr-x),否则chmod +x /path/to/ffmpeg; -
Web 用户读写权限:PHP 进程用户(如
www-data)必须能读输入文件、写输出目录,否则命令会卡住或静默失败。



















