Çıktı Biriktirme (output buffering) ve Spagetti PHP template dosyaları

| 31 Aralık 2011 | Hiç yorum yok

Gordon barajı, Wikimedia Commons.

Merhaba, bu makalemizde output buffering (çıktı biriktirme) konusunda bilgiler vermeye çalışacağım. Daha önceki makalelerimiz de PHP de işlem yaptığımız değişkenleri echo ile çıktı verdiğimizden bahsetmiştik. Genel olarak internette bulunan bir çok php örneğinde sayfaların hemen her yerinde echo ile eldeki değişkeni direkt olarak çıkışa yönlendiren bir model söz konusu, bu yaklaşım, hem performans, hemde session_start() gibi, tarayıcıya çıktı vermeden önce gerçekleştirilmesi gereken işlemlerin organizasyonu için önemlidir. Kodun bir çok yerinden çıktı vermek ve veya kontrolsüz spagetti php kullanmak, ilerleyen aşamalarda gereken debug işlemlerinde programcıya çok büyük sorunlar çıkarmaktadır. Bu yüzden ideal çıktı metodu, tüm işlemler bitirildikten sonra kod sonunda yapılan tek echo modelidir. Bu sayede hem dönem dönem meydana gelen headers_send problemi ile karşılaşılmayacak hemde tek echo ile TCP paketlerinde oluşan fragmentasyon minimize edilecektir.
ana_template.php

<!DOCTYPE html>
<html>
  <head>
    <title><?php echo $sayfa_baslik;?></title>
  </head>
  <body>
    <p>
<?php echo $sayfa_icerik;?>
</p>
  </body>
</html>

Yukarıda verilmiş spagetti PHP modeli bir template dosyamız olsun normal şartlarda bunu bir önceki makalemizde verdiğimiz koda benzer bir kodla index.php ile birleştirmemiz mümkün.

index.php

<?php
define('DA',DIRECTORY_SEPERATOR); // DA -> dizin ayracının kısaltılmışı
define('KDIZ',dirname(__FILE__).DA); // KDIR -> kök dizinin kısaltılmışı
 
$sayfa_basik = 'Maraba Televole';
$sayfa_içerik = 'İşte ben geldim';
 
include(KDIZ.'ana_template.php'); // <- bu ekleme ile birlikte sayfa çıktısı verilecektir.
?>

Buraya kadar herşey normal. Şimdi PHP’de Değişkenler ve Diziler makalesinde verdiğimiz manav örneğini kodumuza ekleyelim.

manav.php
<?php
$stok['sebze']['patlıcan'] = 1.5;
$stok['sebze']['domates'] = 1.25;
$stok['sebze']['biber'] = 2.85;
$stok['sebze']['soğan'] = 0.5;
$stok['sebze']['pırasa'] = 3;
 
$stok['meyve']['portakal'] = 1.35;
$stok['meyve']['mandalina'] = 1.05;
$stok['meyve']['elma'] = 1;
$stok['meyve']['armut'] = 2;
$stok['meyve']['kivi'] = 5;
foreach ($stok as $reyon => $urunler) { //1. basamak sebze veya meyve
    echo "Reyon : ".$reyon." <br/>";
    foreach($urunler as $urun => $fiyati) { // 2. basamak ürün ve fiyatları
        echo "Ürün : ".$urun." - Fiyatı :".$fiyati." <br/>"; // her eleman için attığın turda elemanın adını ve fiyatını ekrana bas.
    }
}
?>

manav.php yi index.php dosyamıza ekliyelim

<?php
define('DA',DIRECTORY_SEPERATOR); // DA -> dizin ayracının kısaltılmışı
define('KDIZ',dirname(__FILE__).DA); // KDIR -> kök dizinin kısaltılmışı
$sayfa_basik = 'Maraba Televole';
$sayfa_içerik = 'İşte ben geldim';
include(KDIZ.'ana_template.php'); // <- bu ekleme ile birlikte sayfa çıktısı verilecektir.
include(KDIZ.'manav.php'); // <- bu ekleme ile birlikte manav.php çıktısı </html> tagından sonra çıkacaktır
?>

görüldüğü gibi manav.php dosyasının çıktısı istediğimiz noktada olmadı.

<?php
define('DA',DIRECTORY_SEPERATOR); // DA -> dizin ayracının kısaltılmışı
define('KDIZ',dirname(__FILE__).DA); // KDIR -> kök dizinin kısaltılmışı
 
$sayfa_basik = 'Maraba Televole';
$sayfa_içerik = 'İşte ben geldim';
include(KDIZ.'manav.php'); // <- bu ekleme ile birlikte manav.php çıktısı sayfadan önce çıkacak yapıyı bozacaktır.
include(KDIZ.'ana_template.php'); // <- bu ekleme ile birlikte sayfa çıktısı verilecektir.
?>

Bu örnekte de istediğimiz sonuca ulaşamadık, elbette bu dosyayı, ana_template.php dosyası içinden ekleyerek isteğimize ulaşabiliriz, ancak bu şekilde yapacağımız bir uygulama, bizim her sayfa için ayrı bir ana_template dosyası kullanmamıza neden olacaktır, tabi ana_template.php dosyası içinden manav template dosyasını çağıracak bir modelde kurabilir. Lakin o zamanda, uzun vadede kontrolü çok zor spagetti php kodlamaya yönlendirecektir. Elbette çeşitli template çözümleri kullanmak mümkün fakat biz opcode cache sisteminden mümkün olan en iyi faydayı sağlamak ve template sistemi yükünü taşımamak üzere bir çözüm geliştirme peşindeyiz. O halde, php dahilindeki bir imkanı kendi amacımız doğrultusunda kullanacağız.

 

<?php
define('DA',DIRECTORY_SEPERATOR); // DA -> dizin ayracının kısaltılmışı
define('KDIZ',dirname(__FILE__).DA); // KDIR -> kök dizinin kısaltılmışı
$sayfa_basik = 'Maraba Televole';
 
ob_start(); //--- Oputput Buffering sistemini aç
include(KDIZ.'manav.php'); // <- manav sistemini koda dahil eti
$sayfa_içerik = ob_end_clean(); //<- output buffering sistemini bitir, topladığın outputu $sayfa_içerik  değişkenine sakla.
include(KDIZ.'ana_template.php'); // <- bu ekleme ile birlikte sayfa çıktısı verilecektir.
?>

Kodu çalıştırdğımızda, manav.php içeriğinin <body> t</body> arasında kaldığını göreceğiz. Bu makalede bahsedilen ob_start() -> include() -> ob_end_clean() modeli ile istenilen php kod parçaları direkt veya fonksiyon yardımı ile çalışan kod bloğuna eklenip elde edilen html çıktısı daha sonra ana sayfada uygun görülen noktaya yönlendirilebilir. Erken çıktı verilmediği için kod içerisinde ihtiyaç duyulan herhangi bir anda, cookie veya session_register işlemi yapılabilir. tek çıktı kullanıldığı için tcp fragmentasyonu minimize edilmiştir. Çok kullanışlı olan bu metodun tek dezavantajı, yapılan sayfa parçalarını hafızada tutmasından dolayı, PHP nin kullanacağı sunucu hafızasını bir miktar arttırmasıdır.

Etiket:

Kategori: Php

Yazar Hakkında (Yazar Profili)

Yorumlar (0)

Geri izleme adresi | Yorum RSS Beslemesi

There are no comments yet. Why not be the first to speak your mind.

Yanıt bırakın

Spam Protection by WP-SpamFree