เต็มสูบกับ 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 # Config # ดึงค่าจาก Cache จาก Key ชื่อ IndexKey ในช่วง 10 วินาทีที่ผ่านมา # ถ้าผ่าน 10 วินาทีไปแล้วก็ให้ดึงค่าจาก Loop ที่ควรดึงเช่น MySQL หรืออะไรต่างๆใหม่ if(!$result){ # สมมุติเป็น Loop ดึง MySQL # ข้อมูลที่สมมุติว่าได้มาจาก Loop MySQL # ฝังข้อมูลลงใน Key ที่ชื่อว่า IndexKey # Loop นี้ไม่ผ่าน Cache เลย แสดงข้อความออกไปซักหน่อย } else{ # ถ้าเรียกใช้ในช่วง 10 วินาทีก็จะแสดงคำว่า ข้อมูลนี้มาจากส่วนของ Cache 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 (7,252)
Comments (9)
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
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
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 ดีกว่ามั้ย? ขอบคุณล่วงหน้าครับ
my site : http://www.mzpeter.co.uk
โดยคุณ Peter
2009-03-04 17:03:25
ตามความคิดผม Ajax + set cache ที่ .htaccess
โดยคุณ thunapi
2009-04-28 15:28:39
กำลังศึกษาเรื่องแคชอยู่พอดี มาเจอบทความนี้เข้า อิอิ
โดยคุณ danya
2009-05-20 11:12:05


















