PHP'de performans

phpBB için Arama Motoru Optimizasyonu

PHP'de performans

İleti sabri ünal 31.08.2006, 00:50

uzun zamandır PHP'de performans ile ilgili bir yazı arıyordum, sonunda bu gece buldum ve foruma ekliyorum... burdaki noktaları geliştirmelerimizde dikkate alırız umarım...

İlk uygulamalarımızı geliştirdikten bir süre sonra clean code ve hızlı çalışan scriptler yazamamış olmaktan endişe ederiz. Bu yazıda hızlı çalışan scriptler için bazı öneriler bulacaksınız.

Öncelikle belirtmeliyim ki, PHP scriptlerinin hızlı çalışması için yapacağınız düzenlemeler çoğu kez kayda değmeyecek iyileştirmeler sağlar. Ama yine de kod yazma alışkanlıklarımızı geliştirmek fayda sağlayacaktır.

YAZDIRMA KOMUTLARI

İlk olarak bilmemiz gereken şey, PHP'de tek tırnak işaretlerinin string yani metin, çift tırnak işaretlerinin değişken içeren metin ve hiç tırnak kullanmamanın da yazı fonksiyonlarında değişken, değişkenlerde ise sayılar için kullanıldığıdır. Ayrıca işlemlerde öncelik belirleme durumları dışında parantezlerin öneminin olmadığını da unutmamalıyız. Örnekler:

Kod: Tümünü seç
$foo='bu bir metindir';
$bar='Ahmet';
$foo="Merhaba, $bar"; //Merhaba, Ahmet
$foo='Merhaba, $bar'; //Merhaba, $bar
$foo=10;


Eğer çift tırnak kullanırsanız PHP burada bir değişkeni dahil etmeye hazırdır. Oysa ki tek tırnak kullanırsanız, değişken okumak gibi bir durum söz konusu değildir. Dolayısı ile daha hızlıdır. Yani;

Kod: Tümünü seç
echo 'bu bir metindir'; //daha hızlı
echo "bu bir metindir"; //daha yavaş


Bunun yanında bir değişkene çift tırnak içinde yer vermek yerine nokta "." ile eklemek de daha hızlıdır.

Kod: Tümünü seç
$bar='Ahmet';
echo $bar.', Merhaba'; //daha hızlı
echo "$bar, Merhaba"; //daha yavaş


Gereksiz yere echo veya print fonksiyonlarını kullanmak performans kaybına neden olur. Örnek;

Kod: Tümünü seç
echo "Merhaba";
echo "$bar"; //daha yavaş
echo 'merhaba'.$bar; //daha hızlı


Eğer yazdırılacak metin parça parça eklenecek ise, bunu önce bir değişkene eklemek sonra yazdırmak daha hızlıdır. Ancak tüm yazım işlerini böyle yaparsanız çok fazla değişken kullanarak hafızaya yüklenmiş olursunuz. Örnek;

Kod: Tümünü seç
$metin='Merhaba';
$metin.=$bar;
echo "$metin"; //yavaş
echo $metin; //en hızlısı


Bir diğer konu da echo veya print fonksiyonlarının kullanımıdır. Prensip olarak echo ile yapabileceğiniz işi diğerleri ile yapmayınız. Çünkü echo sadece yazdırma işini yaparken print yazdırma işinin ardından true veya false olarak bir değer döndürür. Çoğu kez buna ihtiyacımız yoktur. printf veya printr ise gerekmedikçe kullanılmamalıdır.

SORGULAR

Veritabanı sorgularında performans açısından mümkün olduğunca çok işi SQL sorgusunda yapmak ve sorgu sayısını en az seviyede tutmak prensip olmalıdır. Yani veritabanından her hangi bir sınırlama yapmadan bilgi çekip sonra PHP ile if else operatörleri ile veriyi filtrelemek performans açısından olumsuzdur.

PHP PARSER

PHP parser HTML kodlarını kontrol etmez, dosyaya eklenen fonksiyon veya class ların kullanılsın veya kullanılmasın tümünü kontrol eder. Parser ve compilerın servis hızına göre

HTML veya PHP olmayan kodlar //kontrol yok en hızlı
Dosya içindeki PHP kodları //daha yavaş
Fonksiyon ve sınıflar //daha da yavaş
Include veya Require //en yavaş

şeklinde işlenir.

Buna göre;

* Sık ve farklı dosyalardan çağrılmayacak kodlar için fonksiyon kullanmak
* Kod yoğunluğundan dolayı bakım ve güncelleme zorluğu olmayan dosyalarda class kullanmak
* Fonkisyonları çok sayıda harici dosyada tutup bunları sayfaya (çok sayıda) include etmek
* HTML kodlarını PHP kodu içinde yazmak


performans kaybına neden olur.

