2012-05-08 7 views
5

Büyük bir php betiği, oluşturulan html'nin bir kısmını tarayıcıya gönderirken, komut dosyasının daha büyük bir kısmını uygulayan bir dosya gönderir. 20 saniye.PHP floş neden her zaman çalışmıyor, sayfa 1/5 kez düzgün yüklenmemiş?

Sifondan sonra yürütülmekte olan komut dosyasının kısmı oldukça büyüktür ve sunucu yedeklerinden çok daha fazlasını alır (% 90 işlemci).

Sayfanın 5 katında bir kez boşluk kalıyor (beyaz), bu da sayfanın yüklenmekte olduğunu gösteren görüntüyü göndermek için sifonun gelmediği anlamına gelir. Sayfa bittiğinde, program tamamlandığında ve tüm sayfayı tarayıcıya göndermesi gerektiğinde, sayfa boştur (tarayıcı hala yükleniyor).

Dikkat Çekilmesi: Geri düğmesine bastığımda, tüm sayfa bir saniye boyunca (tüm komut dosyası çalıştırıldıktan sonra tarayıcıda yüklü olması gerekir) gösterilecek ve ardından tarayıcı bir önceki sayfaya dönecektir.

Sayfanın diğer 4 katı sayfanın tümü iyi yükleniyor. Php komut dosyasının girişi 5 kez aynıdır. Bu sorunun nedeni olabilecek ne

print str_pad('',4096)."\n"; 
ob_flush(); 
flush(); 

:

addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5 
addhandler x-httpd-php5-cgi .php5 
Header Set Cache-Control "max-age=0, no-store" 

Bu tarayıcıya oluşturulan kodu temizlemesini ifadedir:

benim .htacces dosyasında bu ayarları var?

+0

Güzel hikaye, kod nerede? –

+0

@LawrenceCherone Tarayıcıya akan kodu ekledim. – BastiaanWW

cevap

2

Yalnızca ipucu verebilirsiniz: flush() onu arabelleğe/beklemeye ayırabilen apache/webserver'e gönderir; bu da onu, tarayıcınızda sonlanan arabelleğe/beklemeye olanak tanıyan herhangi bir sayıda proxy ile gönderir. Ayrıca arabelleğe/beklemeye karar verebilir. Tüm bu baş ağrılarıyla uğraşmak istemiyorsanız, eşzamansız bir yönteme geçin. Gearman bunu çok kolaylaştırıyor, ama elbette elbette gerekli değil.

2
print str_pad('',4096)."\n"; 

Boş bir dizeyi tekrar ettiğinizi fark ettiniz mi? Belki bayt belli bir miktar alınana kadar bazı web tarayıcıları sayfanın sunulmasına çünkü bu ifadenin amacı, veya yanıt hangisi önce tamamlandığında

print str_pad(' ',4096)."\n"; 

geliyordu.

İlgili konular