เปลี่ยนใจใช้ Zend Cache
สวัสดีช่วงนี้ มาอัพเดทถี่เลย สงสัยดีใจใกล้จะ เทศกาลสงกรานต์ เนื้อหาใน jQuery ตอนนี้มันเริ่มจะ จับฉ่ายละ 555+ ก็ทำใจหน่อยนะครับ ผมเป็นคนที่ ตอนไหนสนใจอะไร ก็จะเขียนเรื่องนั้น แต่ยังไง ก็ไม่ทิ้ง jQuery แน่ๆ น่า ไม่ต้องห่วงๆ
พอดีตอนนี้กำลังเล่น Zend Framework และได้ทีโอกาสลอง Libraries หลายๆ ตัวของ มัน โดยเมื่อวานผมได้ลองเรื่อง Cache ไป ซึ่งก่อนหน้านั้น ผมเขียน lib ชุดนี้ขึ้นใช้เองครับ โดยทำงานกับ File, APC, Memcached ซึ่งก็ไม่ได้มีปัญหาอะไร แต่ทีนี้พอได้มาลอง Zend_Cached ดู ก็ถึงกลับโละของเก่าออกเลยครับ เปลี่ยนทันที เพราะว่า lib ตัวนี้ทำงานได้ค่อนข้างละเอียด และ ยัง cache ได้หลายแบบ ดังนี้
- File
- Sqlite
- Memcached
- Apc
- Xcache
- etc.
ที่ถูกใจผมเห็นจะเป็น Sqlite นี่ล่ะครับ เพราะคิดไว้ในหัวนานแล้ว ในเมื่อ โครงสร้างของ Sqlite มันออกจะคล้ายๆ แบ่งเป็นก้อนใครก้อนมัน ก็น่าจะเอามาทำ Cache ให้กับ Client ได้ แต่ว่า ไม่มีเวลาลงมือทำเองซะที แต่ตอนนี้ ไม่ต้องละ มีคนทำให้ละ 555+
แต่ที่ผมจะมา Review เบื้องต้นในวันนี้ น่าจะเป็น Cache ในรูปแบบ File ก่อน เพราะว่า มันไม่ต้องมี Server Required อะไรเป็น พิเศษ และ Zend ก็ยังมี Parameters ที่สนับสนุน เฉพาะการ cache แบบ File มาอีกจำนวนนึง เลยเอาเป็นว่า ลองส่วนนี้กันก่อนละกัน
โดยตัวอย่างที่ผมจะเอามาทดสอบ จะเป็นการ Cache ในลักษณะ Object นะครับ เพราะว่า ส่วนของ Output ผมใช้ Cache ใน Smarty เป็นหลักอยู่แล้ว มันสะดวกดี
และการ Cache Object ส่วนมากก็จะอยู่ในลักษณะ ของการ Cache SQL Query Result แทบทั้งนั้น ดังนั้นมาเริ่มกันเลยครับ…
ก่อนอื่นก็ไป Download Zend Framework Minimal กันมาก่อน ถ้าใครยัง ไม่รู้จะไป Download ตรงไหน กลับไปอ่านของเก่าๆ กัน ที่นี่ ก่อน
การเรียกใช้งาน
-
<?php
-
require(‘Zend/Cache.php’);
-
‘lifetime’ => 3600, // ระบุ Expiration date ในที่นี้คือ 1 ชั่วโมง
-
‘automatic_serialization’ => true // ทำการ serialize object หรือ array ที่จะนำไป cache ตั้งไว้แบบนี้แหละ
-
);
-
‘cache_dir’ => ‘./tmp/’ // Folder ปลายทาง
-
);
-
-
// เรียก Lib ผ่าน Factory (Zend Core)
-
/*
-
@File เรียกว่าจะใช้การ cache แบบไหน
-
*/
-
$cache = Zend_Cache::factory(‘Core’, ‘File’, $frontendOpts, $backendOpts);
-
?>
ส่วนข้างบนคือการเรียก Lib -> Cache ขึ้นมาใช้ครับ ทีนี้มาดูตัวอย่างการใช้งานกัน
การ Cache
-
<?php
-
$key = 123;
-
if (!$result = $cache->load($key))
-
{
-
echo "Missed Cache";
-
$sql = "SELECT…….";
-
$result = ::DB LOGIC::
-
$cache->save($result, $key);
-
}
-
?>
นี่เป็นตัวอย่างการใช้งานครับ โดยเริ่มต้นจะพยายามทำการ fecth cache ที่มี index key เท่ากับ $key มาก่อน ถ้าไม่สามารถ ดึงข้อมูลออกมาได้ ก็จะถือว่า เป็น การ missed cached ก็จะมาทำการดึง data จาก db โดยตรง จากนั้นก็จะทำการ save กลับเข้าไปใหม่
โดยที่ data จะมี เวลาหมดอายุเท่ากับ 1 ชั่วโมงตามที่เราตั้งไว้ด้านบน
แต่ถ้าในกรณีที่เราต้องการ ให่ข้อมูลอัพเดทเป็นแบบ Real Time เราก็จะต้องทำระบบจัดการ Cache เช่น เวลาข้อมูลมีการเปลี่ยนแปลงแก้ไข ก็ให้ทำการลบ cache เลยทันทีเราจะทำแบบนี้ครับ
การลบ cache
-
<?php
-
$cache->remove($key);
-
?>
นอกจากนี้การ Cache แบบไฟล์ Zend ยังเพิ่มตัวช่วยมาคือการสร้าง Tag ให้กับ Cache เพื่อให้เราสามารถกรุุ๊ป กลุ่มของ Cache ได้ แบบนี้
การใช้งานร่วมกับ Tag
-
<?php
-
?>
-
และยังมีคำสั่งช่วยลบที่ทำงานกับ Tag โดยตรง อันนี้ผมขี้เกียจเขียนไปดูตัวอย่างของเค้าเลยน่าจะเข้าใจง่ายกว่า
Example:: Clean Data
** Tags ใช้ได้กับการ Cache แบบ Flat File เท่านั้น **
นอกจากนี้ก็ยังมีการ Cache Output ด้วย ซึ่งการใช้งานก็ไม่ได้ต่างกันมากนัก
สำหรับ Zend_Cache ตัวนี้ ถ้าเราจะเปลี่ยนไปใช้งานกับ อย่างอื่นเช่น Memcached มันก็จะมี Options เพิ่มเติมมาให้ ลองไปดูที่นี่ ครับ
ข้อแนะนำของผมเอง
สำหรับ File Cache ด้านบนผมยังเห็นว่าถ้าจะใช้กับเวบขนาดใหญ่มัน น่าจะเกิดปัญหา ในเรื่องของ Node เต็มได้ ซึ่ง ผมจำได้ว่า UNIX มันเก็บได้ 5-6 หมื่น ไฟล์ ต่อ 1 Node ครับ ดังนั้น ควรจะใช้ Sub Folder ในการทำงาน ร่วมด้วย
และก็ถ้าจะเอาไปใช้กับ Framework ตัวอื่่นๆ ผมคิดว่า การ extends เข้าไปใช้งานน่าจะเหมาะสมกว่า ยกตัวอย่างเช่น
-
<?php
-
require_once(‘Zend/Cache.php’);
-
class Zcache extends Zend_Cache {
-
private $_obj;
-
public $cache_dir = ‘tmp’;
-
public $cache_ttl = 3600;
-
function __construct($dir=”, $ttl=”)
-
{
-
if ($dir) $this->cache_dir = $dir;
-
if ($ttl) $this->cache_ttl = $ttl;
-
}
-
-
// Implement ต่อกันเอา 555+
-
}
-
?>
ซึ่งการทำแบบนี้ เวลาเราจะแก้ไขอะไรมันจะได้สะดวกมากขึ้นครับ วันนี้ก็ขอจบแค่นี้ สวัสดี
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
ยอดเยี่ยมครับผม
เจ๋งมากเลย ก๊าบ พี่
ของ ฝากเนื่อฝากตัว ฝากใจ ไว้ในอ้อมแขน พี่ด้วยนะ กั๊บ
1 node ตรงนี้ หมายถึงอะไรครับ งง ( สอนเด็กน้อยด้วยครับ )