Методы ob_start и ob_flush не работают, почему? - PullRequest
10 голосов
/ 14 мая 2010

Я использую 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, потому что я могу следить за БД и вставлять записи.

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

Ответы [ 6 ]

17 голосов
/ 14 мая 2010

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

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

output_buffering = Off
output_buffering = 4096

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

13 голосов
/ 14 мая 2010

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

print ob_get_level ();

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

6 голосов
/ 12 июня 2013

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

Вы должны добавить тип контента для своей страницы Вы можете сделать это двумя способами 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);
}
?>

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

3 голосов
/ 14 мая 2010

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

0 голосов
/ 17 января 2019

Добавить эту строку

header("X-Accel-Buffering: no");

работал на меня.

0 голосов
/ 14 мая 2010

Возможно, ваш веб-сервер выполняет свою собственную буферизацию. Вероятно, с чем-то вроде 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 всякий раз, когда вы захотите перенаправить контент в браузер. Однако, как я уже говорил, если веб-сервер ожидает завершения содержимого перед отправкой, это ничего не сделает для вас.

Редактировать : Другая возможность заключается в том, что вы просматриваете страницу из-за корпоративного прокси / брандмауэра интернет-провайдера, который ожидает всю страницу перед ее обслуживанием (чтобы он мог отсканировать ее, чтобы увидеть, выглядит как порнография, например).

...