Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

ob_start() nedir?​


PHP’de ob_start(), üretilen çıktıyı tarayıcıya veya istemciye hemen göndermek yerine geçici bir çıktı tamponunda (output buffer) biriktirmeye başlar. Böylece çıktıyı sonradan bir değişkene alabilir, değiştirebilir, temizleyebilir veya tek seferde gönderebilirsiniz. Tamponu kapatmak için genellikle ob_get_clean(), ob_end_flush() ya da ob_end_clean() kullanılır.

Nasıl çalışır?​


ob_start() çağrısından sonra echo, print veya doğrudan yazılan HTML çıktısı aktif tampona gider. Bu anlatım, örnekteki gibi varsayılan parametrelerle açılan tampon içindir. Özel bir chunk_size değeri veya başka bir katmanın boşaltma davranışı akışı değiştirebilir.

Temel örnek ve beklenen çıktı​


Aşağıdaki dosyayı ob-start.php adıyla kaydedip PHP’nin çalıştığı bir ortamda açın:

Kod:
<?php
ob_start();

echo '<p>Tamponlanan içerik</p>';

$content = ob_get_clean();

echo '<main>' . $content . '</main>';

Beklenen sonuç, tarayıcıda <main> içinde “Tamponlanan içerik” yazısının görünmesidir. echo ile yazılan paragraf, ob_get_clean() çağrılana kadar doğrudan gönderilmez; bu çağrı içeriği $content değişkenine alır ve tamponu kapatır.

İçerik beklenmedik şekilde boşsa önce ob_get_clean() çağrısından önce gerçekten çıktı üretildiğini kontrol edin. Aktif bir tampon yokken bu işlevi çağırmak başarısızlığa yol açabilir; tampon durumunu ob_get_level() > 0 koşuluyla kontrol edebilirsiniz.

Tamponu yönetmek için temel işlevler şunlardır:

İşlevTampon içeriğiTampon durumu
ob_get_contents()Okur, korurAçık kalır
ob_get_clean()Okur ve döndürürKapanır, içerik gönderilmez
ob_end_flush()Sonraki çıktı katmanına iletirKapanır
ob_end_clean()SilinirKapanır

Bu seçim, çıktıyı kullanıp kullanmayacağınıza bağlıdır: İçeriği bir değişkende işlemek istiyorsanız ob_get_clean(), normal şekilde istemciye iletmek istiyorsanız ob_end_flush(), hatalı veya gereksiz çıktıyı atmak istiyorsanız ob_end_clean() tercih edilir.

Pratik kullanım kararı​


  1. ob_start() çağrısını, yakalamak istediğiniz çıktının hemen öncesine yerleştirin.
  2. Şablon, HTML veya fonksiyon çıktısını üretin.
  3. İçeriği kullanacaksanız $content = ob_get_clean(); ile alın ve tamponu kapatın.
  4. İçeriği aldıktan sonra echo $content; ile yeni çıktı üretebilirsiniz. Bu noktada kendi tamponunuz zaten kapanmıştır; tekrar kapatma işlevi çağırmayın. İçeriği hiç kullanmadan atmak istiyorsanız önceki adımda ob_get_clean yerine ob_end_clean seçin.

Başlık bilgileri göndermeden önce HTML çıktısını kontrol etmek de tamponlamanın yaygın kullanım alanıdır. Ancak bu, yanlış yerde gönderilen çıktıyı düzeltmek için kalıcı çözüm değildir; dosya başındaki boşluklar, uyarılar ve hata çıktıları ayrıca düzeltilmelidir.

Sık yapılan hatalar​


  • Tamponu kapatmayı unutmak: Her ob_start() çağrısının yaşam döngüsünü açıkça sonlandırın. Özellikle uzun süren isteklerde gereksiz bellek kullanımı oluşabilir.
  • Yanlış kapatma işlevini seçmek: ob_end_clean() içeriği siler; içeriğin görünmesini bekliyorsanız ob_end_flush() veya içeriği alıp ayrıca echo etmek gerekir.
  • Tamponlamayı kalıcı depolama sanmak: Tampon yalnızca mevcut PHP isteği sırasında geçici çıktı yönetimidir; veritabanı veya dosya yerine geçmez.
  • İç içe tamponları karıştırmak: Birden fazla ob_start() katmanı varsa kapatma işlemleri en içteki aktif tampondan başlar. Hangi katmanın hangi içeriği yönettiğini takip edin.
  • Hata mesajlarını gizlemek: ob_end_clean() ile çıktıyı susturmak hatayı çözmez. Geliştirme sırasında hatanın kaynağını düzeltin; yalnızca bilinçli olarak oluşturulan çıktıyı atın.

Sık sorulan sorular​


ob_start() performansı otomatik olarak artırır mı?​


Hayır. Tamponlama çıktının ne zaman ve nasıl gönderileceğini yönetir. Büyük çıktıları bellekte tutmak ek bellek kullanabileceğinden, yalnızca çıktıyı kontrol etmeniz gereken yerde kullanın.

Tampon boşaltılınca metin hemen tarayıcıda görünür mü?​


Kesin olarak söylenemez. İç içe PHP tamponları, web sunucusu, ara sunucu ve istemci de çıktıyı biriktirebilir. ob_end_flush yalnızca etkin PHP tamponunun yaşam döngüsünü tamamlar; ağdaki bütün katmanları aynı anda boşaltma garantisi vermez.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.