PHP немедленное эхо - PullRequest
       37

PHP немедленное эхо

5 голосов
/ 06 апреля 2009

У меня довольно длинный скрипт для извлечения данных, и в некоторых его частях я передаю некоторую информацию на страницу (фактически, во время цикла foreach.)

Однако я замечаю, что информация отправляется на просмотр не сразу, как я надеялся, а в «сегментах».

Есть ли какая-нибудь функция, которую я могу использовать после моего эха, чтобы немедленно отправить все данные в браузер?

Спасибо.

Ответы [ 10 ]

14 голосов
/ 06 апреля 2009

Вы, вероятно, хотите flush(). Тем не менее, PHP может использовать буферизацию вывода. Есть несколько способов, которыми это может изменить вещи, но в двух словах, вы можете flush(), а затем ob_flush().

5 голосов
/ 21 февраля 2013

Да, добавление вывода в 1024 байта приведет к тому, что большинство браузеров начнут отображать содержимое.

Но мы также узнаем из ответа @ nobody на вопрос " Как очищать вывод после каждого вызова` echo`?", что 1024-байтовый эффект буферизации браузера происходит, только когда браузер должен угадать кодировку страницы, что можно предотвратить, отправив соответствующий заголовок Content-Type (например, «Content-Type: text / html; charset = utf-8») или указав кодировку содержимого через соответствующие метатеги html. И у меня это работало во всех браузерах.

В общем, все, что нужно сделать, это:

header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);

Без дополнительной прокладки или промывки, что является большим косметическим преимуществом для кода! Конечно, заголовки нужно отправлять перед любым контентом, и нужно также убедиться, что буферизация вывода не происходит.

Проблема определенно решена для меня! Пожалуйста (+1) @ никто не ответит и на другой вопрос, если он работает для вас. Если, однако, все еще возникают проблемы, я предлагаю проверить ответы на этот другой вопрос для других конкретных ситуаций, которые могут предположительно помешать корректной работе неявного сброса.

5 голосов
/ 06 апреля 2009

Вы можете попробовать использовать flush () после каждого эха, но даже это не гарантирует запись клиенту в зависимости от используемого веб-сервера.

4 голосов
/ 06 апреля 2009

Обратите внимание, что некоторые браузеры не будут отображать что-либо, пока в теле ответа не будет определенное количество данных - например, 256 или 1024 байта. Я видел приложения до того, как эти данные пэда с комментарием длиной 1024 символа в верхней части страницы, до того, как они сделали сброс. Это немного взломать, но необходимо.

Это относится к Internet Explorer и Safari IIRC.

Итак,

  • Если это первая очистка, убедитесь, что вы выводите не менее 1024 байт софар (не включая заголовки HTTP).
  • Call flush ()
  • Если вы можете определить, что буферизация на месте установлена, выполните ob_flush ()

Мне нравится просто использовать

while (ob_get_level()) ob_end_flush();

где-то в начале моего скрипта, а затем просто

flush();

всякий раз, когда я хочу сбросить. Это предполагает, что вы вообще не хотите никакой буферизации вывода, даже если она была настроена перед вашим скриптом (например, в конфигурации PHP.ini или htaccess).

3 голосов
/ 06 апреля 2009

Вы должны иметь возможность использовать что-то подобное для принудительной отправки вывода немедленно. Поместите его в ту часть кода, которую вы хотите, чтобы вывод был отправлен.

flush();
ob_flush();
1 голос
/ 09 ноября 2010

Уф! Я наконец нашел ответ на проблему с буфером Google Chrome! Спасибо boysmakesh за толчок в правильном направлении. Вот функция, которую я использую:

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}

И вот как я это называю:

show_view('global', 'header'); // Echos the <html><head>... tags and
                               // includes JS and CSS.

show_view('global', 'splash_screen'); // Shows a loading image telling
                                      // the user that everything's okay.

buffer_flush(); // Pretty obvious. At this point the loading view shows
                // up on every browser i've tested (chrome, firefox,
                // IE 7 & 8)

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
                             // times and calls buffer_flush() each time.

show_view('global', 'footer'); // End the html page and use JQuery to
                               // fade out the loading view.
1 голос
/ 31 июля 2010

Чтобы идеально решить эту проблему в Google Chrome, попробуйте это:

$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;

while ($i <= 4){
    $padstr = str_pad("",512," ");
    echo $padstr;
    echo "boysmakesh <BR> ";
     flush();
    sleep(2);
    $i = $i + 1;
}

Ee отправляют 512 байт перед отправкой КАЖДОГО эха. Не забудьте поставить <BR> в конце содержимого, прежде чем приступить к очистке. Иначе он не будет работать в Chrome, но работает в IE.

Заполняемые нами данные зависят от браузера. Для некоторых браузеров достаточно иметь 256 байтов, а некоторым - 1024 байта. Для хрома это 512.

0 голосов
/ 13 декабря 2014

эта комбинация, наконец, сработала для меня, основываясь на ответе Томасруттера

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
0 голосов
/ 05 марта 2014

Запуск php 5.5 на IIS 7, IE 11 (win server) Я обнаружил, что это работает в качестве начальных строк файла. Обратите внимание, что размещение оператора while перед заголовком вызвало ошибку уже записанного заголовка.

header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);

Дальнейшие ссылки на ob_flush () в скрипте привели к тому, что в буфере не существует ошибки.

Это работало нормально, когда я обрабатывал файл и отправлял операторы sql в браузер, однако, когда я подключил db (ms server 2008), у меня не было возвращенного ввода до завершения сценария.

0 голосов
/ 04 марта 2012
<code>ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;

if(
  strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
  strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
  # important to change browser into quirks mode
  echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}

function buffer_flush(){
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
    for ( $i = 0; $i < 5; $i++ )
        echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";

    while ( ob_get_level() )
        ob_end_flush();

    if(ob_get_length()){
        @ob_flush();
        @flush();
        @ob_end_flush();
    }
    @ob_start();
}

ob_start(); 

do{

  if($i<10){
    buffer_flush(); 
    echo ". ";    
    buffer_flush(); 
    usleep($interval);

  } else {
    echo sprintf("<pre>%s
", print_r ($ _ SERVER, true)); перерыв; } $ Я ++; } В то время как (истинно);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...