PHP4.0 มีชุดฟังก์ชันบัฟเฟอร์เอาต์พุต การสนับสนุนบัฟเฟอร์เอาต์พุตช่วยให้คุณสามารถเขียนฟังก์ชันที่รวมฟังก์ชันรอบ ๆ บัฟเฟอร์ที่บีบอัดได้ การสนับสนุนบัฟเฟอร์เอาต์พุตใน PHP4 ช่วยให้สามารถจัดเก็บข้อมูลส่วนหัว HTML โดยไม่คำนึงว่าเนื้อหา HTML จะถูกส่งออกหรือไม่ แต่ใน PHP ข้อมูลส่วนหัว ((header() ประเภทเนื้อหา และคุกกี้) จะไม่ถูกบัฟเฟอร์
ในกระบวนการใช้งาน PHP ย่อมหลีกเลี่ยงไม่ได้ที่จะใช้ header และ
setcookie two ฟังก์ชั่น ทั้งสองฟังก์ชั่นนี้จะส่งข้อมูลส่วนหัวของไฟล์ไปยังเบราว์เซอร์ แต่หากมีเอาต์พุตใดๆ (รวมถึงเอาต์พุตว่าง เช่น ช่องว่าง การขึ้นบรรทัดใหม่ และการป้อนบรรทัด) ก่อนที่จะใช้ทั้งสองฟังก์ชันนี้ จะเกิดข้อผิดพลาดขึ้น prompted ข้อมูล prompt เป็นดังนี้: "Header had all ready send by"! - มีการเพิ่มฟังก์ชันต่างๆ สำหรับการควบคุมบัฟเฟอร์ใน PHP 4.0 การใช้ฟังก์ชันเหล่านี้สามารถช่วยเราแก้ปัญหาต่างๆ ได้มากมาย
ชื่อฟังก์ชัน รูปแบบฟังก์ชัน คำอธิบายฟังก์ชัน
Flush flush() ส่งออกเนื้อหาของบัฟเฟอร์และลบบัฟเฟอร์ ฟังก์ชันนี้มักใช้และมีประสิทธิภาพมาก
ob_start เป็นโมฆะ ob_start (เป็นโมฆะ) เปิดบัฟเฟอร์เอาต์พุต เมื่อบัฟเฟอร์ทำงาน ข้อมูลส่วนหัวที่ไม่ใช่ไฟล์ทั้งหมดจากโปรแกรม PHP จะไม่ถูกส่ง แต่จะถูกบันทึกไว้ในบัฟเฟอร์ภายใน เพื่อที่จะส่งออกเนื้อหาของบัฟเฟอร์ คุณสามารถใช้ ob_end_flush() หรือใช้ ob_end_clean() เพื่อส่งออกเนื้อหาของบัฟเฟอร์
ob_get_contents string ob_get_contents(void) ส่งกลับเนื้อหาของบัฟเฟอร์ภายใน ฟังก์ชันนี้ส่งคืนเนื้อหาของบัฟเฟอร์ปัจจุบัน หรือ FALSE หากบัฟเฟอร์เอาต์พุตไม่ทำงาน
ob_get_length int ob_get_length(void) ส่งกลับความยาวของบัฟเฟอร์ภายใน ฟังก์ชันนี้ส่งคืนความยาวของบัฟเฟอร์ปัจจุบัน เช่น ob_get_contents หากบัฟเฟอร์เอาต์พุตไม่ทำงาน ส่งคืน FALSE
ob_end_flush เป็นโมฆะ ob_end_flush(void) ส่งเนื้อหาของบัฟเฟอร์ภายในไปยังเบราว์เซอร์และปิดบัฟเฟอร์เอาต์พุต ฟังก์ชันนี้จะส่งเนื้อหาของบัฟเฟอร์เอาต์พุต (ถ้ามี)
ob_end_clean เป็นโมฆะ ob_end_clean(void) ลบเนื้อหาของบัฟเฟอร์ภายในและปิดบัฟเฟอร์ภายใน ฟังก์ชั่นนี้จะไม่ส่งออกเนื้อหาของบัฟเฟอร์ภายใน!
ob_implicit_flush เป็นโมฆะ ob_implicit_flush ([int flag]) เปิดหรือปิดฟลัชแบบสัมบูรณ์ ใครก็ตามที่ใช้ Perl จะรู้ความหมายของ $|=x สตริงนี้สามารถเปิด/ปิดบัฟเฟอร์ได้ และฟังก์ชัน ob_implicit_flush ก็เหมือนกัน ค่าเริ่มต้นคือการปิดพื้นที่บัฟเฟอร์ เปิดเอาต์พุตแบบสัมบูรณ์
2. ตัวอย่างการวิเคราะห์:
1. ใช้ฟังก์ชันควบคุมบัฟเฟอร์เพื่อป้องกันข้อผิดพลาดในการส่งข้อมูลในส่วนหัวของไฟล์
<? //พร้อมท์ PHP
ob_start(); //เปิดบัฟเฟอร์
echo "ยินดีต้อนรับ /n"; //output
header("location:next.php"); //เปลี่ยนเส้นทางเบราว์เซอร์ไปที่ next.php
-
หากลบ ob_start แล้ว PHP จะแจ้งข้อผิดพลาดในบรรทัดที่ 4 ของไฟล์ และข้อความแสดงข้อผิดพลาดคือ "Header had all ready send by" อย่างไรก็ตาม หากเพิ่ม ob_start จะไม่มีข้อผิดพลาดเกิดขึ้น สาเหตุก็คือเมื่อ เปิดบัฟเฟอร์ข้อผิดพลาดหลังจาก echo อักขระจะไม่ถูกส่งออกไปยังเบราว์เซอร์ แต่จะยังคงอยู่ในบัฟเฟอร์ของเซิร์ฟเวอร์ อักขระเหล่านั้นจะไม่ถูกส่งออกจนกว่าคุณจะใช้ flush หรือ ob_end_flush ดังนั้นจะไม่มีข้อผิดพลาดที่ส่วนหัวของไฟล์มี ถูกส่งออก!
2. บันทึกผลลัพธ์ (นี่เป็นการใช้งานแบบคลาสสิกมาก)
สมมติว่าคุณต้องการทราบข้อมูลเอาต์พุตหน้าจอของไคลเอ็นต์ เช่น ผลลัพธ์เอาต์พุตของฟังก์ชัน ฯลฯ และข้อมูลเอาต์พุตนี้จะแตกต่างกันไปขึ้นอยู่กับไคลเอ็นต์ เราสามารถใช้ฟังก์ชัน <?phpinfo(); ?> เพื่อรับข้อมูลการตั้งค่าของเซิร์ฟเวอร์ แต่จะเป็นอย่างไรหากเราต้องการบันทึกเอาต์พุตของฟังก์ชัน phpinfo() ก่อนที่จะไม่มีการควบคุมบัฟเฟอร์อาจกล่าวได้ว่าไม่มีทางเลย แต่ด้วยการควบคุมบัฟเฟอร์เราสามารถแก้ไขได้อย่างง่ายดาย
-
ob_start(); //เปิดบัฟเฟอร์
phpinfo(); //ใช้ฟังก์ชัน phpinfo
$info=ob_get_contents(); //รับเนื้อหาของบัฟเฟอร์และกำหนดให้กับ $info
$file=fopen('phpinfo.txt','w'); //เปิดไฟล์ phpinfo.txt
fwrite($file,$info); //เขียนข้อมูลไปที่ phpinfo.txt
fclose($file); //ปิดไฟล์ phpinfo.txt
-
เมื่อใช้วิธีการข้างต้น คุณสามารถบันทึกข้อมูล phpinfo ของผู้ใช้รายอื่นได้ สิ่งนี้อาจไม่สามารถทำได้มาก่อน! ในทำนองเดียวกัน วิธีบัฟเฟอร์สามารถใช้เพื่อบันทึกงานที่ยากต่อการดำเนินการด้วยวิธีธรรมดา นี่เป็นวิธีการแปลง "กระบวนการ" บางอย่างให้เป็น "ฟังก์ชัน"