Bu durumlardan fonksiyon ve classlar ile ilgili olanlar tasarıma göre göze alınabilir. Bunun yanında include veya require fonksiyonları yerine include_once veya require_once fonksiyonları kullanılmalıdır.

HTML için örnek:

Kod: Tümünü seç
if(!isset($A1) {
echo "<input type=\"text\" name="A1\" value=\"$foo\">";
}
echo"<input type=\"submit\" name=\"ok\" value=\"Gönder\">";


yerine

Kod: Tümünü seç
<?
if(!isset($A1) {
?>
<input type="text" name="A1" value="<?=$foo ?>">
<? } ?>
<input type="submit" name=ok" value="Gönder">


daha hızlıdır ve daha kolay okunur.

DOSYALAR

Mümkün olan en az sayıda dosya işlemi yapılmalıdır. Dosyadan okumak yerine vertabanından okumak tercih edilmelidir.

DÖNGÜLER

Dizi işlemlerinde eğer dizi çok küçük değilse foreach kullanmak yavaştır. Çünkü foreach dizinin kendisinde değil yarattığı bir kopyasında çalışır. Bunun yerine for döngüsü tercih edilebilir. Ancak diziyi saydırma işini önceden yapmak daha hızlıdır. Yani;

Kod: Tümünü seç
for($i=0;$i<count($dizi);$i++) { ..... }


yerine

Kod: Tümünü seç
$m=count($dizi);
for($i;$i<$m;$i++) {...... }


çünkü ilk yazım şeklinde döngü devam ettiği sürece her defasında dizideki elemanları tekrar saydırırsınız, bu hem gereksiz hem de zaman kaybettiren ama yazım kolaylığı olan bir tarzdır.

SAYILAR

Sayıları tırnak içinde kullanmak onları string yapar ve bu da yavaştır. Örnek:

Kod: Tümünü seç
for($i="0";$m="15";$i++) { .... } //yavaş
for($i=0;$m=15;$i++){.... } //hızlı


HAFIZA

Eğer bir değişkene büyük bir veri atarsanız kullanımdan sonra bunu sıfırlamanız iyidir. Değişkene 0 veya null değeri atayarak yapabilirsiniz.
Bununla birlikte MySQL sorgularınızdan sonra

Kod: Tümünü seç
mysql_free_result($degisken);


fonksiyonu ile aynı şekilde hafızanın daha optimum kullanımını sağlayabilirsiniz.

Ayrıca PHP komplike ifadeleri başarı ile destekler. bu nedenle değişken kullanmadan yapabileceğiniz işleri komplike ifadeler ile yapmanız uygundur. Örnek;

Kod: Tümünü seç
$kontrol=mysql_num_rows($sorgu);
if($kontrol<1) {.... }


yerine

Kod: Tümünü seç
if(mysql_num_rows($sorgu)<1) {.... }


hafızayı daha etkin kullanmanızı sağlar.

DÜZENLİ İFADELER

String Manipülasyon (str fonksiyonları) en hızlısıdır, Perl Tipinde düzenli ifadeler (preg..) daha yavaş, POSIX (ereg..) en yavaşıdır.

MySQL

Eğer konfigürasyonunuz uygun ise kalıcı (persistent) bağlantı kurmanız , her sorgudan önce bağlantı kurmaktan daha hızlıdır.

Umarım faydalı bir yazı olmuştur.

Senih Özkiper (xeno)

http://www.php.org.tr/index.php?option= ... &Itemid=28
Mutluyum, biraz komedi takılıyorum! sakın kızmayın yakında geçer, sebebini ben de bilmiyorum! yeni bir aşk da bulmuş değilim!
Kullanıcı avatarı
sabri ünal
Üye
Üye
 
İleti: 1325
Kayıt: 27.10.2005, 15:49
Konum: İstanbul

İleti DeViLJiN 31.08.2006, 09:02

güzel döküman ;), bi kaçını uyguluyorum zaten sql komutu ne kadar çoksa site o kadar yavaşlıyo, kodlar arttıkça yine yapaşlıyo, örneğin bunun dışında sitedeki resimleri bile en küçük boyutta kullanıyorum (cellpic vs.), gerçekten fark yüksek çıkıyo, herkese tavsiyem şudur ki modları kurmadan önce (gereksiz modları :)) sql komutu yeni tablo oluşturuyorsa yavaşlamaya sebep olacaktır, özelliklede topic ve userlerle ilgili modlarda sql komutları veritabanında daha çok yer kaplar ;)
Kullanıcı avatarı
DeViLJiN
Üye
Üye
 
İleti: 58
Kayıt: 07.08.2006, 12:21
Konum: Çorum


Arama Motoru Optimizasyonu



Kimler çevrimiçi

Bu forumu görüntüleyenler: Kayıtlı kullanıcı yok ve 0 misafir

cron