在x秒后终止proc_open

时间:2012-11-23 01:15:40

标签: php process exec pdftk proc-open

我正在使用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();               
        }
    }

1 个答案:

答案 0 :(得分:0)

也许我不在这里,大部分代码都运行了吗?

fwrite($pipes[0], stream_get_contents($pipes[0]));

看起来你正试图写入管道,无论你从管道上读到什么......

此外,您可能需要检查get_proc_status(),因为在您尝试设置阻止时命令可能已完成...