Tweet

Php Performans İpuçları

Bir web sayfasını hergün yüzlerce hatta binlerce ziyaretçi ziyaret edebilir. Büyük örneklere bakacak olursak google,facebook,hotmail gibi servislerin hergün milyonlarca kişi tarafından ziyaret edildiğini görebiliriz. Web sayfası hazırlanırken sadece bir işlevi gerçekleştirmekten ziyade kullanıcıların sayfaya en hızlı şekilde erişebilmesini sağlamak daha önemli bir konudur. [...]

Sayfanın yüklenme hızının orantısal olarak yüksek oluşu yine aynı bağlamda ziyaretçi kaybı anlamına gelmektedir. Çünkü ziyaretçiler bir web sayfasının yüklenmesini beklemekten hiç hoşlanmazlar. Bu konuda bir çok istatistik yapılmıştır ve sonuçlar doğrultusunda varılan sonuç ziyaretçilerin geç açılan bir web sitesini ikinci ya da üçüncü denemeden sonra tekrar ziyaret etmediğidir. Şayet ziyaretçi kitlenizin dağılmasını istemiyorsanız bazı prosedürlere dikkat etmelisiniz. Bunun göreceli bir kavram olduğunu söyleyebiliriz çünkü sayfanın geç açılmasının bir çok nedeni olabilir ve kullanıcı nihayetinde hiç bir zaman internet bağlantısının yavaş olduğu ihtimalini göz önünde bulundurmayacaktır. Bu durumda bazı püf noktaları harekete geçirerek performansı maximize etmek durumundayız. Bunun için izlenilmesi gerekilen birçok farklı yöntem bulunmakta.

Css Sprite Tekniğinden Faydalanın

Css Sprite tekniği arayüz programcılarının sıklıkla başvurması gereken bir yöntemdir. Css Sprite tekniği ile bir çok görsel tek bir görsel üzerinde konumlandırılarak tek bir parça resmin açılışta yüklenmesi sağlanabilir. Örneğin şu şekilde bir stil tanımlaması kullanıyor olalım;

CODE:
.image
{
width:50px;
height:50px;
background-image:url("image1.png");
}

.image2
{
width:50px;
height:50px;
background-image:url("image2.png");
}


Görüldüğü gibi iki farklı sınıf ve iki farklı resmin ayrı ayrı çağırılması söz konusu. Dolayısı ile iki resmin yüklenmesi daha fazla sürecektir. Bunun yerine resimlerimizin 100px genişliğinde ve 50px yüksekliğinde bir resim üzerinde yer alması daha mantıklı olabilirdi. Sadece bu resmi çağırarak iki ayrı resmi sayfa üzerinde yine ayrı ayrı işleyebilirdik. Bunun için background-position ifadesinden faydalanıyoruz. Elbette bu biraz zahmetli olabilir her defasında şu şekilde bir tanımlama yapmak;

CODE:
.sprites {
background-image : url(sprite.png);
background-color : transparent;
background-repeat : no-repeat;
}

#image1 {
height : 50px;
width : 50px;
background-position : -51px -0px;
}


Kullanımı;

CODE:
<div class="sprites" id="image1"></div>


Bunların yerine bu işi daha basite indirgemek için online sprite araçlarını kullanabiliriz.

http://css-sprit.es/ bu konuda başarılı ve kabul görmüş bir servis.

Dinamik Cache Uygulayarak Hız Kazanın

Apache sunucusunda .htaccess dosyaları ile bazı optimizasyonlar yapabiliyoruz. Doğru optimizasyon ve konfigürasyonlar ile sunucu üzerindeki gereksiz yükü hafifletmek mümkündür. Bir client HTTP isteğinde bulunduğunda Web Server öncelikle talep edilen isteği analiz eder ve ardından istemci tarafına istenileni gönderir. Bu request-response işlemi her tekrarlandığında Web Serverdan aynı dosyalar tekrar yüklenecektir. Bir web sayfasında değişiklik olmasa dahi sayfanın yüklenmesi bir yavaşlama sebebidir. Bu problemi gidermek için .htaccess içerisinde max-age(yaşam süresi) tanımlaması yapmamız yeterlidir.

