ฉันได้ทำงานเพื่อเพิ่มประสิทธิภาพการทำงานของโปรแกรมมาระยะหนึ่งแล้ว และฉันมีความคิดที่น่าสนใจที่อยากจะแบ่งปันกับคุณ
แคชเป็นโหมดแอปพลิเคชันทั่วไปของกลยุทธ์ "พื้นที่สำหรับเวลา" และเป็นวิธีการสำคัญในการปรับปรุงประสิทธิภาพของระบบ การใช้แคชสามารถลดจำนวนการดำเนินการฐานข้อมูลได้อย่างมากในกรณีที่มีปริมาณการเข้าถึงขนาดใหญ่ ซึ่งช่วยลดภาระของระบบและปรับปรุงประสิทธิภาพของระบบได้อย่างมาก เมื่อเปรียบเทียบกับการแคชหน้า ชุดผลลัพธ์จะเป็น "ข้อมูลดิบ" ชนิดหนึ่งที่ไม่มีข้อมูลรูปแบบ จำนวนข้อมูลค่อนข้างน้อยและสามารถจัดรูปแบบใหม่ได้ ดังนั้นจึงค่อนข้างยืดหยุ่น เนื่องจาก PHP เป็นภาษาสคริปต์ที่ "คอมไพล์และดำเนินการในเวลาเดียวกัน" จึงเป็นวิธีที่สะดวกมากในการใช้แคชชุดผลลัพธ์ในระดับหนึ่ง - การใช้แคชโดยรวมส่วนโค้ดคำจำกัดความข้อมูลที่เกี่ยวข้องแบบไดนามิก หากแคชถูกสร้างขึ้นบน "RamDisk" ควรปรับปรุงประสิทธิภาพให้ดียิ่งขึ้น ด้านล่างนี้เป็นโค้ดตัวอย่างเล็กๆ สำหรับการอ้างอิง
// โหลดข้อมูลด้วยแคช
ฟังก์ชั่น load_data($id,$cache_lifetime) {
// ข้อมูลส่งคืน
$ข้อมูล = อาร์เรย์();
// สร้างชื่อไฟล์แคช
$cache_filename = 'แคช_'.$id.'.php';
// ตรวจสอบเวลาแก้ไขล่าสุดของไฟล์แคช
$cache_filetime = filemtime($cache_filename);
ถ้า (เวลา () - $cache_filetime <= $cache_lifetime) {
//** แคชยังไม่หมดอายุ
รวม($cache_filename);
} อื่น {
//** แคชหมดอายุ
// โหลดข้อมูลจากฐานข้อมูล
-
ในขณะที่ ($dbo->nextRecord()) {
// $ข้อมูล[] = ...
-
// จัดรูปแบบข้อมูลเป็นไฟล์ php
$data_cache = "
ในขณะที่ (รายการ($key, $val) = แต่ละอัน($data)) {
$data_cache .= "$data['$key']=array('";
$data_cache .= "'NAME'=>"".qoute($val['NAME'])"","
$data_cache .= "'VALUE'=>"".qoute($val['VALUE'])."""
$data_cache .= ";);rn";
-
$data_cache = "?>rn";
// บันทึกข้อมูลลงในไฟล์แคช
ถ้า ($fd = fopen($cache_filename,'w+')) {
fputs($fd,$data_cache);
fclose($fd);
-
-
ส่งคืนข้อมูล $;
-
-
สถานการณ์ที่เกี่ยวข้อง:
1. ข้อมูลค่อนข้างเสถียร โดยส่วนใหญ่เป็นการดำเนินการอ่าน
2. การทำงานของไฟล์เร็วกว่าการทำงานของฐานข้อมูล
3. การเข้าถึงข้อมูลที่ซับซ้อน การเข้าถึงข้อมูลปริมาณมาก การเข้าถึงข้อมูลจำนวนมาก และภาระงานหนักมากในฐานข้อมูลระบบ
4. โครงสร้างการแยก Web/DB หรือโครงสร้าง DB เดียวแบบหลายเว็บ
คำถามที่ไม่ได้รับการยืนยัน:
1. การอ่านและเขียนไฟล์ระหว่างการเข้าถึงพร้อมกันจะทำให้เกิดปัญหาการล็อคหรือไม่
2. ประสิทธิภาพเป็นอย่างไรเมื่อมีไฟล์ข้อมูลมากเกินไป?
แนวคิดการขยาย:
1. สร้างโค้ดคำจำกัดความข้อมูล JavaScript และเรียกใช้บนไคลเอ็นต์
2. ยังไม่ได้คิดเลย...
หวังว่าจะได้หารือร่วมกัน
แคช
หากคุณต้องการทำให้แอปพลิเคชัน PHP ขนาดใหญ่ของคุณมีประสิทธิภาพที่ดีขึ้น การใช้แคชก็เป็นวิธีที่ดีเช่นกัน มีโซลูชันการแคชมากมาย รวมถึง: Zend Cache, APC และ Afterburner Cache
ผลิตภัณฑ์ทั้งหมดนี้คือ "โมดูลแคช" เมื่อมีการร้องขอไฟล์ .php ครั้งแรก โค้ดดังกล่าวจะบันทึกโค้ดระดับกลาง PHP ไว้ในหน่วยความจำของเว็บเซิร์ฟเวอร์ จากนั้นจึงตอบกลับคำขอครั้งถัดไปด้วยเวอร์ชัน "คอมไพล์" วิธีการนี้สามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันได้จริง เนื่องจากจะลดการเข้าถึงดิสก์ให้เหลือน้อยที่สุด (โค้ดถูกอ่านและแยกวิเคราะห์แล้ว) และโค้ดจะทำงานโดยตรงในหน่วยความจำ ทำให้เซิร์ฟเวอร์ตอบสนองต่อคำขอได้เร็วขึ้นมาก แน่นอนว่าโมดูลแคชจะตรวจสอบการเปลี่ยนแปลงในไฟล์ต้นฉบับ PHP และแคชเพจใหม่หากจำเป็น ดังนั้นจึงป้องกันไม่ให้ผู้ใช้รับเพจที่ยังคงสร้างโดยโค้ด PHP ที่ล้าสมัย เนื่องจากโมดูลแคชสามารถลดภาระบนเซิร์ฟเวอร์ได้อย่างมาก และปรับปรุงประสิทธิภาพการตอบสนองของแอปพลิเคชัน PHP จึงเหมาะมากสำหรับเว็บไซต์ที่มีภาระงานหนัก
วิธีเลือกผลิตภัณฑ์แคชเหล่านี้
Zend Cache เป็นซอฟต์แวร์เชิงพาณิชย์จาก Zend Technologies บริษัทที่กล่าวถึงก่อนหน้านี้ซึ่งให้บริการกลไก PHP และ Zend Optimizer ฟรี Zend Cache สมควรได้รับจริงๆ! สำหรับหน้า PHP ขนาดใหญ่ คุณจะรู้สึกได้ว่าความเร็วจะเพิ่มขึ้นหลังจากการรันครั้งแรก และเซิร์ฟเวอร์จะมีทรัพยากรที่พร้อมใช้งานมากขึ้น น่าเสียดายที่ผลิตภัณฑ์นี้ไม่ฟรี แต่ในบางกรณีก็ยังมีความคุ้มค่าสูงอยู่
Afterburner Cache เป็นโมดูลแคชฟรีจาก Bware Technologies ปัจจุบันผลิตภัณฑ์นี้อยู่ในเวอร์ชันเบต้า Afterburner Cache มีลักษณะคล้ายกับ Zend Cache แต่ไม่ได้ปรับปรุงประสิทธิภาพได้มากเท่ากับ Zend Cache (แต่) และไม่สามารถทำงานร่วมกับ Zend Optimizer ได้
APC เป็นตัวย่อของ Alternative PHP Cache ซึ่งเป็นโมดูลแคชฟรีอีกโมดูลจาก Community Connect ผลิตภัณฑ์มีความเสถียรเพียงพอสำหรับการใช้งานอย่างเป็นทางการแล้ว และดูเหมือนว่าจะปรับปรุงความเร็วในการตอบสนองต่อคำขอได้ในระดับดี
เกี่ยวกับการบีบอัด
โมดูล Apache mod_gzip ฟรีจาก Remote Communications มีความสามารถในการบีบอัดเนื้อหาเว็บแบบคงที่สำหรับเบราว์เซอร์ที่รองรับการเข้ารหัสเนื้อหาประเภทนี้ สำหรับเนื้อหาเว็บแบบคงที่ส่วนใหญ่ mod_gzip ทำงานได้ดีมาก mod_gzip สามารถคอมไพล์ลงใน Apache ได้อย่างง่ายดาย และยังสามารถใช้เป็น DSO ได้อีกด้วย ตามการสื่อสารระยะไกล mod_gzip ยังสามารถบีบอัดเนื้อหาไดนามิกจาก mod_php, mod_perl ฯลฯ ฉันพยายามซ้ำแล้วซ้ำอีก แต่ดูเหมือนจะไม่ทำงาน ฉันได้อ่านฟอรัมและบทความมากมายเกี่ยวกับ mod_gzip และดูเหมือนว่าปัญหานี้คาดว่าจะได้รับการแก้ไขใน mod_gzip เวอร์ชันถัดไป (อาจเป็น 1.3.14.6f) ถึงเวลานั้น เราสามารถใช้ mod_gzip บนส่วนที่คงที่ของเว็บไซต์ได้
อย่างไรก็ตาม บางครั้งเราไม่ต้องการบีบอัดเนื้อหาแบบไดนามิก ดังนั้น เราจึงต้องหาวิธีอื่น วิธีหนึ่งคือใช้ class.gzip_encode.php ซึ่งเป็นคลาส PHP ที่สามารถใช้เพื่อบีบอัดเนื้อหาของเพจโดยการเรียกฟังก์ชันบางอย่างของคลาสที่จุดเริ่มต้นและจุดสิ้นสุดของสคริปต์ PHP หากคุณต้องการใช้โซลูชันนี้ในระดับเว็บไซต์ คุณสามารถเรียกใช้ฟังก์ชันเหล่านี้ได้จากคำสั่ง auto_prepend และ auto_append ในไฟล์ php.ini แม้ว่าวิธีนี้จะมีประสิทธิภาพ แต่ก็ทำให้เว็บไซต์ที่มีการโหลดสูงมีค่าใช้จ่ายเพิ่มขึ้นอย่างไม่ต้องสงสัย สำหรับคำแนะนำโดยละเอียดเกี่ยวกับวิธีใช้คลาสนี้ โปรดดูซอร์สโค้ด คำอธิบายซอร์สโค้ดค่อนข้างสมบูรณ์ และผู้เขียนจะบอกคุณทุกสิ่งที่คุณจำเป็นต้องรู้
PHP 4.0.4 มีตัวจัดการแคชเอาต์พุตใหม่ ob_gzhandler ซึ่งคล้ายกับคลาสก่อนหน้า แต่มีการใช้งานที่แตกต่างกัน ควรเพิ่มเนื้อหาต่อไปนี้ใน php.ini เมื่อใช้ ob_gzhandler:
output_handler = ob_gzhandler;
บรรทัดโค้ดนี้ทำให้ PHP เปิดใช้งานการแคชเอาต์พุตและบีบอัดทุกสิ่งที่ส่งออกไป หากคุณไม่ต้องการเพิ่มบรรทัดโค้ดนี้ใน php.ini ด้วยเหตุผลบางประการ คุณยังสามารถเปลี่ยนพฤติกรรมเริ่มต้นของเซิร์ฟเวอร์ได้ (ไม่มีการบีบอัด) ผ่านไฟล์ .htaccess ในไดเร็กทอรีที่มีไฟล์ต้นฉบับ PHP อยู่ เป็นดังนี้:
php_value output_handler ob_gzhandler.php_value
หรือเรียกจากโค้ด PHP ดังนี้: ob_start("ob_gzhandler");
วิธีการใช้ตัวจัดการแคชเอาท์พุตนั้นมีประสิทธิภาพมากอย่างแน่นอน และไม่ได้วางภาระพิเศษใด ๆ บนเซิร์ฟเวอร์ อย่างไรก็ตาม จะต้องสังเกตว่า Netscape Communicator มีการรองรับกราฟิกที่บีบอัดได้ไม่ดี ดังนั้น เว้นแต่คุณจะมั่นใจได้ว่าผู้ใช้ทั้งหมดใช้เบราว์เซอร์ IE คุณควรปิดการใช้งานกราฟิก JPEG และ GIF ที่บีบอัด โดยทั่วไป การบีบอัดนี้จะใช้ได้กับไฟล์อื่นๆ ทั้งหมด แต่ขอแนะนำให้คุณทดสอบแยกกันสำหรับแต่ละเบราว์เซอร์ โดยเฉพาะอย่างยิ่งหากคุณใช้ปลั๊กอินพิเศษหรือโปรแกรมดูข้อมูล สิ่งนี้สำคัญอย่างยิ่ง