Scriptdd.com

บทความบ้าบ่นของคนทำเว็บ ปี 8

เต็มสูบกับ PHP-Cache-Kit

หัวข้อ บทความ แทก HTML | MySQL

สมาชิกคงไปแอบๆเห็น Web ที่ผมช่วยเพื่อนดูแลที่ Googig.com มาบ้าง
โดยผมได้เอา Diarydd ไปโมดิฟายทำระบบ member ให้บริการกับสมาชิก Googig

เรื่องราวต่อไปนี้เป็นผลพ่วงจากความห่วยแตกของ Diarydd นั้นเองครับ ^^


ห่วยแตกเพราะข้อมูลทุกอย่างเรียก MySQL หมด

เนื่องจากแต่เดิมผมเขียน Diarydd เพราะความต้องการส่วนตัว
คือเป็นการใช้งานส่วนตัวจริงๆไม่ได้คิดเผื่อไปว่า
ถ้าเอาไปเชื่อมทำระบบ member เปิดให้บริการ
เอิ้กๆ และมันก็เกิดขึ้นครับ ฮาๆ MySQL ล่ม

ใครเอา Diarydd ไปใช้ลองนับดีๆว่าใน 1 หน้ามีการเรียกใช้ MySQL กี่ครั้ง

เอาตั้งแต่เปิด mysql

เรียก ปฎิทิน
เรียก top 10
เรียก top content
เรียก friend link
เรียก content

สารพัด 20 กว่า Call ฮา ไม่ล่มก็เวอร์ล่ะ

ถ้าแค่ diarydd ตัวเดียวคงไม่เท่าไร แต่พอทำระบบสมาชิกใส่ไป
และด้วยจำนวนสมาชิก Googig ด้วยแล้ว

1 วินาที Request เรียกใช้ MySQL นับไม่ถ้วน

ระบบอืดเห็นๆล่ะครับ


วิเคราะห์ปัญหาหาทางแก้

จากการวิเคราะห์ Script แล้วสรุปได้เลยว่า ต้องลดปริมาณการเรียกใช้ MySQL ลงให้น้อยที่สุด
ปัญหาก็คือแล้วตูจะลดยังไงฟะ ในเมื่อข้อมูลทุกจุดต้องการความ Dynamic

Dynamic ในที่นี้ผมมาวิเคราะห์ต่อไป แล้วใครเป็นคนที่ทำให้มัน Dynamic ล่ะ ??
คือข้อมูลที่ปรากฏจะ Dynamic ได้ก็มาจาก เจ้าของ Diary เป็นคนแก้ไขเปลี่ยนแปลง

ทางฝั่ง user ที่เข้าชมเป็นเพียงผู้เสพข้อมูล มิได้เป็นคนทำให้ข้อมูลเกิดการ Dynamic
(ยกเว้นการนับจำนวนคนอ่าน Diary)

ฉะนั้นคิดใหม่ทำใหม่ดีที่สุดสำหรับงานที่ออกแบบสำหรับสมาชิกเยอะๆ

Gen แม่งเป็น HTML ไปเลย เอิ้กๆ

เจ้าของ Diary เขียน diary 1 หน้าก็ไปสร้างเป็น HTML ถ้ามีการแก้ไขเปลี่ยนแปลงก็มาแก้ไขเปลี่ยนแปลง HTML File ดังกล่าว
เวลา user เข้ามาอ่าน ก็จะมาอ่านจาก HTML ดังกล่าวไม่ต้องเข้ามาวนเรียกจาก MySQL

ด้วยมุขนี้ผมจึงนำไปประยุกต์ ในหลักการสร้างเป็น Text File ประจำวันเอาไว้ แล้วใช้ PHP มาเรียกประกอบเอาอีกที

ก็อยู่รอดมาถึงปัจจุบันได้ (แม้จะเอ๋อๆไปบ้าง)


เจอของดี PHP มีมาให้แล้ว

ก็เพิ่งเห็นเหมือนกัน พอดีกับงานของ Office ลูกค้าบ่นๆมา Web เรียกชมได้ช้ามาก
(ไม่ช้าได้ไงฟะ เล่นทุกเมนู ทุก table สุ่มแสดงผลหมด) ก็ดีฮะ ลูกค้าเสนอไอเดียเรื่องนี้มาให้

มันคือ php-cache

เจ้าหลักการของ php-cache นี้อาศัยการสร้าง cache file ไว้เหมือนที่เขียนไว้ด้านบนนั้นแหล่ะ
เพียงแต่อันนี้ทำเป็น script ไว้เสร็จสรรพแล้ว เพียงแต่มาศึกษาการใช้งานมันเท่านั้น
ด้วยความที่มันหลายแนวคิดและหลายเจ้า ผมจึงขอหยิบอันที่ง่ายๆมานำเสนอดีกว่า

http://acme-web-design.info/php-cache-kit.htm

Download มาแล้วลองเขียน Script ทดสอบดู

<?php

#เรียก cache-kit.php
include_once('cache-kit.php');

# Config
$cache_active = true;
$cache_folder = 'cache/';

