output buffer เป็นการใส่ข้อมูลลงใน buffer ก่อนที่ php จะส่งข้อมูล ถ้าไม่ใส่ข้อมูลลงใน buffer ก่อน php จะส่งข้อมูลทันทีสามารถใช้ buffer ได้ 2 วิธีคือ php.ini และ การใช้ฟังก์ชัน
การใช้ php.ini ทำให้scriptทั้งหมดใช้ output buffer แต่การใช้ฟังก์ชันจะอิสระกว่าคือใช้เฉพาะscript่ส่วนที่ผู้ใช้ต้องการใช้ได้ฟังก์ชันที่สำคัญคือ
ob_start()
ob_end_flush()
ob_end_clean()
ตัวอย่าง
ob_start();
print("Test 1n");
ob_end_flush()
จากตัวอย่างเป็นการพิมพ์คำว่า Test1 จะไม่พิมพ์ในทันทีที่มีคำสั่ง print เมื่อเจอ ob_end_flush() จึงทำการพิมพ์กักการทำงานไว้ใน buffer ก่อน
ตัวอย่าง
ob_start();
print("Test 1n");
ob_end_clean()
จากตัวอย่างฟังก์ชัน ob_end_clean() จะทำการลบข้อมูลใน buffer ทำให้ไม่มีการพิมพ์ Test1
ประโยชน์ของ output buffer เช่น สามารถที่จะใช้ output buffer เก็บข้อมูลที่ query มาจากฐานข้อมูล แล้วเขียนลงใน file ที่สร้างขึ้นมาได้
การทำ Cache ให้ความเร็วทะลุมิติ
Cache (แคช) คือการเรียกข้อมูลที่ปกติต้องไปดึงมาทุกครั้ง ก็นำมาประมวลผลครั้งเดียว และไม่ไปดึงมาอีก
ในเมื่อทราบความแล้ว ต่อมา เราจะทำ Cache อย่างไร? นี่คือคำถามยอดฮิตติดอวกาศเลยทีเดียว แน่นอนว่าการทำแคช คือการเก็บข้อมูลที่เรียกซ้ำไปซ้ำมา ให้เป็นการเรียกครั้งเดียว หรือครั้งคราว ดังนั้นการทำ Cache ใน Php จึงทำได้ง่ายๆ ดังนี้
1. ใช้เฟริมแวร์ หรือฟังก์ชั่นสำเร็จรูปต่างๆ – ซึ่งผมขอไม่กล่าวตรงนี้
2. ทำเอง – อาจจะใช้งาน Cron Jobs มาอัพเดท Cache ก็ได้ แต่ผมว่ามันเปลืองทรัพยากรใช้เครื่องเซิฟเวอร์มากเกินไป เรามาคิด
วิธีที่มันดีกว่านี้กันหน่อย…. นึกไปนึกมา นึกได้ถึงคำสั่ง Php ยอดฮิตอีกคำสั่งนึง นั่นคือ ob_start() ที่เรานำมาแก้ไข เวลาเจอปัญหากับ Session หรือ header ขึ้นมา เราก็ยัดคำสั่งนี้เข้าไป แต่คุณรู้หรือไม่ คำสั่ง ob_start() จริงๆแล้ว มันมีหน้าที่ใช้ทำอะไร
จริงๆแล้ว ob_start() คือคำสั่งที่ไว้เก็บข้อมูลทั้งหมดที่ต้องแสดงผลไว้ก่อน (มุบมิบนั่นเอง) แล้วจริงแสดงผล หลังจากโหลดเสร็จหรือใช้คำสั่งอื่นๆ ให้มันแสดงผล และหากไม่ใส่คำสั่ง ob_end_clean() ดักไว้ตรงไหนซักแห่ง มันก็จะเก็บไว้ทั้งหน้าเลย พอโหลดเสร็จ จึงแสดงผลออกมา (ร้ายกาจจจจ)
มาถึงการทำ Cache จริงๆซะที น้ำมานาน และโค้ดทั้งหมด ที่เราจะใช้ในงานนี้ก็คือ….
<?Php
$dir_cache = "cache/";
$myfile = str_replace(array("/","","."),"",$_SERVER["REQUEST_URI"]);
$cache_minute = 1;
$file_cache = $dir_cache."cache.".$myfile.".html";
if (file_exists($file_cache)){
if (strtotime("+".$cache_minute." minute", filemtime($file_cache)) > time()){
echo file_get_contents($file_cache);
exit();
}
}
ob_start();
?>
...
<?Php
$output = ob_get_contents();
ob_end_clean();
file_put_contents($file_cache,$output);
echo $output;
?>
ครับ มีแค่นี้ครับ ขออธิบายดังนั้น เอ้ย นี้ นะครับ
1. ตัวแปร $dir_cache คือเป็นตัวแปร ที่ใช้ระบุที่อยู่ ที่จะเก็บไฟล์ Cache (โดยปกติแล้ว พวก CMS ต่างๆ ก็เลือกใช้โฟลเดอร์ชื่อ cache
2. ตัวแปร $myfile คือตัวแปรที่ใช้เก็บชื่อของไฟล์ Cache ซึ่งจริงๆ จะตั้งเป็นอะไรก็ได้ แต่ตั้งเป็นที่อยู่ของลิ้ง น่าจะไม่ซ้ำแน่ๆอยู่แล้ว
3. ตัวแปร $cache_minute คือเวลาของ Cache ที่จะให้หมดอายุ เป็นหน่วยเป็นนาที แต่ถ้าอยากได้หน่วยอื่น ก็แก้บรรทัดที่ 7
(if (strtotime(“+”.$cache_minute.” minute”, filemtime($file_cache)) > time()){) แก้ไขตรง strtotime ครับ (ลองหาข้อมูลเพิ่มเติมดูน๊า~)
ก็ หลักๆก็มีแค่นี้ หลักการทำงานก็ง่ายๆ แต่ลองไปศึกษาเองนะครับ (มั่นใจ คุณทำได้ :P ) และก็ อย่าลืมสร้างโฟลเดอร์ cache และ CHMOD นะครับ เดี๋ยวจะ งง ทำไมเก็บ Cache ไม่ได้
สคริป หาดูๆแล้ว งงๆ มันคืออะไรฟ่ะ ลงก๊อบแล้วไปรันดูครับ แล้วลองดูในโฟลเดอร์ cache (CHMOD 777 ด้วยนะ) จะมีไฟล์อยู่ ลองเปิดดูครับ :-) แล้วคุณจะเข้าใจเพิ่มแน่นอน