Php’ de Dizi Sorgulamasında Performans

Tarih: Haziran 29th, 2009 | Yazar: Ertuğrul Erkan | Kategori: Php | Etiketler: , , , , , , | 2 Yorum »

Merhaba arkadaşlar. Php de Performans isimli yazımda sizlere genel hatları ile nasıl daha sağlam sistemler elde ederiz konusunda bilgiler vermiştim. Fakat bazı durumlar oluyor ki genel hatlar dışında da bilmek gereken noktalar lazım oluyor. Özellikle Php nin yapı taşı olan diziler konusunda yapılacak teknikler mevcut…

Birçok dilde veri tiplerini belirtebiliyoruz. Fakat Php de bu tam olarak mevcut değil. Veri tiplerinden kastım; string, int, array gibi sayı mı yoksa metin mi yoksa dizi mi olduğu. Bu diller bilgileri saklarken ram üzerinde belirli bölmeler yaratırlar ve katagorize ederek verileri yerleştirirler. Yalnız Php’ de her string bir dizi şekline gidilmiş. Yani bir; $veri = "veri"; dediğimizde echo $veri[0]; yaparsak v yazacaktır…

Genelde diziler verileri saklamak için kullanılan ideal veri tipleridir. Fakat dizileri sorgularken sürekli baştan başa dönmesi bize gereksiz bir performans kaybı sağlayacaktır. Foreach veya For döngüleri hep dizileri baştan sonuna kadar götürür. Mesela şöyle bir sorgulama yapsak;

<?php
$veri = array("veri1","veri2","veri3");
foreach($veri as $tek) {
if($tek=="veri2") {
echo "bulundu";
}else{
echo "bulunamadı";
}
}
?>

Bir defa bulundu, iki defa bulunamadı yazacaktır. Halbuki bulunduğu noktada döngüyü kesse gerisindeki verilerin sorgulanmasına gerek kalmayacaktı. Bu sayede performans elde edilecekti. Tabi 3 tane veri sorgulamakta elde edilen sonuçlar pek değişmez ama binlerce rakam döndüğünü düşünsenize. Belkide ilk sırada gerekli veri yer alıyor ve devamına hiç gerek yok!

İşte bu gibi durumlar için Php geliştiricileri bizlere script’ in geri kalanını öldürmemizi söylüyorlar. Yani;

<?php
$veri = array("veri1","veri2","veri3");
foreach($veri as $tek) {
if($tek=="veri2") {
die("bulundu");
}else{
echo "bulunamadı";
}
}
?>

Arkadaşlar dikkat ettiyseniz burada die(); komutu devreye giriyor. Türkçesi de öldür demek zaten. Dizi de gerekli veri bulunduğu anda if true yani doğru düşürecektir ve die sayesinde tekrar sorgu yapılmayacaktır. Fakat bu sorguda bir defa bulunamadı, bir defa bulundu yazacaktır. Halbuki biz bulunduğu taktirde sadece bulundu, bulamadığı taktirde de bulunamadı yazsın demesini istiyoruz. Şimdi mantığına bir bakalım;

Die(); komutu çalıştığı anda ondan sonra gelen tüm sorgular öldürülüyor değil mi? O zaman;

<?php
$veri = array("veri1","veri2","veri3");
foreach($veri as $tek) {
if($tek=="veri2") {
die("bulundu");
}
}
echo "bulunamadı";
?>

Arkadşalar burada sorgu dönüyor, dönüyor; her seferde bir alt satıra geçiliyor. Die komutu görüldüğü anda komut öldürülüyor ve echo “bulunamadı”; komutu çalışmıyor. Fakatt eğer ki if sorgusu hiç true düşmezse alt satırdaki bulunamadı yazdırılıyor. İşte hepsi bu…

Velhasıl böyle komutların hepsini bilmek gerek. Gereksiz yere binlerce satır çevirilmesi yerine gerektiği yerde sistemi kapatmak en doğrusu. Die(); genelde scriptin ondan aşağısındaki bütün fonksiyonlarını öldürdüğü için pek kullanılmaz. Fakat böyle bir döngü kullanmak istiyorsanız vazgeçilmesi…

Herkese iyi günler, iyi çalışmalar…

Benzer Yazılar;


“Php’ de Dizi Sorgulamasında Performans” yazısında 2 Ahkam var.

  1. 1 Mustinet 14:01 on Haziran 29th, 2009 anında kesmiş:

    @EeTr : Burada die tüm betiğin çalışmasını durduracağı için senin de dediğin gibi pek tercih edilmez. Die tüm betiğin durdurmak istediğimiz zamanlarda işimize yarar. Ama döngüleri durdurmak için break; kullanımı daha uygundur. Bu sayede tüm betiği durdurmuş olmayız.

  2. 2 EeTr 15:01 on Haziran 29th, 2009 anında kesmiş:

    Evet zaten belirtmiştim. Yalnız bazı durumlar oluyor; özelliklede güvenlik ihlaleleri gibi. O zaman durdurmak en yararlısı çünkü ufacık bir kod bile bütün veritabanını dağıtmaya yarayabilir…


Ahkam Kesme Aparatı