Yanıtlar:
Bir Başlangıç Kılavuzu olan Web Geliştiricileri için Çıktı Tamponlama :
Çıktı arabelleğe alma olmadan (varsayılan), HTML'niz tarayıcıya kodunuz aracılığıyla PHP işlemleri olarak parçalara gönderilir. Çıktı arabelleğe alma ile HTML'niz bir değişkende depolanır ve komut dosyasının sonunda tek parça olarak tarayıcıya gönderilir.
Web geliştiricileri için çıktı arabelleğe almanın avantajları
- Yalnızca çıktı arabelleğe almayı açmak HTML kodumuzu indirmek ve işlemek için gereken süreyi azaltır, çünkü PHP HTML'yi işlerken tarayıcıya parçalar halinde gönderilmez.
- PHP dizeleri ile yapabileceğimiz tüm süslü şeyler, artık tüm HTML sayfamızla tek değişken olarak yapabiliriz.
- Çerezleri ayarlarken "Uyarı: Üstbilgi bilgileri değiştirilemiyor - zaten (çıkış) tarafından gönderilen üstbilgiler değiştirilemiyor" iletisiyle karşılaşırsanız, çıktı arabelleğe almanın cevabınız olduğunu bilmekten memnuniyet duyarsınız.
ob_start()
, gerçekten her şey arabelleğe alınır. isteğe bağlı bir ikinci parametre olup ob_start()
, int $chunk_size
dizi halinde, tampon eşit arabellek süresini neden olmakta ya da bu boyutu aşan herhangi bir çıkış çağrısının ardından temizlenip neden olacak.
Çıktı tamponlama PHP tarafından performansı artırmak ve birkaç numara yapmak için kullanılır.
PHP'nin tüm çıktıları bir ara belleğe kaydetmesini ve bir kerede tümünü ağ performansını iyileştirmesini sağlayabilirsiniz.
Arabellek içeriğine belirli durumlarda tarayıcıya geri göndermeden erişebilirsiniz.
Bu örneği düşünün:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
Yukarıdaki örnek, çıktıyı tarayıcıya göndermek yerine bir değişkene yakalar. output_buffering varsayılan olarak kapalıdır.
Bu örneği düşünün:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
ob_flush()
veya ob_end_flush()
) çağırdığınızda, tampon temizlenir . Arabellek içeriği de komut dosyanız sona erdiğinde aniden veya başka bir şekilde temizlenir, bu nedenle bir sorun olmamalıdır.
Bunun eski bir soru olduğunu biliyorum ama görsel öğrenenler için cevabımı yazmak istedim. Dünya çapında web'de çıktı arabelleğe almayı açıklayan herhangi bir diyagram bulamadım, bu yüzden Windows'da kendim bir diyagram yaptım mspaint.exe
.
Çıktı tamponlaması kapalıysa, echo
verileri hemen Tarayıcıya gönderir.
Çıktı tamponlaması açıksa echo
, tarayıcıya göndermeden önce çıktı tamponuna veri gönderilir.
phpinfo
Çıktı tamponlamasının açık / kapalı olup olmadığını görmek için lütfen çekirdek kısmındaki phpinfo'ya bakın. output_buffering
Çıktı tamponlama açık / kapalı olup olmadığını yönergesi söyleyecektir.
Bu durumda output_buffering
değer 4096'dır, yani arabellek boyutu 4 KB'dir. Ayrıca, Web sunucusunda Çıktı arabelleğe almanın açık olduğu anlamına gelir.
php.ini
output_buffering
Direktifin değerini değiştirerek arabellek boyutunu açmak / kapatmak ve değiştirmek mümkündür . Sadece bulun php.ini
, istediğiniz ayara değiştirin ve Web sunucusunu yeniden başlatın. php.ini
Aşağıda benim bir örnek bulabilirsiniz .
; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
Yönerge output_buffering
, Çıktı tamponlama ile ilgili tek yapılandırılabilir yönerge değildir. Diğer yapılandırılabilir Çıktı tamponlama direktiflerini burada bulabilirsiniz: http://php.net/manual/en/outcontrol.configuration.php
Örnek: ob_get_clean ()
Aşağıda echo
tarayıcıya göndermeden önce nasıl yakalanacağını ve değiştirileceğini görebilirsiniz .
// Turn on output buffering
ob_start();
echo 'Hello World'; // save to output buffer
$output = ob_get_clean(); // Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output); // manipulate the output
echo $output; // send to output stream / Browser
// OUTPUT:
HELLO WORLD
Örnekler: Hackingwithphp.com
Örneklerle çıktı arabelleği hakkında daha fazla bilgiyi burada bulabilirsiniz:
Çıktı Denetimi işlevleri, komut dosyasından çıkışın ne zaman gönderileceğini denetlemenizi sağlar. Bu, özellikle komut dosyanız veri çıkmaya başladıktan sonra tarayıcıya üstbilgiler göndermeniz gerekiyorsa, birkaç farklı durumda yararlı olabilir. Çıktı Denetimi işlevleri, başlık () veya setcookie () kullanılarak gönderilen üstbilgileri etkilemez, yalnızca echo () gibi işlevleri ve PHP kod blokları arasındaki verileri etkiler.
http://php.net/manual/en/book.outcontrol.php
Daha fazla kaynak:
Adından da anlaşılacağı gibi, komut dosyasının çıktısının nasıl görüneceğini yönetmek için kullanılan bellek arabelleği.
İşte konu için çok iyi bir öğretici
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
Tamponlar yuvalanabilir, bu nedenle bir tampon aktifken diğeri ob_start()
yeni bir tamponu aktive eder. Yani ob_end_flush()
ve ob_flush()
gerçekten tamponu çıktıya değil, ana tampona gönderiyoruz. Ve sadece üst arabellek olmadığında, içerik tarayıcıya veya terminale gönderilir.
Burada güzel açıkladı: https://phpfashion.com/everything-about-output-buffering-in-php
2019. Özel sunucu ve SSD veya daha iyi NVM'niz varsa 3.5GHZ. 100ms-150ms'de daha hızlı yüklü web sitesi oluşturmak için arabelleğe almayı kullanmamalısınız.
Becouse ağı 2019'da performans sunucuları (severs, bellek, disk) ve APC PHP'yi açarak komut dosyası işleminden daha yavaştır :) Oluşturulan komut dosyası bazen sadece 70 ms'ye ihtiyaç duyar, başka bir zaman sadece ağ zaman alır, 10 ms'den 150 ms'ye kadar kullanıcı-sunucu.
Bu yüzden hızlı 150ms, tamponlama yavaşlamak istiyorsanız, ekstra toplama tampon verisine ihtiyaç duyduğunuzdan ekstra maliyet yapar. 10 yıl önce sunucu 1s betiği yaptığında faydalı oldu.
Yüklemek için jpg kullanmak istiyorsanız otomatik çıkış ve çökme gönderimini yıkayabilirsiniz.
Şerefe.
Hızlı nehir yapabilir veya güvenle tama yapabilirsiniz :)