30.01.2013

IIS 6 / AJAX Çok Mu Yavaş Çalışıyor? İşte Çözüm



Windows Server üzerinde yaptığınız AJAX istekleri yavaş mı çalışıyor? İşte benim yaşadığım sorun:
Sunucu: Windows Server 2003. IIS 6 ve PHP 5.2 kurulu. (Yazımın sonunda da değineceğim gibi 5.3 ile bu sorun giderilmiş görünüyor)
Javascript frameworkü olarak JQuery kullanıyorum. (Burada versiyonun bir önemi yok)
Post veya Get farketmez, tüm ajax işlemlerimde yanıtın gelmesi 3-4 saniye sürüyordu. Başta problemi yaptığım mysql sorguları ya da diğer işlemlerden sandım. Sonra boş bir sayfa ile işlem yapmayı denedim ve aynı yavaşlık devam etti. Ardından problemin xmlHttpRequest yani AJAX ta olduğunu düşündüm. Ancak son bir deneme yapıp AJAX ile bir PHP dosyasına değil düz bir HTML dosyasına istek gönderdim. Sonuç.. Anında cevap geri döndü. Anladım ki sorun PHP de!
Fakat php bu kadar yavaş olabilir miydi? Ya da neden yavaştı? İşte burada bir şey dikkatimi çekti. Normal sayfalarımın da yüklenmesi uzun sürüyordu. Aslında sayfalar hemen yükleniyor gibi görünüyor, sayfa içeriği çabucak ekranıma geliyordu. Ancak tarayıcı 3-4 saniye daha yükleme işlemine devam ediyordu. Yani yükleme bitmiyordu. JQuery ile yaptığım AJAX işleminin ardından tanımladığım CALLBACK fonksiyonun çalışması için de sayfa yüklemesinin bitmiş olması gerekiyordu. Peki ama sayfalar aslında yüklendiği halde neden yükleme işlemi devam ediyordu?
Cevap sayfanın header bilgilerinde gizli. Aslında orada eksik olan bir şey vardı: Content-length!
Header da content-length belirtilmediği için tarayıcı bir süre daha sayfayı yüklemeye çalışıyor, yüklemeyi sonlandırmıyor. İşte AJAX isteklerimize cevap almamız da bu yüzden gecikiyor. PHP 5.3 ile bu sorun çözülmüş görünüyor. Peki PHP 5.2 ye mecbursak?
O zaman yapacağımız şey basit. İstek gönderdiğimiz sayfalara şu kodları eklememiz halinde sorun çözülecek.
Sayfanın başına:

"ob_start(); "

Sayfanın sonuna:
"$len = ob_get_length();
header('Content-Length: '.$len);
ob_end_flush(); "

Yaptığımız işlem ile sayfanın header ına kendimiz eksik olan bilgiyi eklemiş olduk. Artık tarayıcı belirtilen byte a erişildiğinde sayfanın tamamen yüklendiğini anlayacak ve bize anında cevap verecek.
UYARI: ob_get_length() bazen yanlış değer döndürebilir. Bunun sebebi kod editörünüzün sayfaya görünmez karakterler eklemesidir.

Dosyanızı ANSI olarak kaydettiğinizde bu sorun ortadan kalkacaktır. Ya da kendiniz kaç karakter(byte) eksik kaldığını kontrol edip $len değişkenine bu sayıyı ekleyebilirsiniz.
Header bilgilerini kontrol etmek için size Firebug eklentisini kullanmanızı öneririm.

Kaynak: http://hiperbolik.wordpress.com


Hiç yorum yok:

Yorum Gönder