บัฟเฟอร์เอาต์พุตคืออะไร


คำตอบ:


274

การส่งออกบัฟเฟอร์สำหรับนักพัฒนาเว็บคู่มือสำหรับผู้เริ่มต้น :

หากไม่มีการบัฟเฟอร์ผลลัพธ์ (ค่าเริ่มต้น) HTML ของคุณจะถูกส่งไปยังเบราว์เซอร์เป็นชิ้น ๆ ในขณะที่ PHP ดำเนินการผ่านสคริปต์ของคุณ ด้วยการบัฟเฟอร์เอาต์พุต HTML ของคุณจะถูกเก็บไว้ในตัวแปรและส่งไปยังเบราว์เซอร์เป็นหนึ่งส่วนท้ายสคริปต์ของคุณ

ข้อดีของการบัฟเฟอร์ผลลัพธ์สำหรับนักพัฒนาเว็บ

  • การเปิดการบัฟเฟอร์ผลลัพธ์เพียงอย่างเดียวจะลดระยะเวลาในการดาวน์โหลดและแสดง HTML ของเราเพราะมันไม่ได้ถูกส่งไปยังเบราว์เซอร์เป็นชิ้น ๆ เนื่องจาก PHP ประมวลผล HTML
  • ทุกสิ่งที่น่าประหลาดใจที่เราสามารถทำได้กับสตริง PHP ตอนนี้เราสามารถทำกับหน้า HTML ทั้งหมดของเราเป็นตัวแปรเดียว
  • หากคุณเคยพบข้อความ "คำเตือน: ไม่สามารถแก้ไขข้อมูลส่วนหัว - ส่วนหัวที่ส่งโดย (เอาท์พุท)" ขณะตั้งค่าคุกกี้คุณยินดีที่จะรู้ว่าการกำหนดบัฟเฟอร์ผลลัพธ์เป็นคำตอบของคุณ

6
+1 นี่เป็นอีกลิงค์ที่มีประโยชน์: php.net/manual/en/function.ob-start.php - มีประโยชน์เมื่อจัดการกับฟังก์ชันที่สะท้อนค่าที่คุณต้องการเก็บไว้ในตัวแปร
แคม

ทุกอย่างถูกบัฟเฟอร์จนจบหรือหน้าจะมาเป็นชิ้น ๆ ถ้าฉันมีหน้ายาว reeeeally?
zedoo

5
@zedoo ถ้าคุณเริ่มต้นบัฟเฟอร์การส่งออกมีob_start(), จริงๆทุกอย่างที่มีบัฟเฟอร์ มีพารามิเตอร์ที่สองไม่จำเป็นที่จะob_start(), int $chunk_sizeซึ่งถ้าตั้งค่าจะทำให้เกิดบัฟเฟอร์ที่จะล้างหลังจากที่โทรผลใด ๆ ซึ่งเป็นสาเหตุของความยาวบัฟเฟอร์ที่จะเท่ากับหรือเกินกว่าขนาดนี้
ขวาน

12
หากคุณได้รับ "คำเตือน: ไม่สามารถแก้ไขข้อมูลส่วนหัว" ได้นั่นหมายความว่าคุณต้องตรวจสอบรหัสของคุณก่อนเนื่องจากการเปิดใช้งานการบัฟเฟอร์ข้อมูลขาออกเป็นการแก้ไขอาการและไม่ใช่สาเหตุ มีบางอย่างกำลังเขียนอยู่ก่อนที่จะถึงคราว ดังนั้นฉันไม่เห็นด้วย แต่ไม่มากพอที่จะชนคำตอบ
Glenn Plas

5
ฉันเห็นเฉพาะการผจญภัยของการใช้บัฟเฟอร์ดังนั้นทำไมไม่เปิดใช้งานโดยค่าเริ่มต้นใน php
Thomas Banderas

69

