Önbellekleme öneriyorum.
Çoğu insan aradığını bulana dek o linkten o linke tıklar durur forumlarda, sonra geri döner az önce tıkladığına yeniden tıklar bakar vs.
Forumuna göre, ya da sayfasına göre önbellekleme bu davranış kalıplarının yarattığı yükü hafifleterek toplam bir hızlanma sağlayacaktır.
Yapılacak şey basit: PHP scriptinin başında son oluşturulma tarihi gönderiyoruz HTTP başlığında, bir de Expires. Sonra da bu script her çağrıldığında GET_IF_MODIFIED_SINCE (şu tarihten beri değişmiş mi) türü çağrıları yokluyoruz. Bir tarayıcı (firefox vs.) önbelleğindeki bir sayfayı yeniden yüklerken bu GET_IMS çağrılarından yollar. Bizse, örneğin arama sonuç sayfaları için yarım saattir değişmediği bilgisi vs. gönderebiliriz. Ya da forum üst grupları için 5-6 dakikadır değişmediği, konular içinse 2-3 dakikadır değişmediği bilgisi gibi... Eğer yan etkiler konusu hakkında endişelerimiz varsa bunu yalnızca sistem yoğun olduğunda veya yoğun trafik olan saatlerde uygulatabiliriz.
Genel, her scriptin başında kullanabileceğimiz bir fonksiyon hazırlayalım:
Alıntı
<?php
function hizlan($miktar) {
$agent=$_SERVER['HTTP_USER_AGENT'];
if ( $miktar == 1 || preg_match("/bot/i",$agent) || preg_match("/Slurp/i",$agent) ) {
$fake_last_modified = gmdate('D, d M Y ', (time())) . "00:00:00 GMT";
$fake_expires = gmdate('D, d M Y ', (time())) . "23:59:59 GMT";
} else {
if ( $miktar < 5 ) $miktar = 5;
if ( $miktar > 30 ) $miktar = 30;
$saat=floor(gmdate('i',(time() - 00))/$miktar)*$miktar;
if ($saat == "0" ) $saat="00";
$sonsaat=floor(gmdate('i',(time() - 00))/$miktar)*$miktar+$miktar;
if ($sonsaat >= 60 ) $sonsaat="59";
$fake_last_modified = gmdate('D, d M Y H:', (time()));
$fake_last_modified .= $saat.":00 GMT";
$fake_expires = gmdate('D, d M Y H:', (time()));
$fake_expires .= $sonsaat.":00 GMT";
}
if ( getenv("HTTP_IF_MODIFIED_SINCE") == $fake_last_modified ) {
header("HTTP/1.1 304 Not Modified");
exit;
}
header('Last-Modified: '.$fake_last_modified);
header('Expires: '.$fake_expires);
}
?>
Evet, işlevin başında çağrının bir arama motoru örümceği tarafından mı yapılıp yapılmadığına bakıyoruz. Çünkü genelde bir sürü örümcek sürekli olarak çok linkli sitemizi tarar, geri gelip bir daha tarar. Bunlara o an yükledikleri sayfanın gün boyunca değişmeyeceği bilgisini gönderiyoruz ki aynı gün bir daha gelmesinler. Ayrıca özel bir durum olarak 1 dakika verilmişse süre olarak, gene tüm gün değişmediği bilgisi gönderiyoruz. Kimi sayfalar için bu özel durumu kullanmak isteyebiliriz.
Sonra ise önbellekte kalması istenen dakika parametresini sınırlar içine alıyoruz. En az 5 en çok 30 dakikalık sınırlar belirledik.
Sonra tarayıcıya gönderilecek Greenwich saatlerini hesaplatıyoruz. Bulunulan dakikanın belirtilen dakikadaki modülüsünün alt basamağından itibaren o kadar dakika boyunca değişmeyeceği bilgisi iletilecek. Bu yaklaşım ortalamada belirtilen dakikanın yarısı süresince önbellekleme sağlar.
Örneğin, saat 10:02'de bir sayfayı istemişsek, ve 5 dakikalık önbellekleme parametresi seçmişsek, bu fonksiyon bize o sayfanın 10:00'da oluşturulduğunu ve 10:05'e dek değişmeyeceğini söyleyecek. Bizse o sayfaya saat 10:04'te yeniden tıklarsak, bilgisayarımızdaki tarayıcı program sunucuya hiç uğramadan, doğrudan önbelleğinden sayfayı yeniden oluşturacak.
Bu yaklaşım, hem bant genişliği masrafını hafifletecektir, hem kullanıcıların sayfalar arasında daha hızlı dolaştığını hissetmesini sağlayacaktır, hem de sunucu bilgisayarın üstündeki işlem yükünü gayet hafifletecektir.
Kullanımı şöyle:
Alıntı
<?php
// Bir scriptin en başı
include("hizlan.php");
hizlan(10);
Bu örnekte 10 dakika boyunca o php scripti değişmeyecek bilgisi gönderdik.
Eğer sunucunun loadavg yükünü okuyabiliyorsak, yüke göre farklı bekleme süreleri belirtebiliriz:
Alıntı
<?php
function loadavg() {
$buffer = "0 0 0";
$f = fopen("/proc/loadavg","rb");
if (!feof($f)) {
$buffer = fgets($f, 1024);
}
fclose($f);
$load = explode(" ",$buffer);
return max((float)$load[0], (float)$load[1], (float)$load[2]);
}
?>
Bu işlev sunucu bilgisayarın yükünü döndürür.
Yukardaki örneğin içine gömersek:
Alıntı
<?php
// Bir scriptin en başı
include("hizlan.php");
include("loadavg.php");
$yuk=loadavg();
if ( $yuk > 5 ) {
hizlan(30);
} elseif ( $yuk > 4 ) {
hizlan(20);
} elseif ( $yuk > 1 ) {
hizlan(10);
} else
hizlan(5);
}
Ya da saate göre yaparız. Örneğin Saat 16 - 19 arası genelde Türkiye'de internet yoğundur. Eğer sunucu Türkiye'de değil ise uygun saat kaymalarını hesaba katmayı unutmayarak, şu örnekteki gibi bir hızlanma uygulaması yapabiliriz:
Alıntı
<?php
// Bir scriptin en başı
include("hizlan.php");
if ( date('G') >= 16 && date('G') <= 19 ) {
hizlan(10);
} else {
hizlan(5);
}
Sanıyorum, kimi php sayfalarında bunun epeyi yararı olacaktır.
İşe yaraması dileğiyle.