Peki hangi alanların yaşam süresini belirlersek ikinci yüklemede hız kazanmış oluruz? Elbette grafik dosyaları. Bir web sayfasının genel yükünü grafik dosyaları oluşturuyor. Basit bir tanımlama ile belirteceğimiz uzantıdaki grafik dosyalarının sadece bir kez yüklenmesini sağlayabilir ve ziyaretçinin sayfayı ikinci kez ziyaret ettiğinde aynı grafik dosyalarının yüklenmesini engelleyerek açılış hızını büyük oranda artırabiliriz.

max-age saniye formatında bir değer alır. Bir grafik dosyasının yaşam süresini saniye cinsinden hesaplayarak değer olarak verebiliriz. Örneğimizde grafik dosyalarının 1 haftalık yaşam süresine sahip olmasını sağlayalım;

CODE:
<FilesMatch ".(gif | jpeg | jpeg | png |)$">
Header set Cache-Control "max-age=604800"
</FilesMatch>


Elbette sadece grafik dosyalarının yaşam süresini ayarlamak yeterli değil. Web sayfalarımızda aktif olarak javascript ve css dosyalarıda her sayfa yüklenmesinde çağırılmaktadır. Bu uzantılar içinde yaşam süresi atayabilirsiniz.

Gzip Kullanarak İçeriği Sıkıştırın

Bir çok web tarayıcısında artık sıkıştırılmış içeriği destekleme özelliği bulunuyor. Bu nedenle içeriği sıkıştırmak sayfa performansını artıracaktır. Php ile sayfa içeriğini sıkıştırmak için ob_gzhandler fonksiyonundan yararlanırız. Her ne kadar sıkıştırılmış içeriği desteklemeyen tarayıcılar çok az olsada yinede bu ihtimali göz önünde bulundurarak bir if blogu içerisinde tanımlanması daha doğrudur.

CODE:
<?php
if(ob_start("ob_gzhandler"))ob_start();
?>


Harici Kaynaklardaki Dosyaları Sunucunuza Yükleyerek Çağırın

Bir javascript dosyasının x.com/jquery.js adresinde olduğunu varsayalım. Ve şu şekilde çağıralım;

CODE:
<script src="x.com/jquery.js" type="text/javascript"></script>


x.com daki sunucu yavaşlığı sizin web sayfanızıda otomatik olarak etkileyecektir. Javascript dosyasının yüklenmesi için sayfa bir süre bekleyecektir ve bu bekleme süreside açılış hızınızı oldukça yavaşlatacaktır. Harici kaynaklardan resim ya da javascript dahil etmekten kaçınmalısınız. Bunun yerine bu kaynaklardaki dosyaları kendi sunucunuza yükleyerek direkt olarak çağırmalısınız.

CODE:
<script src="jquery.js" type="text/javascript"></script>


Bu şekilde daha hızlı çağırılacağından emin olabilirsiniz.

Büyük Grafik Dosyaları İle Çalışmayın

Birçok kişi kod yazarken büyük resimleri yanlış küçülterek kullandığı için web sayfalarının açılış hızları muazzam derecede yavaş. 200*150 ebatında bir resim elde etmek için 1366*900 px lik bir resmin yüklenmesinin mantıklı bir davranış olmadığı kesin. Size 200*150 px lik bir çıktı yansıtılır ancak bu yansıtılan çıktının dosya büyüklüğü değişmez sadece size gösterilen açısı küçültülür. Yani fiziksel bir küçültme söz konusu değildir. Dolayısı ile yavaşlama kaçınılmazdır.

