การบัฟเฟอร์เอาต์พุตคืออะไรและทำไมจึงใช้ใน PHP
การบัฟเฟอร์เอาต์พุตคืออะไรและทำไมจึงใช้ใน PHP
คำตอบ:
การส่งออกบัฟเฟอร์สำหรับนักพัฒนาเว็บคู่มือสำหรับผู้เริ่มต้น :
หากไม่มีการบัฟเฟอร์ผลลัพธ์ (ค่าเริ่มต้น) HTML ของคุณจะถูกส่งไปยังเบราว์เซอร์เป็นชิ้น ๆ ในขณะที่ PHP ดำเนินการผ่านสคริปต์ของคุณ ด้วยการบัฟเฟอร์เอาต์พุต HTML ของคุณจะถูกเก็บไว้ในตัวแปรและส่งไปยังเบราว์เซอร์เป็นหนึ่งส่วนท้ายสคริปต์ของคุณ
ข้อดีของการบัฟเฟอร์ผลลัพธ์สำหรับนักพัฒนาเว็บ
- การเปิดการบัฟเฟอร์ผลลัพธ์เพียงอย่างเดียวจะลดระยะเวลาในการดาวน์โหลดและแสดง HTML ของเราเพราะมันไม่ได้ถูกส่งไปยังเบราว์เซอร์เป็นชิ้น ๆ เนื่องจาก PHP ประมวลผล HTML
- ทุกสิ่งที่น่าประหลาดใจที่เราสามารถทำได้กับสตริง PHP ตอนนี้เราสามารถทำกับหน้า HTML ทั้งหมดของเราเป็นตัวแปรเดียว
- หากคุณเคยพบข้อความ "คำเตือน: ไม่สามารถแก้ไขข้อมูลส่วนหัว - ส่วนหัวที่ส่งโดย (เอาท์พุท)" ขณะตั้งค่าคุกกี้คุณยินดีที่จะรู้ว่าการกำหนดบัฟเฟอร์ผลลัพธ์เป็นคำตอบของคุณ
ob_start()
, จริงๆทุกอย่างที่มีบัฟเฟอร์ มีพารามิเตอร์ที่สองไม่จำเป็นที่จะob_start()
, int $chunk_size
ซึ่งถ้าตั้งค่าจะทำให้เกิดบัฟเฟอร์ที่จะล้างหลังจากที่โทรผลใด ๆ ซึ่งเป็นสาเหตุของความยาวบัฟเฟอร์ที่จะเท่ากับหรือเกินกว่าขนาดนี้
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 );
}
?>
ob_flush()
หรือob_end_flush()
) เนื้อหาของบัฟเฟอร์จะถูกลบทิ้งเมื่อสคริปต์ของคุณสิ้นสุดลงโดยทันทีหรืออย่างอื่นดังนั้นจึงไม่ควรมีปัญหา
ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันต้องการเขียนคำตอบสำหรับผู้เรียนด้วยภาพ ฉันไม่สามารถหาไดอะแกรมอธิบายใดบัฟเฟอร์การส่งออกในทั่วโลกเว็บดังนั้นฉันทำแผนภาพตัวเองใน mspaint.exe
Windows
หากปิดบัฟเฟอร์การส่งออก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
ข้อมูลเพิ่มเติมเกี่ยวกับบัฟเฟอร์ผลลัพธ์พร้อมตัวอย่างสามารถดูได้ที่นี่:
ฟังก์ชั่นการควบคุมผลผลิตช่วยให้คุณสามารถควบคุมเมื่อส่งออกจากสคริปต์ สิ่งนี้มีประโยชน์ในหลาย ๆ สถานการณ์โดยเฉพาะถ้าคุณต้องการส่งส่วนหัวไปยังเบราว์เซอร์หลังจากที่สคริปต์ของคุณเริ่มส่งข้อมูลออกมา ฟังก์ชั่นการควบคุมผลลัพธ์ไม่ส่งผลกระทบต่อส่วนหัวที่ส่งโดยใช้ header () หรือ setcookie () เฉพาะฟังก์ชั่นเช่น echo () และข้อมูลระหว่างบล็อกของโค้ด PHP
http://php.net/manual/en/book.outcontrol.php
ทรัพยากรเพิ่มเติม:
ตามชื่อแนะนำที่นี่บัฟเฟอร์หน่วยความจำที่ใช้ในการจัดการวิธีการแสดงผลของสคริปต์ที่ปรากฏ
นี่คือการสอนที่ดีมากสำหรับหัวข้อ
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
อัปเดต 2019 หากคุณมีเซิร์ฟเวอร์เฉพาะและ SSD หรือ NVM ที่ดีกว่า 3.5GHZ คุณไม่ควรใช้การบัฟเฟอร์เพื่อทำให้เว็บไซต์โหลดเร็วขึ้นใน 100ms-150ms
กลายเป็นเครือข่ายช้ากว่าสคริปต์ proccesing ในปี 2019 ด้วยเซิร์ฟเวอร์ประสิทธิภาพ (severs, memory, disk) และเปิด APC PHP :) ในการสร้างสคริปต์บางครั้งต้องใช้เพียง 70ms เท่านั้นเวลาอื่นคือเครือข่ายใช้เวลาตั้งแต่ 10ms ถึง 150ms จากที่ตั้ง ใช้เซิร์ฟเวอร์
ดังนั้นหากคุณต้องการความรวดเร็ว 150ms การบัฟเฟอร์ทำให้ slowl เนื่องจากต้องการข้อมูลบัฟเฟอร์การรวบรวมพิเศษจะทำให้มีค่าใช้จ่ายเพิ่มเติม 10 ปีที่แล้วเมื่อเซิร์ฟเวอร์สร้างสคริปต์ 1s มันมีประโยชน์มาก
โปรดเนื่องจาก output_buffering มีขีด จำกัด หากคุณต้องการใช้ jpg ในการโหลดสามารถล้างอัตโนมัติและการส่งล้มเหลว
ไชโย
คุณสามารถทำแม่น้ำอย่างรวดเร็วหรือคุณสามารถทำทามะอย่างปลอดภัย :)