PHP Çıktı tamamlandı bildirim

4 Cevap

Ben tüm sayfa çıktısı tamamlandığında tarayıcı göstermek için PHP için bir yol bulmaya çalışıyorum. Sayfa bittikten sonra biz genellikle uzun sürmüyor ama durumda ben kullanıcıların tarayıcı daha fazla veri için bekleyen istemiyorum gelmez bazı istatistikleri kod koşuyoruz. Cep telefonları ile çalışmak gerekiyor, çünkü bu JavaScript ile yapılamaz.

Zaten kullanarak çıktı tamponlama başlıyorum

mb_http_output("UTF8"); 
ob_start("mb_output_handler");

Ben siteleri MB metni (Japonca) ile sorunları yok sigortalamak için. I ob_end_flush () hile yapmak umuduyla ama ben uyku koyarsanız (10) oldu; ob_end_flush sonra () tarayıcı ek bir 10 saniye bekler. Herkes bu konuda herhangi bir fikir var mı?

UPDATE: Using jitters approach below I "ob_gzhandler" to get it working with gzip any one see any possible issues here?

//may be also add headers for cache-control and expires (IE)
header("Connection: close"); //tells browser that connection will be closed
ob_start();
ob_start("ob_gzhandler");
//page content
ob_end_flush();
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();

UPDATE AGAIN:

Yukarıdaki kodda başka bir göz atın lütfen. Bir ob_start yapmak gerekir (); ob_start ("ob_gzhandler") önce; ve daha sonra) (ob_end_flush diyoruz; önce sen doğru gzip sıkıştırılmış boyutu olsun ki () ob_get_length çağırmadan.

4 Cevap

Bu satırlar boyunca bir şey kullanın

//may be also add headers for cache-control and expires (IE)
header("Connection: close"); //tells browser that connection will be closed
ob_start();
//generate your output
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
//continue statistic processing

Ben çıkış azından çıktı gönderir script tamamlandığında, tarayıcı bildirmek için bir yol olduğunu sanmıyorum. İlk komut dosyası çıkışını izlemek ve belki de bir iframe kullanmak diğer bazı komut dosyası kullanırsanız o zaman bunu yapmak mümkün olabilir.

Sayfa yüklü dikkate alındığında çıkış tamamlandığında tarayıcı bilir. Bu tarayıcı bilir budur.

You could fork a new php process in the background and let that take care of the stats. Something like: shell_exec('php stats.php &');

The & at the end makes sure that it's run in the background, so even if the stats.php takes 20 seconds, the visitor won't notice it. You would probably need to pass data to the stats script, which you can do by passing in parameters, like this:

shell_exec('php stats.php -b '. escapeshellarg($_SERVER['HTTP_USER_AGENT']) .' &');

Stats.php olarak, bu verileri almak için $argv değişkeni kullanmak istiyorum.

Istatistik kod çalıştırmak için uzun sürmüyor ama eğer ben böyle her sayfayı yük için yeni bir süreç bölmek beri bazı yükü vardır, bunu yapmaz. Ben bu istatistikler kodu işlemek için uzun bir zaman alabilir kılan ne olduğunu bilmiyorum, ama başka bir çözüm bir veritabanına ham veri eklemek için olacak, ve bu veriler üzerinde bir arka plan iş iş kullanılabilir istatistikler oluşturmak için izin verebilir. Bu bir cron işi ya da yapılabilir, ya da kuyruğunu işleyen bir Infinte döngü içinde bir ekran çalıştırmak sahip olabilir.

Bir ayrı işleve için istatistik kodu taşımak ve bu meta kodu gibi işlenen sayfadaki javascript kodu dom.ready veya onload olayı bir ajax çağrısı ile bu işlevi çağırmak için deneyin:

<html>
  <script type="text/javascript">
    dom.onready = Ajax.call(location.href + '?do_stats');
  </script>
  <body>...
</html>

Dom.ready olay jQuery veya Prototype kütüphaneler tarafından sağlanabilir. Dezavantajı, sadece etkin js ile çalışacak olan.

Alternatif olarak sadece bir veritabanına istatistikleri için gerekli tüm bilgileri kayıt ve bir komut dosyası oradan sıraya veri toplama ve arka planda üzerinde çalışmaya sevk olabilir - cron kullanarak örneğin.