Örneğin bir üyelik sisteminiz var ve üyelerinizin sayfa içerisinde resimlerini gösterdiğinizi varsayalım. Kullanıcıya sadece 30kblık bir resim yüklemesini söylemeniz sizin yetersizliğinizi yansıtabilir. Ya da en azından böyle algılanmasına neden olabilir. Bunun yerine kullanıcılarınızın yüklediği resimleri küçülterek kaydedebilirsiniz ve bu fiziksel küçültme sonucunda dosya boyutlarınıda küçültmüş olarak sayfaya yansıtabilirsiniz. Örnek bir uygulama ile bu konuyu ele alalım şimdi;

Bir form aracılığı ile post edilen resimleri alarak küçültme işlemine sokacağız, ardından istediğimiz bir klasöre küçülterek kaydedeceğiz;

form.html

CODE:
<form name="upload" method="post" action="yukle.php" enctype="multipart/form-data">
<input type="file" name="resim" id="resim" lang="tr" /><br />
<input type="submit" name="gonder" id="gonder" value="Yükle"/>
</form>



yukle.php

CODE:
<?php
if ($_POST["gonder"] == "Yükle") {
$kaynak = $_FILES["resim"]["tmp_name"];
$klasor = "resimler/";
$yukle = $klasor . basename($_FILES['resim']['name']);
if (move_uploaded_file($kaynak, $yukle)) {

$dosya = "resimler" . $_FILES['resim']['name'];
$resim = imagecreatefromjpeg($dosya);

$boyutlar = getimagesize($dosya);
$resimorani = 800 / $boyutlar[0];
$yeniyukseklik = $resimorani * $boyutlar[1];
$yeniresim = imagecreatetruecolor("800", $yeniyukseklik);

imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, "800", $yeniyukseklik, $boyutlar[0], $boyutlar[1]);


$hedefdosya = "resimler/thumb/" . $_FILES['resim']['name'];
imagejpeg($yeniresim, $hedefdosya, 100);
chmod($hedefdosya, 0755);

$buyukResim = "$dosya";
unlink($buyukResim);
}


}

?>


Burada öncelikle formdan gelen veriyi alıp belirttiğimiz bir dizine kaydettik. Ardından bu resim üzerinde küçültme işlemi yaptık ve resmin küçültülmüş halini başka bir dizine kaydettik. Ardından büyük resim ile işimiz bittiği için bu resmi sildik. Mantığı oldukça basit geliştirerek ve kontrollerini ekleyerek kullanabilirsiniz. Elbette yüklenen bu resmi yeniden adlandırabilir ya da veritabanına kaydederek dinamik bir yapıya sokabilirsiniz.

resim.jpg = 1024*900px
Özetle kesinlikle <img width="200" height="150" src="resim.jpg "/> yanlış bir yöntemdir.

Bunun yanı sıra otomatik yenileme kesinlikle kullanılmamalıdır. Güncellenmesi gereken kısımlarda ajax kullanılmalı ve tarayıcının sayfa yenilemesinin önüne geçilmelidir.

Php Kodlama İpuçları İle Sayfalarınızı Hızlandırın

Php içerisinde bir çok fonksiyon aynı işlemi yapabilir. İlk başlarda aklınıza aynı işi yapan birçok fonksiyonun ya da parametrenin oluşu saçmalık gibi gelebilir ancak kesinlikle öyle değil. Php de bazı fonksiyonlar birbirlerinin aynı işi yapıyor gibi görünsede durum çok ince ayrıntılarda saklıdır.

Örneğin Print ekrana yazdırma komutudur. Aynı işi Echo da yapmakta. Çok ince bir detayda olsa Echo print komutundan daha hızlı sonuç verdiği için sıklıkla echo komutunu kullanmalısınız.

Diğer bir nokta ise değişkenlerdir. Değişkenler fiziksel bellekte yer kaplayan birimlerdir. Eğer bir değişkenin aldığı değer kullanılmıyorsa bu değer unset() ile bellekten silinmelidir. Aksi taktirde çok büyük verilerin işlendiği bir uygulamada işlemciye aşırı yük binebilir ve doğal olarak sayfanız yavaş yanıt verebilir.

