yii with memcached

yii มีระบบ cache อยู่หลายส่วนพอสมควรครับ ซึ่งเราจะกล่าวกันในครั้งต่อไป

รอบนี้เราจะมาพูดถึงเรื่อง memcached ละกัน
คงไม่ต้องเกรื่นใช่ไหมครับ ว่า memcached คืออะไร ???

ลองดูตาม blog ของคุณ @FordAntiTrust ได้ครับ เขียนอ่านง่าย เข้าใจไว 😀

http://www.thaicyberpoint.com/ford/blog/id/909/

ตอนแรกสุดผมใช้ Alternative PHP Cache หรือชื่อเล่นว่า APC ครับ เนื่องจาก config ง่าย และทาง yii ก็แนะนำไว้ ตามหน้า นี้

http://www.yiiframework.com/performance/

มันก็ทำงานได้ดีครับ ตามที่มันควรจะเป็น

'components'=>array(
  'cache'=>array(
    'class'=>'CApcCache',
  ),
),

แต่เนื่องจากความต้องการของมนุษย์มีไม่สิ้นสุดครับ…
ผมถึงต้องเปลี่ยนเป็น memcached

เพราะ APC ไม่ได้ถูกออกแบบมาสำหรับรองรับ server หลายๆตัวครับ
เพราะ memcached ออกแบบมาให้เป็น centralized cache ครับ

memcached

มาเริ่มกันเลยครับ
เริ่มจากติดตั้งก่อนเลยครับ ซึ่งถ้าลอง search memcached ดูจะเจอความงงงวยครั้งแรกครับ ..

p memcached - A high-performance memory object caching system
p memcachedb - Persistent storage engine using the memcache protocol
p php5-memcached - memcached module for php5

memcache กับ memcached
ใช้อันไหน !?!?!?!?!?!?!!

ใน linux นะครับ ถ้าเห็นอะไรแบบนี้ให้เดาไว้ก่อนเลยครับว่า d ที่ต่อท้ายมา คือ daemon
ดังนั้นเราต้องติดตั้ง memcachedb กับ php5-memcached ครับ

หลังจากที่ติดตั้งเสร็จแล้ว ก็มาลองใช้กันครับ..
โดยการเปิด config ของ memcached มาดูเล่นก่อนครับ

/etc/memcachedb.conf

บรรทัดที่น่าสนใจคือ

# Default connection port is 11211
-p 21201

ครับ… มันเปลี่ยน port เฉยเลย ถ้าไม่เข้ามาดูก่อน จะรู้ไหมเนี่ย!!!
เนื่องจากถ้าเข้าไปดูวิธีการ config ตัว memcached ให้เข้ากับ yii ตามหน้านี้

http://www.yiiframework.com/doc/api/1.1/CMemCache

จะบอกว่า

'port'=>11211,

ซึ่งมันไม่ถูกครับ ต้องใช้เป็น 21201

        'cache' => array(
                'class'=>'CMemCache',
                'servers'=>array(
                        array(
                        'host'=>'127.0.0.1',
                        'port'=>21201,
                        'weight'=>100,
                        ),
                ),
        ),

ก็จะใช้งานได้ละครับ…. ซะที่ไหนหละ ถ้าทำแค่นี้ จะเจอ erorr 500 แน่นอนครับ
เพราะ ผมโดนมาแล้ว

เราต้องไปแก้อีกที่ครับ

framework/caching/CMemCache.php

เปลี่ยนจาก

public $useMemcached=false;

เป็น

public $useMemcached=true;

คราวนี้ใช้งานได้จริงๆละครับ 😉