# ดึงค่าจาก Cache จาก Key ชื่อ IndexKey ในช่วง 10 วินาทีที่ผ่านมา
$result = acmeCache::fetch('IndexKey', 10); // 10 seconds

# ถ้าผ่าน 10 วินาทีไปแล้วก็ให้ดึงค่าจาก Loop ที่ควรดึงเช่น MySQL หรืออะไรต่างๆใหม่

if(!$result){

# สมมุติเป็น Loop ดึง MySQL
# วิ่งดึงค่าจาก MySQL
# ตู๊ด
# ตู๊ด

# ข้อมูลที่สมมุติว่าได้มาจาก Loop MySQL
$result = '<h2> Hello world</h2> <p>Build time: '.date("F j, Y, g:i a").'</p>';

# ฝังข้อมูลลงใน Key ที่ชื่อว่า IndexKey
acmeCache::save('IndexKey', $result);

# Loop นี้ไม่ผ่าน Cache เลย แสดงข้อความออกไปซักหน่อย
echo('No Cache <br/>');

} else{

# ถ้าเรียกใช้ในช่วง 10 วินาทีก็จะแสดงคำว่า ข้อมูลนี้มาจากส่วนของ Cache
echo('Cached result<br/>');

}

echo $result;

?>



ลองเรียกใช้งานครั้งแรกระบบจะบอกว่า ข้อมูลนี้ไม่ได้อยู่ใน Cache เริ่มบันทึกเวลา 7:01 pm


กดเรียก Script อีกครั้งระบบจะบอกล่ะว่าเป็นข้อมูลใน Cache (ในช่วง 10 วินาที)


ข้อมูลที่เก็บเอาไว้ใน folder Cache

จาก Script นี้ก็หมายความว่า ในช่วง 10 วินาทีของ Server จะมีเพียง 1 Request ที่วิ่งเข้ามาเรียกข้อมูล
จาก MySQL ไปสร้าง Cache file เอาไว้ ก็ถ้าคิดแบบง่ายๆ (สมมุติว่าไม่เสียเวลาเรียก MySQL เลย)
มีการเรียกใช้ MySQL ทุกๆ 1 วินาที

ในช่วง 1 นาทีจะเดิมเรียก MySQL 60 ครั้ง แบบ cache นี้ก็จะเหลือแค่ 6 ครั้ง

จ๊าบไหมล่ะครับ ??

ซึ่งความถี่ในการสร้าง cache นี้ก็ขึ้นอยู่กับปริมาณการเรียกใช้ และความถี่ของการเปลี่ยนแปลงข้อมูลนั้นเอง



สรุป

php-cache-kit เป็นเพียงวิธีนึงที่สามารถช่วยแบ่งเบาภาระของ MySQL ได้
โดยสิ่งที่ต้องยอมแลกก็คือความสดของข้อมูลนิดหน่อย ซึ่งอาจจะไม่จำเป็นมากขึ้น
สำหรับ Web ที่มี user เข้าชมมากๆ (ถนอม MySQL ไว้ปลอดภัยสบายใจกว่า)

ซึ่งบางกรณีที่ต้องการความเร็วการแสดงผลข้อมูลสูงสุดผมคงแนะนำให้ทำเป็น
HTML File เหมือนตัวอย่าง Webboard pantip.com นั้นแหล่ะครับ

ปล. การตั้ง IndexKey ในแต่ละหัวข้อห้ามตั้งซ้ำกันเด็ดขาดมิฉะนั้น
จะเกิดการเรียกใช้ cache ซ้ำกันทำให้การแสดงผลผิดพลาดได้

ปล. อีกทีสงสัยได้กลับไปรื้อ googig diary ใน php-cache-kit อีกรอบเอิ้กๆ

จบ :P

รูปคุณ Read (20,543) Comments (11) 2006-05-25 19:12:34

ความคิดเห็น

ดูจาก screen shot ตัวนี้น่าจะเป็น file cache ใช่มั้ยครับ