Ek olarak veritabanı işlemleri gerek sunucuyu gerekse sayfa hızını etkileyen önemli bir faktördür. Bu nedenle her işlem sonrasında veritabanı bağlantınızı kapatmalısınız. Eğer bununla uğraşmak istemiyorsanız mysql_connect ifadesi yerine mysql_pconnect kullanarak sadece ihtiyaç duyulduğunda bağlantının açılıp işlem bittiğinde otomatik kapnamasını sağlayabilirsiniz. Daha önce başka bir makalede Dia'nın da belirtmiş olduğu gibi tek tırnaklar çift tırnaklardan daha hızlı sonuç vermektedir. Çünkü çift tırnak kullanıldığında php tırnakların içerisinde başka bir değişken olup olmadığını kontrol edecektir ve bu milisaniyelik de olsa yavaş çalışması anlamına gelmektedir.

Unutmadan yazılımcı olabilirsiniz ancak iyi bir yazılımcı olmak püf noktalarda gizlidir.


Oguzz
oguz@thecoders.net
30 Ocak 2012 14:05

İlgili Olabilecek Makaleler


Yorumlar (2)





Dia
3 Subat 2012 00:30
Alıntı:
Harici Kaynaklardaki Dosyaları Sunucunuza Yükleyerek Çağırın

Bir javascript dosyasının x.com/jquery.js adresinde olduğunu varsayalım. Ve şu şekilde çağıralım;

CODE:
CODE:
<script src="x.com/jquery.js" type="text/javascript"></script>



x.com daki sunucu yavaşlığı sizin web sayfanızıda otomatik olarak etkileyecektir. Javascript dosyasının yüklenmesi için sayfa bir süre bekleyecektir ve bu bekleme süreside açılış hızınızı oldukça yavaşlatacaktır. Harici kaynaklardan resim ya da javascript dahil etmekten kaçınmalısınız. Bunun yerine bu kaynaklardaki dosyaları kendi sunucunuza yükleyerek direkt olarak çağırmalısınız.

CODE:
CODE:
<script src="jquery.js" type="text/javascript"></script>



Bu şekilde daha hızlı çağırılacağından emin olabilirsiniz.


Yazıyı çok beğendim klavyene sağlık Oğuz ancak yazının bir bölümüne eklemek istediklerim var. Burada anlattığın olay duruma göre değişir. Resim kendi sunucumuzdan daha hızlı bir sunucuda ise resim dosyası daha hızlı yüklenir. Ayrıca tüm dosyalar kendi sunucumuzda olduğunda sayfa yüklenirken sıra halinde yüklenecektir. Yani 1. resim yüklenmeden 2. resim yüklenmeyecektir. Fakat 2 resim farklı sunucularda olduğunda sayfaya birbirinden bağımsız yüklenirler. Zaten bu nedenle webpage optimizerlar CDN leri önerir.



Oguzz
4 Subat 2012 13:40
Doğru; ekleme için teşekkürler Okan, tabi aynı zamanda sunucunun yükleme hızınında oranı etkili olabilir, burada dikkat edilmesi gerekilen ziyaretçinin dosyanın yüklendiği adrese ulaşabilme hızıdır. Uzak adrese ulaşımda problemler oluyor olabilir dns ile ilgili sorunlar yaşıyor olabilir örneğin türkiye kaynaklı barınan bir sunucuya türkiyeden erişmek ile yurtdışında barınan sunucuya türkiyeden erişmek arasında hız farkları olabiliyor. Ama sonuçta dediğin doğru kısacası hızlı sunucularda ve sorunsuz sunucularda dosya barındırmak şayet kendi sunucumuzdan daha hızlıysa tercih edilebilir. Bazı internet siteleri bu gibi dosyaları için ayrı bir sunucu açarak oradan dosya çağırabiliyorlar.

Ziyaretçi olarak yorum yazamazsınız. Üye olmak için tıklayın Üye iseniz giriş yapın.



MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg