2013-02-18 4 views
2

Я использую proc_open с pdftk, чтобы предварительно заполнить некоторые формы данными, это работает очень хорошо, но вместо сохранения результата в файл и последующего чтения файла, d хотел бы распечатать файл напрямую. У меня это работает, поэтому у меня нет никаких проблем. Но я бы хотел направить вывод proc_open прямо в поток, возвращенный пользователю, так что мне не нужно удерживать значение в памяти в php. До сих пор у меня есть следующие:PHP set proc_open для вывода непосредственно пользователю

$descriptorspec = array(
0 => array("pipe","r"), 
1 => array("pipe","w"), 
2 => array("file","error.txt","a")); 
$process = proc_open($command, $descriptorspec, $pipes); 
if(is_resource($process)) { 
    fwrite($pipes[0], $fdf); 
    fclose($pipes[0]); 
    echo stream_get_contents($pipes[1])); 
    fclose($pipes[1]); 
    proc_close($process); 
} 

Я хотел бы направить результат непосредственно к использованию, как вы получите в приведенном выше коде, без фактического сохранения значения в переменной, а затем печатать ее. Есть ли способ прямого потока потока в выходе php непосредственно на выход. Я хотел бы сделать это, чтобы сохранить память и сократить время, необходимое для запуска кода.

Кто-нибудь знает о функции для потока в php, который напрямую выводит результат потока. Или есть настройка для proc_open, которая делает это. В любом случае, я боюсь, что это может вообще не работать, поскольку мне может понадобиться добавить заголовок длины содержимого на вывод, чтобы отобразить PDF напрямую. Если кто-либо знает о функции для печати потока непосредственно, есть также способ получить длину байта потока без фактического его чтения.

+0

http://php.net/manual/en/function.stream-copy-to-stream.php – kyall

+0

http://php.net/manual/en/function.stream-copy-to- stream.php stream_copy_to_stream, кажется, служит, где поток назначения создается с помощью fopen («php: // output», «w») Попытка найти способ получить длину потока может быть и не нужной, однако чтобы проверить, может ли он отображаться в браузере без набора длины содержимого. Извините за пробег комментариев, первый комментарий, отправленный случайно, меня прервали события RL, не удалось закончить редактирование, пока не истечет 5-минутная эпоха редактирования. – kyall

ответ

3

Поскольку никто не отправил ответ, я также могу отправить сообщение ответ, который я нашел.

Открыть поток в php: // вывод в режиме fopen w и использовать stream_copy_to_stream для непосредственного отправки данных из процесса proc_open пользователю. По-видимому, нет простого способа получить длину или размер данных в потоке.

$descriptorspec = array(
0 => array("pipe","r"), 
1 => array("pipe","w"), 
2 => array("file","error.txt","a")); 
$process = proc_open($command, $descriptorspec, $pipes); 
if(is_resource($process)) { 
    fwrite($pipes[0], $fdf); 
    fclose($pipes[0]); 

    /* New Code */ 
    if($fout = fopen("php://output","w")) { 
    stream_copy_to_stream($pipes[1],$fout); 
    fclose($fout); 
    } 

    fclose($pipes[1]); 
    $result = proc_close($process); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^