tepisenordek
08-11-2007, 20:46 PM
PHP'de kodlama yaparken yazım tarzımızdaki ufak değişikliklerle performansımızı arttırabiliriz.
Bununla ilgili Türkiye PHP Grubu'nun sitesinde rastladığım bir makaleyi paylaşıyorum...)
İ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:
PHP:
1.
2. <?php
3. $foo='bu bir metindir';
4. $bar='Ahmet';
5. $foo="Merhaba, $bar"; //Merhaba, Ahmet
6. $foo='Merhaba, $bar'; //Merhaba, $bar
7. $foo=10;
8. ?>
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;
PHP:
1. echo 'bu bir metindir'; //daha hızlı
2. echo "bu bir metindir"; //daha yavaş
Bunun yanında bir değişkene çift tırnak içinde yer vermek yerine . ile eklemek de daha hızlıdır.
Yani;
PHP:
1. $bar='Ahmet';
2. echo $bar.', Merhaba'; //daha hızlı
3. echo "$bar, Merhaba"; //daha yavaş
Gereksiz yere echo veya print fonksiyonlarını kullanmak performans kaybına neden olur. Örnek;
PHP:
1. echo "Merhaba";
2. echo "$bar"; //daha yavaş
3. 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;
PHP:
1. $metin='Merhaba';
2. $metin.=$bar;
3. echo "$metin"; //yavaş
4. 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:
PHP:
1. if(!isset($A1) {
2. echo "<input type=\"text\" name="A1\" value=\"$foo\">";
3. }
4. echo"<input type=\"submit\" name=\"ok\" value=\"Gönder\">";
yerine
PHP:
1. <?php
2. if(!isset($A1) {
3. ?>
4. <input type="text" name="A1" value="<?=$foo ?>">
5. <? } ?>
6. <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;
PHP:
1. for($i=0;$i<count($dizi);$i++) { ..... }
yerine
PHP:
1. $m=count($dizi);
2. 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:
PHP:
1.
2. <?php
3. for($i="0";$m="15";$i++) { .... } //yavaş
4. for($i=0;$m=15;$i++){.... } //hızlı
5. ?>
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 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;
PHP:
1. $kontrol=mysql_num_rows($sorgu);
2. if($kontrol<1) {.... }
yerine
PHP:
1. 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)
Bununla ilgili Türkiye PHP Grubu'nun sitesinde rastladığım bir makaleyi paylaşıyorum...)
İ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:
PHP:
1.
2. <?php
3. $foo='bu bir metindir';
4. $bar='Ahmet';
5. $foo="Merhaba, $bar"; //Merhaba, Ahmet
6. $foo='Merhaba, $bar'; //Merhaba, $bar
7. $foo=10;
8. ?>
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;
PHP:
1. echo 'bu bir metindir'; //daha hızlı
2. echo "bu bir metindir"; //daha yavaş
Bunun yanında bir değişkene çift tırnak içinde yer vermek yerine . ile eklemek de daha hızlıdır.
Yani;
PHP:
1. $bar='Ahmet';
2. echo $bar.', Merhaba'; //daha hızlı
3. echo "$bar, Merhaba"; //daha yavaş
Gereksiz yere echo veya print fonksiyonlarını kullanmak performans kaybına neden olur. Örnek;
PHP:
1. echo "Merhaba";
2. echo "$bar"; //daha yavaş
3. 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;
PHP:
1. $metin='Merhaba';
2. $metin.=$bar;
3. echo "$metin"; //yavaş
4. 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:
PHP:
1. if(!isset($A1) {
2. echo "<input type=\"text\" name="A1\" value=\"$foo\">";
3. }
4. echo"<input type=\"submit\" name=\"ok\" value=\"Gönder\">";
yerine
PHP:
1. <?php
2. if(!isset($A1) {
3. ?>
4. <input type="text" name="A1" value="<?=$foo ?>">
5. <? } ?>
6. <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;
PHP:
1. for($i=0;$i<count($dizi);$i++) { ..... }
yerine
PHP:
1. $m=count($dizi);
2. 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:
PHP:
1.
2. <?php
3. for($i="0";$m="15";$i++) { .... } //yavaş
4. for($i=0;$m=15;$i++){.... } //hızlı
5. ?>
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 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;
PHP:
1. $kontrol=mysql_num_rows($sorgu);
2. if($kontrol<1) {.... }
yerine
PHP:
1. 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)