PHP exec()调用ImageMagick处理PDF失败,CLI下正常
结合你遇到的场景和已做的排查,先梳理下当前的情况,再给出几个针对性的排查方向:
已确认的关键信息
- CLI环境下
identify命令可正常识别PNG和PDF,输出符合预期 - 文件权限无异常:两个测试文件均属于
_www用户(PHP运行用户),权限为rw-r--r-- - CLI与PHP使用同一版本ImageMagick(7.0.7-32),且该版本支持PDF格式
- 已尝试指定
identify完整路径,问题未解决 - PHP中直接调用
gs命令可处理目标PDF,但无法满足业务需求
具体测试细节
CLI执行结果
$ identify /var/tmp/doc-98563.png /var/tmp/doc-98563.png PNG 2550x3300 2550x3300+0+0 8-bit Gray 256c 1.24178MiB 0.000u 0:00.009 $ identify /var/tmp/doc-35765.pdf /var/tmp/doc-35765.pdf[0] PDF 419x595 419x595+0+0 16-bit ColorSeparation CMYK 997321B 0.120u 0:00.119 /var/tmp/doc-35765.pdf[1] PDF 419x595 419x595+0+0 16-bit ColorSeparation CMYK 997321B 0.110u 0:00.109
文件权限检查
$ ls -la /var/tmp/doc* -rw-r--r-- 1 _www wheel 1.6M 15 May 10:05 /var/tmp/doc-35765.pdf -rw-r--r-- 1 _www wheel 1.2M 15 May 10:01 /var/tmp/doc-98563.png
PHP测试代码
exec('identify /var/tmp/doc-98563.png', $output, $exitcode); var_dump($output); var_dump($exitcode); unset($output); exec('identify /var/tmp/doc-35765.pdf', $output, $exitcode); var_dump($output); var_dump($exitcode);
PHP执行结果
array(1) { [0]=> string(93) "/var/tmp/doc-98563.png PNG 2550x3300 2550x3300+0+0 8-bit Gray 256c 1.24178MiB 0.000u 0:00.000" } int(0) array(0) { } int(1)
下一步排查方向
基于OSX+PHP+Homebrew的环境,建议从以下几点入手:
检查PHP运行环境的环境变量
CLI和PHP-FPM/Apache模块的环境变量往往不同,ImageMagick处理PDF依赖Ghostscript,PHP环境可能找不到gs的路径。可以在PHP中执行exec('echo $PATH', $pathOutput),对比CLI下的echo $PATH输出,确认Homebrew的bin目录(比如/usr/local/bin或/opt/homebrew/bin)是否在PHP的PATH中。如果不在,可在exec命令中指定gs的完整路径,或修改PHP的环境变量配置。捕获ImageMagick的错误输出
默认exec仅捕获标准输出,错误输出会被丢弃。修改命令将错误输出重定向到标准输出,就能看到具体报错:exec('identify /var/tmp/doc-35765.pdf 2>&1', $output, $exitcode); var_dump($output);常见报错可能是找不到Ghostscript、临时目录权限不足,或是PDF解码异常。
验证临时目录权限
ImageMagick处理PDF时会生成临时文件,默认使用系统临时目录(如/tmp)。检查/tmp目录是否允许_www用户读写,也可以手动指定ImageMagick的临时目录测试:exec('MAGICK_TMPDIR=/var/tmp identify /var/tmp/doc-35765.pdf 2>&1', $output, $exitcode);确认Ghostscript的一致性
虽然PHP直接调用gs能处理PDF,但要确认ImageMagick调用的gs和你CLI中用的是同一个版本。在CLI执行which gs,在PHP中执行exec('which gs', $gsPath),对比路径是否一致。另外,检查Ghostscript是否有功能限制(比如某些PDF解码选项被禁用)。排查OSX系统沙箱限制
OSX的系统完整性保护(SIP)或Apache/PHP的沙箱规则,可能阻止ImageMagick调用Ghostscript。可以尝试临时关闭SIP测试(注意操作风险),或检查Apache/PHP的运行权限是否有特殊限制。
内容的提问来源于stack exchange,提问作者SpoonNZ

