Çıktı tamponlama nedir?


Yanıtlar:


274

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.

6
+1. İşte başka bir yararlı bağlantı: php.net/manual/en/function.ob-start.php - bir değişkente depolamayı tercih ettiğiniz bir değeri yansıtan bir işlevle uğraşırken de yararlıdır.
Cam

Gerçekten her şey sonuna kadar arabelleğe alınmış mı, yoksa uzun bir sayfam varsa sayfa sadece yığın halinde mi gelecek?
zedoo

5
@zedoo çıktı arabelleğe almaya başlarsanız ob_start(), gerçekten her şey arabelleğe alınır. isteğe bağlı bir ikinci parametre olup ob_start(), int $chunk_sizedizi 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.
balta.

12
"Uyarı: Üstbilgi bilgileri değiştirilemez" iletisini alırsanız, öncelikle çıktı arabelleğe almayı etkinleştirmek nedenin değil, belirtinin bir düzeltmesi olduğundan, kodunuzu denetlemeniz gerekir. Bir şey dönmeden yazıyor. Bu yüzden katılmıyorum, ama cevabı düşürmek için yeterli değil.
Glenn Plas

5
Ben sadece tamponlama kullanmanın avantajlarını görüyorum, bu yüzden neden php varsayılan olarak etkin değil?
Thomas Banderas

69

Çı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.

  • İçerik gönderdikten sonra üstbilgileri değiştirmek istediğiniz durumlarda çıktı arabelleğe almayı kullanabilirsiniz.

Bu örneği düşünün:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

Burada Ax ile aynı soru: daha sonra geri kapatmadan çıktı arabelleğe başlamıyor, senaryonuzun her türlü problemle karşılaşmasını sağlayacak mı?
Edward Stumperd

1
Yıkama yöntemlerinden birini (örneğin 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.
Salman A

17

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, echoverileri hemen Tarayıcıya gönderir.

resim açıklamasını buraya girin

Çıktı tamponlaması açıksa echo, tarayıcıya göndermeden önce çıktı tamponuna veri gönderilir.

resim açıklamasını buraya girin

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.

resim açıklamasını buraya girin Bu durumda output_bufferingdeğ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_bufferingDirektifin 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.iniAş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 echotarayı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:

http://www.hackingwithphp.com/13/0/0/output-buffering


9

Çı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:

PHP ile Çıktı Tamponlama


4

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


1
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


0

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 :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.