- Konu sahibi
- #1
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:
| İşlev | Tampon içeriği | Tampon durumu |
|---|---|---|
ob_get_contents() | Okur, korur | Açık kalır |
ob_get_clean() | Okur ve döndürür | Kapanır, içerik gönderilmez |
ob_end_flush() | Sonraki çıktı katmanına iletir | Kapanır |
ob_end_clean() | Silinir | Kapanı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ı
ob_start()çağrısını, yakalamak istediğiniz çıktının hemen öncesine yerleştirin.- Şablon, HTML veya fonksiyon çıktısını üretin.
- İçeriği kullanacaksanız
$content = ob_get_clean();ile alın ve tamponu kapatın. - İç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ızob_end_flush()veya içeriği alıp ayrıcaechoetmek 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.