3 Ekim 2008

Php 'de çıktı tamponu (output buffer) kullanımı

Normalde herhangi bir php kodu çalıştırdığınızda oluşan çıktı işlem anında tarayıcıya gönderilir ve bu şekilde kodun çalışmasının bitmesi beklenmeden çıktı verilmeye başlanmış olur. Ama bazı durumlarda çıtının hemen gönderilmesini istemeyiz. Örneğin, içeriği oluşturduğumuz kodun sonunda yaptığımız bir kontrol ile o ana kadar üretilen çıktının ne biçimde kullanılacağı, yada gösterilip gösterilmeyeceği gibi durumlara karar vermek isteyebiliriz. Yada sayfanın bir yerinde oluşturduğumuz çıktıyı başka bir yerde kullanmak isteyebiliriz. Bu örneklere bütün sayfa içeriğinin en başta oluşturulup daha sonra istediğimiz bir biçimde (sayfa şablonu kullanımı vb durumlar için ) kullanıcıya aktarılmasını da ekleyebiliriz. Bu gibi durumlarda çıktı tamponlama kullanabiliriz. Php 'de bunu gerçekleştirmek için çıktı tamponlaması yapılır.

Çıktı tamponu oluşturmak için öncelikle çıktının başladığı noktayı belirtmemiz gerekir. Bunun için ob_start işlevi kullanılır. Çoğunlukla bu işlevin parametreleri kullanılmaz. Çıktıyı sonlandırmak için ise kullanılabilecek çeşitli işlevler vardır. Çıktıyla ne yapmak istediğimize göre bunlardan birini kullanırız. Örneğin çıktıyı herhangi bir işlemden geçirmeden olduğu gibi aktarmak için ob_flush yada ob_end_flush işlevlerini kullanabilirsiniz. ob_end_flush işlevi çıktıyı istemciye gönderip çıktı tamponunu sonlandırır. ob_flush ise aynı işlevi çıktı tamponunu sonlandırmadan gerçekleştirir. (Ayrıca php kodunun çalışması bittiğinde çıktı sonlanmış olur ve çıktı istemciye verilir yani herhangi bir hata durumunda veya işlem bittiğinde eğer çıktı tamponunda çıktı kalmışsa istemciye gönderilir.)

Çıktıyı istemciye vermek yerine içeriğini alıp istediğimiz gibi kullanabiliriz. Bunun için ob_get_contents yada ob_get_clean işlevlerini kullanabilirsiniz. ob_get_contents işlevi çıktı tamponunun içeriğini döner. ob_get_clean ise bununla birlikte çıktı tamponunu sonlandırır. ob_get_clean işlevini çağırmak, ob_get_contents kullanıp ardından ob_clean işlevini kullanmakla aynı işlevi görür.

Çıktı tamponlaması yaparken kullanabileceğiniz bazı yardımcı işlevler de bulunmaktadır. Örneğin ob_get_length işlevi çıktı tamponundaki verinin uzunluğunu döner. ob_get_level işlevi ise mevcut tamponun derinlik seviyesini döner (İçiçe çıktı tamponları başlatabilirsiniz). ob_get_status işlevi de çıktı tamponunun durumu hakkında bilgiler içeren bir dizi döner.

Çıktı tamponu sisteminin çok kullandığı bir durum da kodun herhangi bir yerinde url yönlendirmesi yapılan kodlardır. Yönlendirme yapmak için header işlevi kulanılır ve bu işlev ile çıktının başlık bilgileri düzenlenir. Ancak bu düzenlemeyi yapabilmek için önceden istemciye herhangi bir çıktının verilmemiş olması gerekir. Eğer yönlendirme yapılan çağrıya kadar herhangi bir çıktı verilmişse başlık bilgisinin zaten gönderilmiş olduğunu belirten bir hata mesajı alırsınız. Eğer kodunuzun başında çıktı tamponu başlatırsanız ve yönlendirme yapılan çağrıya kadar herhangi bir çıktı vermezseniz böyle bir hatayla karşılaşmazsınız ve yönlendirme gerçekleşir.

Çıktı tamponlamanın (output buffering) kullanıldığı birçok başka durumla karşılaşabilirsiniz. Çıktı tamponlamayla ilgili php işlevlerinin listesi için:

http://tr2.php.net/manual/en/ref.outcontrol.php

5 yorum:

sinan dedi ki...

Benim için çok faydalı bir yazı oldu, yazdığım bir uygulama içindeki resimleri, javascriptleri filan hepsini birden yüklemeye kalkıyordu, işin kötüsü kendi başına bir sayfa değil başka bir sayfanın içinde, her şey yüklenip ayarlanana kadar bir sürü saçma sapan görüntü oluşuyordu.

Bu arada blog genel olarak çok güzel, jquery ile ilgili olanlar hariç tüm yazıları okudum, xml verilerini dizi/ağaç yapmak, json ile php ve javascript arasında verileri paslaşmak, php'de 'pagination' çok temel şeyler... Herkes kafasına göre yapıyor (en azından ben öyle yapıyordum, bazı şeyleri daha farklı yapacağım bundan sonra), düzgün yollarını iyi bir Türkçe ile anlatmışsınız.

Ellerinize sağlık...

admin dedi ki...

Teşekkür ederim. Faydalı olduysa ne mutlu bana. Aslında bir süredir pek ilgilenemiyorum ama fırsat bulursam bazı temel konularda yazılar yazmaya çalışıyorum.

Adsız dedi ki...

Merhaba, ufak bir sorum olacak. Yazınızı yazalı uzun bir zaman olmuş fakat her yerde aramama rağmen soruma cevap bulamadım. Bir ümit ile bu yazınıza yorum gönderiyorum.
ob_start(); dinamik yapılarda anladığım kadarıyla sayfa içeriğini tamponlayarak daha hızlı sayfa geçişi yapmamızı sağlıyor. Fakat bir yerde büyük bir projeniz var ise performans kaybına neden olur yazmakta. Tamponu fazla olduracağı içinmiş. Sizce kullanmalı mıyız bu ob yi?
Ayrıca ob_end_flush ı her sayfada kullanır isek bu bahsettiğim tamponlayarak hızlı sonuç alma işlemini deaktif mi etmiş oluruz? Kullanmamalı mıyız bu ob_end_flush ı ? Teşekkür ederim.

EzgApps dedi ki...

ob_start() ile tampon oluşturmanın genelde amacı bir yerde oluşturulan içeriğin başka yerde kullanılması şeklindedir. Yada bazen çıktıyı doğrudan vermeyip gerekirse arada yönlendirme işlemi yapabilmek için de kullanılıyor. Dediğiniz gibi büyük projelerde belki bir miktar yük getirebilir sonuçta çalışma esnasında kısa süreli de olsa ramde veri tutması gibi bir kaynak kullanımı vardır sanıyorum. Dediğim gibi sadece gerekliyse kullanılır gereksiz durumlarda bir manası yok zaten. Tampon çıktıyı herhangi bir komutla sonlandırmasanız bile dosya sonunda sistem kendisi otomatik sonlandıracaktır zaten ama arada bir yerde sonlandırıp çıktıyı başka yere taşımak gibi amaçlarla faydalı olabiliyor ob işlevleri.

Dursun BALCI dedi ki...

Merhaba bende buffering_output ile ilgili pek çözüm kaynağı bulamadım localhostta xampp ile sorunsuz çalışıyor tam güzel sorunsuz çalışan mükemmel bir script buldum derken isimtescildeki hostingde kullanıcı kaydı yaparken sorun olmuyor kullanıcı girişi yaparken "enable buffering_output in your server" hatası alıyorum hosting firması server satın almanız gerekiyor dedi araştırmalarımdan çıkardığım sonuç bence php.ini dosyasında ayar değişikliği sanırım localde çalışıp hostingde çalışmaması sebebebi server değil php.ini dosyası sanki

Kripto paralar hakkında

Kripto paralar, merkezi olmayan, şifrelenmiş ve dağıtılmış bir veritabanı olan blok zinciri teknolojisi kullanılarak oluşturulan dijital par...