我正在使用pdftk来合并pdf文件。偶尔用户上传形成错误的pdf,它会挂起进程,不会返回任何错误并占用所有服务器资源。为了防止这种情况,我正在考虑通过proc_open
实现流程调用,并希望设置流程的时间限制,以便在超过时间限制时运行和终止流程。
下面是我设置
时用于合并pdf文件的函数示例 stream_set_blocking($process, 0);
它会返回错误:
stream_set_blocking(): supplied resource is not a valid stream resource
我认为这个函数中的某些内容格式不正确,希望有人能够指出我正确的方向......函数当前没有返回任何错误但不会在30秒后根据需要终止
protected function pdf_merge($documents,$output_file,$time = 30){
$end = time() + $time;
$cmd = sprintf('/usr/local/bin/pdftk %s cat output %s', $documents, $output_file);
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("file","./error.log","a")
);
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
stream_set_blocking($pipes[1], 0);
while (!feof($pipes[1]) && (time() < $end)) {
fwrite($pipes[0], stream_get_contents($pipes[0]));
fclose($pipes[0]);
$pdf_content = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
return $return_value;
}
error_log('file is taking too long... kill process');
proc_terminate();
}
}
答案 0 :(得分:0)
也许我不在这里,大部分代码都运行了吗?
fwrite($pipes[0], stream_get_contents($pipes[0]));
看起来你正试图写入管道,无论你从管道上读到什么......
此外,您可能需要检查get_proc_status(),因为在您尝试设置阻止时命令可能已完成...