มีอีกทางเลือกนึงสำหรับคนที่อยากให้เร็วกว่านี้ ก็คือการใช้ memcache ครับ (http://www.danga.com/memcached/) ซึ่งจะเอา cache ไปเก็บไว้ใน RAM เลยครับ วิธีนี้เร็วสุดๆ PHP มี API รองรับด้วยครับ (http://th2.php.net/memcache) เว็บไซต์ดังๆ ที่ใช้ memcache ก็คือ Wikipedia

รูปคุณ MacroArt โดยคุณ MacroArt 2007-04-16 11:23:11

ส่วนตัว ตอนนี้ผม หันมาเก็บ Data ลง MySQL แล้วเวลา User Save data ก็สั่งให้ Gen ออกมาเป็น HTML แต่ถ้าอะไรหลบไม่ได้ ก็จะเก็บลง SQLite ถ้าไม่ได้จิงๆก็ต้อง MySQL แต่จะพยายาม แยก Tables เพราะเจอปัญหา MySQL Lock tables (DB ประมาณ 7G) ตอนนี้ก็ไปหวังเพิ่ง SQLite แต่เวลาเขียน Code ก็ปวดหัวเอาการอยู่

อีกส่วน ถ้า Data ตรงนั้นไม่สำคัญมาก ประเภทตัวเลข ต้อง Update ทุกๆครั้ง ก็ไปกำหนดที่ MySQL ที่ my.cf ใส่ low-priority-update เข้าไป MySQL จะยอมให้ Query ได้แม้ว่าจะโดน Lock Tables อยู่ก็ตาม

รูปคุณ อัท โดยคุณ อัท 2007-06-06 05:26:42

งงจัด

รูปคุณ ญา โดยคุณ ญา 2007-06-26 17:11:35

ตอนนี้ผมมาพัฒนาเว็บ pantipmarket.com ผมจะใช้ XML ครับ

รูปคุณ เด็กเขื่องใน โดยคุณ เด็กเขื่องใน 2007-09-25 22:40:49

ขอบคุณพี่อั้มสำหรับความรู้เจ๋งๆ นะครับ

รูปคุณ เด็กเขื่องใน โดยคุณ เด็กเขื่องใน 2007-09-25 22:42:39

แยกทราบวิธีเขียน case file ในการใช้งานกับproxyค่ะ พอจะcode ตัวอย่างมั้ยค่ะ

รูปคุณ kimera โดยคุณ kimera 2008-08-08 10:38:09

ไม่ทราบว่าแตกต่างกันมั้ยหากผมจะใช้

.htaccess แทน

## สำหรับเก็บ cache ไฟล์ที่ไม่จำเป็นต้องโหลดบ่อย
## http://www.mzpeter.co.uk/
# 1 YEAR
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
Header set Cache-Control "max-age=29030400, public"
</FilesMatch>

# 1 MONTH อันนี้ตัวดี พวกไฟล์รูปเนี่ยเก็บ cache ไว้เลย
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=2419200, public"
</FilesMatch>

# 3 HOUR
<FilesMatch "\.(txt|xml|js|css)$">
Header set Cache-Control "max-age=10800"
</FilesMatch>

# NEVER CACHE สั่งให้มันไม่ต้องเก็บ cache พวก dynamic file
<FilesMatch "\.(html|htm|php|cgi|pl)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</FilesMatch>

แล้วถ้าแตกต่าง ผมควรเปลี่ยนไปใช้ php-cache kit ดีกว่ามั้ย? ขอบคุณล่วงหน้าครับ

รูปคุณ Peter โดยคุณ Peter 2009-03-04 17:03:25


my site : http://www.mzpeter.co.uk


ตามความคิดผม Ajax + set cache ที่ .htaccess

รูปคุณ thunapi โดยคุณ thunapi 2009-04-28 15:28:39



กำลังศึกษาเรื่องแคชอยู่พอดี มาเจอบทความนี้เข้า อิอิ

รูปคุณ danya โดยคุณ danya 2009-05-20 11:12:05

ผมใช้ memcache ครับ เอา result query ไปเก็บไว้ในแรม เวลาดึงก็ไม่ต้องดึงจาก mysql ครับ

เร็วกว่า cache แบบ html อีกครับ เพราะดึงจาก แรม ไม่ได้ดึงจาก ดิสก์

แต่แบบนี้ก็ดีนะ ขอบคุณสำหรับวิธีทำครับ

รูปคุณ ball โดยคุณ ball 2010-04-14 10:34:15

เก็บโค๊ดบางส่วนไว้ในแรม ปกติโฟลเดอร์ /tmp ในลินุกซ์เป้น Main Memory

รูปคุณ หนุ่ยไพธอน โดยคุณ หนุ่ยไพธอน 2011-12-30 08:44:18

ร่วมแสดงความคิดเห็น



ขอความกรุณา ปัญญาชน ทุกๆท่าน รณรงค์การใช้ภาษาไทยให้ถูกต้อง
กรุณา ลงความคิดเห็นโดยใช้ภาษาไทยให้เป็นภาษาไทย งดการใช้ภาษาวัยรุ่น,
แอ๊บแบ๊ว บอกตรงๆปัญญาอ่อน !! Admin นั่งอ่านแล้วปวดหัว

เข้าระบบ


จำไว้ด้วยนะจ้ะ

สมัครสมาชิก
ลืมรหัสผ่าน

บทความล่าสุด

Gallery

Tags

HTML barcampbkk2 Yahoo About me Notebook Apache FTR ล้อหมอบ เฟรม OEM barcampbangkok2 SMS SEO WordPress PHP Windows Ajax Motorcycle bicycle จักรยาน Blog CSS Lenovo Security Web2.0 DOM ROM Developer MySQL ASP Android

อื่นๆ ...

เพื่อนบ้าน

สถิติส่วนตัว

คลิกรับ Feed สิจ๊ะ

TwitterCounter for @9aum

Scriptdd.com | ctdd Version 3.0 ติดต่อฐานข้อมูลทิ้งสิ้น 6 ครั้งใช้เวลาประมวลผล 0.1383 วินาที
โปรแกรมโดย 9AuM | ออกแบบโดย styleshout