2009-03-06 2 views
10

Итак, я ищу что-то более эффективное, чем это:Streaming вывод в файл и браузер

<?php 
ob_start(); 
include 'test.php'; 
$content = ob_get_contents(); 

file_put_contents('test.html', $content); 

echo $content; 
?> 

Проблемы с выше:

  • Клиент не имеет ничего не получают, пока вся страница отображается
  • Файл может быть огромным, поэтому я предпочел бы не иметь все это в памяти

Любые предложения?

+0

Вы имеете в виду test.php (или результат его оценки) может быть огромным? –

+0

Результат оценки может быть огромным. –

ответ

6

интересная проблема; Не думаю, что я пытался решить это раньше.

Я думаю, вам нужно будет получить второй запрос от вашего PHP-скрипта на вашем сервере. Это может быть простой вызов http://localhost/test.php. Если вы используете foopen-wrappers, вы можете использовать fread(), чтобы вывести результат test.php по мере его рендеринга и после получения каждого фрагмента вывести его на экран и добавить в файл test.html.

Вот как это может выглядеть (непроверенные!): Ответ

<?php 
$remote_fp = fopen("http://localhost/test.php", "r"); 
$local_fp = fopen("test.html", "w"); 
while ($buf = fread($remote_fp, 1024)) { 
    echo $buf; 
    fwrite($local_fp, $buf); 
} 
fclose($remote_fp); 
fclose($local_fp); 
?> 
+0

Интересно. Добавляем это в свой набор инструментов. –

0

Pix0r является то, что вы хотите, если вы на самом деле не нужно это «включено», а не просто выполняется. Например, если у вас есть данные для входа перед test.php, он не будет передаваться в файл, если вы вызываете его с помощью fopen.

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

-1

Здесь вы идете x-send-file, используйте mod_xsendfile, чтобы отправить файл эффективно, очень просто.

+1

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

2

Лучший способ сделать это - использовать первые два параметра, принятые ob_start: output_callback и chunk_size. Первая специфицирует обратный вызов для обработки вывода, поскольку он буферизуется, а последний определяет размер кусков вывода для обработки.

Вот пример:

$output_file = fopen('test.html', 'w'); 
if ($output_file === false) { 
    // Handle error 
} 

$write_ob_to_file = function($buffer) use ($output_file) { 
    fwrite($output_file, $buffer); 

    // Output string as-is 
    return false; 
}; 

ob_start($write_ob_to_file, 4096); 
include 'test.php'; 
ob_end_flush(); 

fclose($output_file); 

В этом примере выходной буфер будут сброшены (пересылаются) на каждые 4096 байт вывода (и еще раз в конце со стороны ob_end_flush вызова). Каждый раз, когда буфер сбрасывается, обратный вызов $write_ob_to_file будет вызываться и передаваться последним фрагментом. Это записывается в test.html. Затем обратный вызов возвращает false, что означает «вывести этот кусок как есть». Если вы хотите только записать вывод в файл, а не в выходной поток PHP, вместо этого вы можете вернуть пустую строку.