PHP การบัฟเฟอร์เอาต์พุตถูกใช้โดย PHP เพื่อปรับปรุงประสิทธิภาพ

  • คุณสามารถเก็บ PHP เอาท์พุททั้งหมดไว้ในบัฟเฟอร์และส่งออกทั้งหมดในครั้งเดียวปรับปรุงประสิทธิภาพเครือข่าย

  • คุณสามารถเข้าถึงเนื้อหาบัฟเฟอร์โดยไม่ต้องส่งกลับไปที่เบราว์เซอร์ในบางสถานการณ์

ลองพิจารณาตัวอย่างนี้:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

ตัวอย่างข้างต้นรวบรวมเอาท์พุทเป็นตัวแปรแทนที่จะส่งไปยังเบราว์เซอร์ output_buffering ถูกปิดโดยปริยาย

  • คุณสามารถใช้การบัฟเฟอร์ผลลัพธ์ในสถานการณ์เมื่อคุณต้องการแก้ไขส่วนหัวหลังจากส่งเนื้อหา

ลองพิจารณาตัวอย่างนี้:

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

คำถามเดียวกันที่นี่สำหรับ Ax: ไม่ได้เริ่มการบัฟเฟอร์เอาต์พุตโดยไม่ปิดในภายหลังจะทำให้สคริปต์ของคุณมีปัญหาทุกประเภทใช่หรือไม่
Edward Stumperd

1
บัฟเฟอร์ถูกฟลัชเมื่อคุณเรียกใช้หนึ่งในวิธีการฟลัช (เช่นob_flush()หรือob_end_flush()) เนื้อหาของบัฟเฟอร์จะถูกลบทิ้งเมื่อสคริปต์ของคุณสิ้นสุดลงโดยทันทีหรืออย่างอื่นดังนั้นจึงไม่ควรมีปัญหา
Salman A

17

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันต้องการเขียนคำตอบสำหรับผู้เรียนด้วยภาพ ฉันไม่สามารถหาไดอะแกรมอธิบายใดบัฟเฟอร์การส่งออกในทั่วโลกเว็บดังนั้นฉันทำแผนภาพตัวเองใน mspaint.exeWindows

หากปิดบัฟเฟอร์การส่งออกechoจะส่งข้อมูลไปยังเบราว์เซอร์ทันที

ป้อนคำอธิบายรูปภาพที่นี่

หากเปิดใช้งานบัฟเฟอร์การechoส่งออกข้อมูลจะส่งข้อมูลไปยังบัฟเฟอร์ผลลัพธ์ก่อนที่จะส่งไปยังเบราว์เซอร์

ป้อนคำอธิบายรูปภาพที่นี่

phpinfo

หากต้องการดูว่าการบัฟเฟอร์เอาต์พุตเปิด / ปิดโปรดดู phpinfo ที่ส่วนหลัก output_bufferingสั่งจะบอกคุณว่าบัฟเฟอร์ขาออกคือการเปิด / ปิด

ป้อนคำอธิบายรูปภาพที่นี่ ในกรณีนี้output_bufferingค่า 4096 ซึ่งหมายความว่าขนาดบัฟเฟอร์คือ 4 KB นอกจากนี้ยังหมายถึงการบัฟเฟอร์เอาต์พุตเปิดอยู่บนเว็บเซิร์ฟเวอร์

php.ini

เป็นไปได้ที่จะเปิด / ปิดและเปลี่ยนขนาดบัฟเฟอร์โดยการเปลี่ยนค่าของoutput_bufferingคำสั่ง เพียงค้นหามันphp.iniเปลี่ยนการตั้งค่าที่คุณเลือกและรีสตาร์ทเว็บเซิร์ฟเวอร์ คุณสามารถหาตัวอย่างphp.iniด้านล่างของฉัน

; 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

คำสั่งoutput_bufferingไม่ได้เป็นเพียงคำสั่งที่กำหนดค่าได้เกี่ยวกับการบัฟเฟอร์ผลลัพธ์ คุณสามารถค้นหาคำสั่งบัฟเฟอร์บัฟเฟอร์อื่น ๆ ที่กำหนดค่าได้ที่นี่: http://php.net/manual/en/outcontrol.configuration.php

