ob_start () и ob_flush () не работают

Я использую ob_start() / ob_flush() чтобы, надеюсь, дать мне некоторый прогресс во время длительной операции импорта.

Вот простой пример того, что я делаю:

 <?php ob_start (); echo "Connecting to download Inventory file.<br>"; $conn = ftp_connect($ftp_site) or die("Could not connect"); echo "Logging into site download Inventory file.<br>"; ftp_login($conn,$ftp_username,$ftp_password) or die("Bad login credentials for ". $ftp_site); echo "Changing directory on download Inventory file.<br>"; ftp_chdir($conn,"INV") or die("could not change directory to INV"); // connection, local, remote, type, resume $localname = "INV"."_".date("m")."_".date('d').".csv"; echo "Downloading Inventory file to:".$localname."<br>"; ob_flush(); flush(); sleep(5); if (ftp_get($conn,$localname,"INV.csv",FTP_ASCII)) { echo "New Inventory File Downloaded<br>"; $datapath = $localname; ftp_close($conn); } else { ftp_close($conn); die("There was a problem downloading the Inventory file."); } ob_flush(); flush(); sleep(5); $csvfile = fopen($datapath, "r"); // open csv file $x = 1; // skip the header line $line = fgetcsv($csvfile); $y = (feof($csvfile) ? 2 : 5); while ((!$debug) ? (!feof($csvfile)) : $x <= $y) { $x++; $line = fgetcsv($csvfile); // do a lot of import stuff here with $line ob_flush(); flush(); sleep(1); } fclose($csvfile); // important: close the file ob_end_clean(); 

Однако ничего не выводится на экран вообще.

Я знаю, что файл данных загружается, потому что я смотрю каталог, в котором он находится.

Я также знаю, что импорт происходит, а это значит, что он находится в цикле while, потому что я могу контролировать БД, и записи вставляются.

Любые идеи относительно того, почему я не получаю вывод на экран?

    Вам также необходимо проверить настройки PHP

    некоторые устанавливают по умолчанию 4096, некоторые по умолчанию отключены

    output_buffering = Off
    output_buffering = 4096

    согласился с Джорджем, но проверьте вышеприведенные настройки

    Убедитесь, что буферизация вывода не запускается автоматически. Бег:

     print ob_get_level (); 

    перед ob_start (); если увидит что-то другое, тогда у вас будет ответ.

    Эй, человек, я тоже застрял в этой проблеме и, наконец, получил правильное решение здесь, это для тебя

    вам нужно добавить тип контента для своей страницы, вы можете сделать это двумя способами: 1. используя html-тег

     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

    Ex.

     <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Wp Migration</title> </head> <body> <?php for($i=0;$i<70;$i++) { echo 'printing...<br>'; ob_flush(); flush(); sleep(3); } ?> </body> </html> 
    1. использование функции заголовка php

      <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

    Ex.

     <?php header( 'Content-type: text/html; charset=utf-8' ); for($i=0;$i<70;$i++) { echo 'printing...<br>'; ob_flush(); flush(); sleep(3); } ?> 

    Всего наилучшего

    Ob_end_clean () отбрасывает содержимое текущего выходного буфера и отключает буферизацию. Вместо этого вы должны использовать ob_end_flush ().

    Возможно, ваш веб-сервер выполняет свою собственную буферизацию. Наверное, с чем-то вроде mod_gzip.

    Вот очень простой тестовый код:

     <?php echo 'starting...<br/>'; for($i = 0; $i < 5; $i++) { print "$i<br/>"; flush(); sleep(2); } print 'DONE!<br/>'; 

    Если загрузка этой страницы занимает 10 секунд, вместо того, чтобы видеть новую строку каждые 2 секунды, значит, она кэшируется вашим веб-сервером. Для того, что вы пытаетесь сделать, нет необходимости использовать ob_start и ob_flush. Просто вызовите flush всякий раз, когда вы хотите принудительно включить контент в браузер. Однако, как я уже упоминал, если веб-сервер ожидает завершения содержимого перед отправкой, то это ничего не сделает для вас.

    Edit: Еще одна возможность заключается в том, что вы просматриваете страницы из – за корпоративных или ISP прокси / брандмауэр , который ждет всей страницы перед подачей его (так что он может сканировать его , чтобы увидеть , если она выглядит как порнографию, например).