setcookie() ile Internet Explorer 'da zaman aşımı sorunu Geçenlerde 1 saat zaman aşımlı bir çerez yaratmam gerekti. Basitçe : şeklinde çerezi oluşturdum. Lokalde yaptığım farklı tarayıcı testlerinde sorun olmamıştı.Bende doğal olarak uzak sunucumda da bir problem olmayacağını düşündüm (Uzak sunucum ile kendi bilgisayarımda aynı PHP ve MySQL, phpmyadmin sürümlerini kullanırım) .Tarayıcı olarak Firefox kullandığım için uzak sunucumdaki sayfayı IE ‘da açana kadar problemin farkında değildim. Çerez bir türlü oluşmuyordu. Defalarca ve farklı zaman aşımı süreleriyle yaptığım testlerden sonra time()+3840 süresinin IE ‘da 1 dakikalık çerez oluşturduğunu gördüm. time()+3780 ise 0 "time()" değeriydi ( Yani sucular arası fark 1 saat 3 dakika). Kabaca çıkan sonuç şöyleydi:
time()+3840 => 1 dk. time()+3900 => 2 dk. time()+3960 => 3 dk. time()+4020 => 4 dk. time()+4080 => 5 dk. ........ time()+6600 => 47 dk. ( 6600-3780) / 60 = 47 dk. Bir sevinçle php manual’e bunun çözümü için farklı tarayıcılarda farklı zamanlı çerezler oluşturan bir "çözüm" script ‘i koydum.
Ancak yanılmıştım. Çözüm benim için doğruydu, fakat herkes için değil.
PHP Developer(Geliştirici) olan bir arkadaş ile 3-4 kez e-posta laştıktan sonra. Sorunun lokal sunucumdaki zaman ve uzak sunucumdaki zaman farkı olduğunu gördüm. Siz de şu şekilde bunu öğrenebilirsiniz (bilmeyenler için): // ver. > PHP 5.1
echo date("D M j G:i:s T Y", $_SERVER['REQUEST_TIME']); // ver. < PHP 5.1 Bu küçük scripti hem kendi bilgisayarınızda hem uzak sunucunuzda (muhtemel bir hosting firması) çalıştırarak zaman farkınızı (eğer varsa) görebilirsiniz.
Daha sonra bu linkte (php bug sitesi) : http://bugs.php.net/bug.php?id=13116 değerli PHP güvenlik uzmanı ve geliştiricisi Chris Shiflet ‘ın benzer bir probleme cevap olarak 2002 Şubat ayında yazmış olduğu :
3) Time (in GMT) on the browser 4) Time (in GMT) on the server
maddelerinden yola çıkarak ben de 13116 numaralı bug ‘da aynı problemi yaşayanlar için bu çözümü gösterecek bir yorum yazdım. Aynı PHP Developer arkadaş ile yazışmamızda bu yorumun benzer sorunu yaşayan kişilere, kafalarını karıştırmadan net bir yanıt olacağını söyledi. Sonuç: Çerezleri uzun zaman aşımı gerektiren durumlarda kullanmak mantıklı olacaktır. Kısa zaman aşımı gerektiren durumlarda veritabanını kullanmak daha mantıklı olabilir.Eğer kısa zaman aşımları durumlarında mutlaka çerez kullanmamız gerekiyorsa, sık kullanılan tarayıclardan Internet Explorer ‘ı göz önüne alıp (diğer tarayıcılarda böyle bir sorun oluşmamaktadır) lokal ve uzak sunucu zamanlarını kıyaslayıp buna uygun bir script yazmamız gerekmektedir. Örneğin, lokal ve uzak sunucu zaman aşımı 1 saat 3 dakika olan bir durumda: if ( ! isset($_COOKIE['cerezadi']) ) { // Eğer tarayıcı Internet Explorer ise if(stristr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { // Zaman aşımını 47 dk. olarak ayarlıyoruz setcookie("cerezadi", "alihan cetin", time()+6600, "/", ".azizce.com"); // Diğer tarayıcılarda örn: Firefox } else { // Zaman aşımını 47 dk. olarak ayarlıyoruz setcookie("cerezadi", "alihan cetin", time()+2820, "/", ".azizce.com"); } } gibi bir script kullanabilirsiniz. Yok illa setcookie() kullanmak istemiyorum derseniz, header() fonksiyonu yada ufak bir Javascript kodu da işinizi görecektir. Eğer header() fonksiyonu ile çerez yaratmayı tercih ediyorsanız php manual deki setcookie() fonksiyonuna eklenen yorumlardan yaralanabilirsiniz. Alihan Çetin (Webmaster)
|