ตัวอย่าง: ob_get_clean ()

ด้านล่างคุณสามารถดูวิธีการจับechoและจัดการก่อนส่งไปยังเบราว์เซอร์

// 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

ตัวอย่าง: Hackingwithphp.com

ข้อมูลเพิ่มเติมเกี่ยวกับบัฟเฟอร์ผลลัพธ์พร้อมตัวอย่างสามารถดูได้ที่นี่:

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


9

ฟังก์ชั่นการควบคุมผลผลิตช่วยให้คุณสามารถควบคุมเมื่อส่งออกจากสคริปต์ สิ่งนี้มีประโยชน์ในหลาย ๆ สถานการณ์โดยเฉพาะถ้าคุณต้องการส่งส่วนหัวไปยังเบราว์เซอร์หลังจากที่สคริปต์ของคุณเริ่มส่งข้อมูลออกมา ฟังก์ชั่นการควบคุมผลลัพธ์ไม่ส่งผลกระทบต่อส่วนหัวที่ส่งโดยใช้ header () หรือ setcookie () เฉพาะฟังก์ชั่นเช่น echo () และข้อมูลระหว่างบล็อกของโค้ด PHP

http://php.net/manual/en/book.outcontrol.php

ทรัพยากรเพิ่มเติม:

บัฟเฟอร์ส่งออกด้วย PHP


4

ตามชื่อแนะนำที่นี่บัฟเฟอร์หน่วยความจำที่ใช้ในการจัดการวิธีการแสดงผลของสคริปต์ที่ปรากฏ

นี่คือการสอนที่ดีมากสำหรับหัวข้อ


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

บัฟเฟอร์สามารถซ้อนกันได้ดังนั้นในขณะที่บัฟเฟอร์หนึ่งทำงานอยู่อีกบัฟเฟอร์หนึ่งจะob_start()เปิดใช้งานบัฟเฟอร์ใหม่ ดังนั้นob_end_flush()และob_flush()ไม่ได้ส่งบัฟเฟอร์ไปยังเอาต์พุตจริงๆ แต่ส่งไปยังบัฟเฟอร์หลัก และเฉพาะเมื่อไม่มีบัฟเฟอร์หลักเนื้อหาจะถูกส่งไปยังเบราว์เซอร์หรือเทอร์มินัล

อธิบายอย่างดีที่นี่: https://phpfashion.com/everything-about-output-buffering-in-php


0

อัปเดต 2019 หากคุณมีเซิร์ฟเวอร์เฉพาะและ SSD หรือ NVM ที่ดีกว่า 3.5GHZ คุณไม่ควรใช้การบัฟเฟอร์เพื่อทำให้เว็บไซต์โหลดเร็วขึ้นใน 100ms-150ms

กลายเป็นเครือข่ายช้ากว่าสคริปต์ proccesing ในปี 2019 ด้วยเซิร์ฟเวอร์ประสิทธิภาพ (severs, memory, disk) และเปิด APC PHP :) ในการสร้างสคริปต์บางครั้งต้องใช้เพียง 70ms เท่านั้นเวลาอื่นคือเครือข่ายใช้เวลาตั้งแต่ 10ms ถึง 150ms จากที่ตั้ง ใช้เซิร์ฟเวอร์

ดังนั้นหากคุณต้องการความรวดเร็ว 150ms การบัฟเฟอร์ทำให้ slowl เนื่องจากต้องการข้อมูลบัฟเฟอร์การรวบรวมพิเศษจะทำให้มีค่าใช้จ่ายเพิ่มเติม 10 ปีที่แล้วเมื่อเซิร์ฟเวอร์สร้างสคริปต์ 1s มันมีประโยชน์มาก

โปรดเนื่องจาก output_buffering มีขีด จำกัด หากคุณต้องการใช้ jpg ในการโหลดสามารถล้างอัตโนมัติและการส่งล้มเหลว

ไชโย

คุณสามารถทำแม่น้ำอย่างรวดเร็วหรือคุณสามารถทำทามะอย่างปลอดภัย :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.