PHP调用Ghostscript时shell_exec无法获取完整输出求助
解决PHP调用
gs命令输出不完整的思路 - 改用
proc_open处理流输出exec/shell_exec的缓冲区可能会截断长输出,proc_open能直接操作标准输入/输出流,一次性读取全部内容,避免截断。示例代码:
$descriptors = [ 0 => ["pipe", "r"], 1 => ["pipe", "w"], 2 => ["pipe", "w"] ]; $proc = proc_open('gs -o - -sDEVICE=inkcov file.pdf', $descriptors, $pipes); if (is_resource($proc)) { $fullOutput = stream_get_contents($pipes[1]); $errorOutput = stream_get_contents($pipes[2]); array_map('fclose', $pipes); proc_close($proc); // 处理完整输出 var_dump($fullOutput); }
分开捕获标准输出和错误流
部分gs的输出可能走标准错误流,即使加了2>&1,PHP的某些执行函数可能仍会过滤部分内容。用proc_open分别读取两个流,确保不遗漏任何输出。调整PHP执行限制
如果PDF文件较大,gs处理时间可能超出PHP的max_execution_time,导致命令被提前终止。临时延长执行时间:
set_time_limit(60); // 根据实际文件大小调整时长
同时确认memory_limit足够容纳输出内容,避免内存不足导致的截断。
- 先写入临时文件再读取
绕开PHP输出缓冲区限制,让gs直接将结果写入临时文件,再通过PHP读取文件内容:
$tmpFile = '/tmp/inkcov_' . uniqid() . '.txt'; shell_exec("gs -o - -sDEVICE=inkcov file.pdf > $tmpFile 2>&1"); $fullOutput = file_get_contents($tmpFile); unlink($tmpFile); // 用完删除临时文件
- 验证输出总行数
先在终端执行gs -o - -sDEVICE=inkcov file.pdf | wc -l拿到输出总行数,再对比PHP中获取的内容行数,确认是真截断还是输出显示问题。
内容的提问来源于stack exchange,提问作者William Wijn
相关产品推荐
相关产品推荐

