ob_start () ve ob_flush () çalışmıyor

5 Cevap php

Ben, umarım, uzun bir ithalat işlemi sırasında bana biraz ilerleme vermek için ob_start() / ob_flush() kullanıyorum.

İşte ben ne yapıyorum basit bir taslak olduğunu:

<?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();

Ancak, hiçbir şey ekrana çıktı ediliyor.

Ben bunu konuyor dizin izlemek için veri dosyası indirilir oluyor biliyorum.

Ben DB izleyebilir ve kayıtları eklenir ediliyor çünkü ben de, bu süre içinde döngü, yani ithalat oluyor biliyoruz.

Herhangi Ben ekrana çıktı almıyorum neden olarak fikir?

5 Cevap

Ayrıca PHP ayarlarını kontrol etmek gerekir

Bazı bazı varsayılan, 4096 varsayılan yükler kapalı

output_buffering = Off
output_buffering = 4096

George ile kabul etti ama yukarıdaki ayarlarını kontrol edebilirim

Çıktı tamponlama otomatik olarak başlamazsa emin olun. Çalıştırın:

print ob_get_level ();

ob_start önce (); irade başka bir şey görürsünüz eğer 0 cevabı var.

Hey man I was also got stuck in this problem and finally got the correct solution here it is for you

you have to add content type for your page you can do that by two ways 1. using html tag

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

Ör.

<!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 header fonksiyonunu kullanarak

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

Ör.

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

Tüm iyi

Bu, muhtemelen, çünkü:

  • bunun tüm alıncaya kadar tarayıcı sayfasını görüntüleyen değil
  • (Muhtemelen daha büyük olasılıkla) hepsi alıncaya kadar PHP çalıştıran web sunucusu istemciye veri aktarımı değil

Bu web sunucusu kendi tamponlama yaptığını mümkündür. Muhtemelen mod_gzip gibi bir şey ile.

İşte bazı çok basit bir test kodu:

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

Bunun yerine yeni bir hattını her 2 saniyede görmekten ziyade, yük o sayfa için 10 saniye sürerse, o zaman sizin sunucunuza tarafından önbelleğe ediliyor demektir. Yapmaya çalıştığınız ne için, ob_start ve ob_flush kullanmaya gerek yoktur. Eğer tarayıcı içeriğini zorlamak için istediğiniz zaman sadece flush diyoruz. Bahsettiğim gibi webserver göndermeden önce tamamlamak içerik bekliyor Ancak, o sizin için bir şey yapmayacağım.

Edit: Başka bir olasılık o pornografi gibi görünüyor olmadığını görmek için tarama böylece (bu hizmet öncesi tam sayfa bekler bir kurumsal veya ISS proxy / firewall arkasından sayfayı görüntüleyen konum olduğunu , örneğin).