Методы 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();

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

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

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

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

10
задан Sandburg 19 January 2019 в 05:14
поделиться

4 ответа

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

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

output_buffering = Off
output_buffering = 4096

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

17
ответ дан 3 December 2019 в 13:47
поделиться

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

3
ответ дан 3 December 2019 в 13:47
поделиться

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

print ob_get_level ();

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

15
ответ дан 3 December 2019 в 13:47
поделиться

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

-1
ответ дан 3 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: