Is ob_start()
için kullanılan output buffering
başlıklar tamponlu ve tarayıcıya gönderilen olmayacak şekilde? Burada mantıklı mıyım? Değilse neden kullanmalıyız ob_start()
?
Is ob_start()
için kullanılan output buffering
başlıklar tamponlu ve tarayıcıya gönderilen olmayacak şekilde? Burada mantıklı mıyım? Değilse neden kullanmalıyız ob_start()
?
Yanıtlar:
Düşünün ob_start()
şeklindeki "Başlat normalde outputted edilecek olmasına karşın oldukça henüz onunla bir şey yapmayın herşeyi hatırlayarak."
Örneğin:
ob_start();
echo("Hello there!"); //would normally get printed to the screen/output to browser
$output = ob_get_contents();
ob_end_clean();
Tipik olarak eşleştirdiğiniz diğer iki işlev daha vardır: ob_get_contents()
temel olarak, açıldığından beri arabellekte "kaydedilen" öğeyi size veren ob_start()
ve daha sonra ob_end_clean()
veya bir ob_flush()
şeyleri kaydetmeyi durduran ve kaydedilenleri atamayan veya kaydetmeyi durduran ve hepsini bir kerede çıkarır.
ob_start();
Bu doğru mu? Etkinleştirilmezse ne olur?
ob_end_clean
bir cazibe gibi çalışıyor! Riley Dutton
Ben PHP çok HTML ile kırmak ama bunu render böylece kullanın. Beni IDE renk kodlamasını devre dışı bırakan bir dize olarak saklamamı sağlıyor.
<?php
ob_start();
?>
<div>
<span>text</span>
<a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>
Onun yerine:
<?php
$content = '<div>
<span>text</span>
<a href="#">link</a>
</div>';
?>
ob_get_clean()
değil, kullandığını unutmayın ob_end_clean()
Burada kabul edilen cevap neyin ob_start()
kullanılacağını açıklamaktadır - neden kullanıldığını değil (sorulan soru buydu).
Başka ob_start()
bir yerde belirtildiği gibi çıktı yazılan bir tampon oluşturur.
Ancak hiç kimse PHP içinde birden fazla arabellek biriktirmenin mümkün olduğunu söylemedi. Bkz. Ob_get_level ().
Neden gelince ....
HTML'yi tarayıcıya daha büyük yığınlar halinde göndermek, ağ yükünün azalmasından performans avantajı sağlar.
Verileri PHP'den daha büyük parçalar halinde geçirmek, gereken bağlam anahtarı sayısını azaltarak performans ve kapasite avantajı sağlar
Daha büyük veri parçalarını mod_gzip / mod_deflate'e geçirmek, sıkıştırmanın daha verimli olabilmesi açısından performans avantajı sağlar.
çıkışın arabelleğe alınması, HTTP başlıklarını kodun ilerleyen bölümlerinde değiştirebileceğiniz anlamına gelir
[head] .... [/ head] çıktısını aldıktan sonra arabelleği açıkça temizleme , HTML akışı tamamlanmadan önce tarayıcının sayfa için diğer kaynakları paylaşmaya başlamasına izin verebilir.
Çıktıyı bir arabellekte yakalamak, e-posta gibi diğer işlevlere yönlendirilebileceği veya içeriğin önbelleğe alınmış temsili olarak bir dosyaya kopyalanabileceği anlamına gelir
Geriye sahipsin. ob_start üstbilgileri arabelleğe almaz, içeriği arabelleğe alır. Kullanımı ob_start
, görüntülemeye hazır olana kadar içeriği sunucu tarafı arabelleğinde tutmanıza olanak tanır.
Bu, sayfaların zaten 'bazı içerikler' gönderdikten 'sonra (yani, bir sayfayı oluşturarak yarıya kadar yönlendirmeye karar verdikten sonra) üstbilgi gönderebilmesi için yaygın olarak kullanılır.
bu JD Isaaks'ın cevabını daha da netleştirmek için ...
Sık karşılaştığınız sorun, birçok farklı php kaynağından html çıktısı için php kullanmanızdır ve bu kaynaklar genellikle, hangi nedenle olursa olsun, farklı yollarla çıktıdır.
Bazen doğrudan tarayıcıya göndermek istediğiniz gerçek html içeriği olabilir; diğer zamanlarda çıktı dinamik olarak oluşturulur (sunucu tarafı).
Dinamik içerik her zaman (?) Bir dize olacaktır. Şimdi bu dize dinamik html herhangi bir gerçek, görüntülemek için doğrudan html ... ile bir anlamlı html düğüm yapısında birleştirmek zorunda.
Bu genellikle geliştiriciyi, doğrudan görüntülenen tüm içeriği bir dizeye (JD Isaak'ın tartıştığı gibi) sarmaya zorlar, böylece dinamik html ile birlikte düzgün bir şekilde teslim edilebilir / eklenebilir ... sarılmasını istiyorum.
Ancak ob _ ## yöntemlerini kullanarak bu dize sarma karmaşasını önleyebilirsiniz. Değişmez içerik bunun yerine arabelleğe çıkarılır. Daha sonra kolay bir adımda tamponun tüm içeriği (tüm gerçek html'niz), dynamic-html dizenize birleştirilir.
(Örneğim, daha sonra bir html dizesine eklenen ara belleğe html çıktısı olduğunu gösterir ... html dizesinin kaydırılmasını görmek için JD Isaaks örneğine de bakın).
<?php // parent.php
//---------------------------------
$lvs_html = "" ;
$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__without_ob( ) ;
$lvs_html .= "<div>more html</div>" ;
$lvs_html .= "----<br/>" ;
$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__with_ob( ) ;
$lvs_html .= "<div>more html</div>" ;
echo $lvs_html ;
// 02 - component contents
// html
// 01 - component header
// 03 - component footer
// more html
// ----
// html
// 01 - component header
// 02 - component contents
// 03 - component footer
// more html
//---------------------------------
function gf_component_assembler__without_ob( )
{
$lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ;
include( "component_contents.php" ) ;
$lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
return $lvs_html ;
} ;
//---------------------------------
function gf_component_assembler__with_ob( )
{
$lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ;
ob_start();
include( "component_contents.php" ) ;
$lvs_html .= ob_get_clean();
$lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
return $lvs_html ;
} ;
//---------------------------------
?>
<!-- component_contents.php -->
<div>
02 - component contents
</div>
Bu işlev yalnızca başlıklar için değildir. Bununla çok ilginç şeyler yapabilirsiniz. Örnek: Sayfanızı bölümlere ayırabilir ve aşağıdaki gibi kullanabilirsiniz:
$someTemplate->selectSection('header');
echo 'This is the header.';
$someTemplate->selectSection('content');
echo 'This is some content.';
Burada oluşturulan çıktıyı yakalayabilir ve düzeninizdeki tamamen farklı iki yere ekleyebilirsiniz.
Varolan yanıtlarda aşağıdaki konular belirtilmez: Arabellek boyutu yapılandırması HTTP Üstbilgisi ve Yerleştirme.
Ob_start için arabellek boyutu yapılandırması:
ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
Yukarıdaki kod, PHP'nin daha büyük veri parçaları, örneğin 4KB (ob_start çağrısı olmadan, php her yankı tarayıcıya gönderir) göndereceğinden sunucu performansını artırır.
Parça boyutu (yani basit bir ob_start ()) olmadan arabelleğe almaya başlarsanız, sayfa komut dosyasının sonunda bir kez gönderilir.
Çıktı tamponlaması HTTP üstbilgilerini etkilemez, farklı şekilde işlenir. Ancak, arabellekleme nedeniyle, çıktılar gönderildikten sonra bile üstbilgileri gönderebilirsiniz, çünkü hala arabellekte bulunur.
ob_start(); // turns on output buffering
$foo->bar(); // all output goes only to buffer
ob_clean(); // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents(); // buffer content is now an empty string
ob_end_clean(); // turn off output buffering
Burada güzel açıkladı: https://phpfashion.com/everything-about-output-buffering-in-php
Hayır, yanılıyorsunuz, ama yön uyuyor;)
Çıktı Tamponlama bir komut dosyasının çıktısını arabelleğe alır. Thats (kısaca) sonra her şey echo
veya print
. Üstbilgileri olan şey, henüz gönderilmedikleri takdirde gönderilebilmeleri. Ancak HTTP, başlıkların ilk iletim olduğunu söylüyor. Dolayısıyla, ilk kez bir şey çıkarırsanız (istekte) üstbilgiler gönderilir ve başka üstbilgiler ayarlayamazsınız.
ob_get_contents()
olanob_get_clean()
ve kaldırmakob_end_clean()
beriob_get_clean()
esasen iki işlevi yerine getirir. Referans: php.net/manual/en/function.ob-get-clean.php (PHP 4> = 4.3.0, PHP 5)