เพิ่มความเร็วเว็บไซต์ด้วย GZip Compression
ออกตัวก่อนเลยว่าเหมาะกับ เบราเซอร์รุ่นใหม่
พวก IE 6, 7, 8 นี่เก่าไปละ IE 9 เองก็จะยังเก่าไปซะด้วยซ้ำ -_-"
ไปได้มาจาก Google นี่ล่ะ ทีแรกกะว่าจะใช้ APC, Memcache อะไรพวกนี้ซะอีก
แต่ลองถึงคนที่ต้องเอาโค้ดเราไปคิดตั้ง บางทีเค้าจะคอมไพล์ APC ยังจะทำไม่เป็นซะด้วยซ้ำไปเลย Search ไปๆ มาๆ
ก็มาเจอวิธีแบบง่ายๆ อาศัยฟังก์ชั่นของ PHP ธรรมดานี่ล่ะ
* เช็กจาก $_SERVER['HTTP_ACCEPT_ENCODING'] ก่อนก็ได้ว่าเซิฟเวอร์ของเราเปิดใช้งาน gzip รึป่าว
** มา edit เพิ่มเติม
จากที่ลองเอาไปใช้งาน ถ้าจะให้เห็นผลที่ชัดเจนต้องเซ็ตค่าพวก header เข้าไปด้วยจะแหล่มมาก
if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')>0){
ob_start('ob_gzhandler');
header('Content-Encoding: gzip');
header('Accept-Encoding: gzip, deflate');
$gz_enable = TRUE;
}else{
ob_start();
$gz_enable = FALSE;
}
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: public');
header('Expires: '.gmdate("D, d M Y H:i:s", time()+3600). ' GMT');
header('Last-Modified: '.gmdate("D, d M Y H:i:s"). ' GMT');
header('Pragma: no-cache');
if($gz_enable==TRUE){
// Get contents and length
$content_ob = ob_get_contents();
$gzip_size = ob_get_length();
ob_end_clean();
// Compress a string with gzcompress
$content = substr(gzcompress($content_ob, 9), 0, - 4);
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
echo $content;
// pack data to binary
echo pack('V', crc32($content_ob));
echo pack('V', $gzip_size);
}else{
$content_ob = ob_get_contents();
ob_end_clean();
echo $content_ob;
}
หลักการ แบบคร่าวๆ ก็น่าจะเป็น ทำ gzip ก่อน เสร็จแล้วก็แปลงเป็น binary เซิฟเวอร์ก็จะได้อ่านได้เร็วขึ้นประมาณนี้(ล่ะมั้ง ฮ่าาาาา ก็แปลตาม function ที่เค้าใช้น่ะล่ะ)
Ref.
พวก IE 6, 7, 8 นี่เก่าไปละ IE 9 เองก็จะยังเก่าไปซะด้วยซ้ำ -_-"
ไปได้มาจาก Google นี่ล่ะ ทีแรกกะว่าจะใช้ APC, Memcache อะไรพวกนี้ซะอีก
แต่ลองถึงคนที่ต้องเอาโค้ดเราไปคิดตั้ง บางทีเค้าจะคอมไพล์ APC ยังจะทำไม่เป็นซะด้วยซ้ำไปเลย Search ไปๆ มาๆ
ก็มาเจอวิธีแบบง่ายๆ อาศัยฟังก์ชั่นของ PHP ธรรมดานี่ล่ะ
* เช็กจาก $_SERVER['HTTP_ACCEPT_ENCODING'] ก่อนก็ได้ว่าเซิฟเวอร์ของเราเปิดใช้งาน gzip รึป่าว
** มา edit เพิ่มเติม
จากที่ลองเอาไปใช้งาน ถ้าจะให้เห็นผลที่ชัดเจนต้องเซ็ตค่าพวก header เข้าไปด้วยจะแหล่มมาก
// Calling function ob_gzhandler if server enable gzip
if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')>0){
ob_start('ob_gzhandler');
header('Content-Encoding: gzip');
header('Accept-Encoding: gzip, deflate');
$gz_enable = TRUE;
}else{
ob_start();
$gz_enable = FALSE;
}
// Set header
header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: public');
header('Expires: '.gmdate("D, d M Y H:i:s", time()+3600). ' GMT');
header('Last-Modified: '.gmdate("D, d M Y H:i:s"). ' GMT');
header('Pragma: no-cache');
// Your template here
echo "Speed Test";
if($gz_enable==TRUE){
// Get contents and length
$content_ob = ob_get_contents();
$gzip_size = ob_get_length();
ob_end_clean();
// Compress a string with gzcompress
$content = substr(gzcompress($content_ob, 9), 0, - 4);
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
echo $content;
// pack data to binary
echo pack('V', crc32($content_ob));
echo pack('V', $gzip_size);
}else{
$content_ob = ob_get_contents();
ob_end_clean();
echo $content_ob;
}
หลักการ แบบคร่าวๆ ก็น่าจะเป็น ทำ gzip ก่อน เสร็จแล้วก็แปลงเป็น binary เซิฟเวอร์ก็จะได้อ่านได้เร็วขึ้นประมาณนี้(ล่ะมั้ง ฮ่าาาาา ก็แปลตาม function ที่เค้าใช้น่ะล่ะ)
Ref.
Comments
Post a Comment