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;

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

502 Bad Gateway

เรื่องราวมันเริ่มมาจาก Drupal ครับ
มีงานที่ต้องพัฒนาระบบ ซื้อ-ขาย บน Drupal มี shopping cart บลาๆๆ

จวบจนมันใกล้เสร็จละ tester ได้รายงานว่า
‘ถ้าคลิกซื้อไปเรื่อยๆ จนถึงจุดหนึ่ง มันจะ 502 Bad Gateway’

เราก็เลยมาหาสาเหตุกัน
เริ่มจาก Nginx ก่อนเลยครับ ผมไปดู log
/var/log/nginx/shop.xxx.com.error.log

อ่า~ เจอตัวการแล้ว คิดว่านะแก้ได้ ด้วยการเพิ่ม size ของอะไรสักอย่าง
ก็เลยใส่ parameter ลงไปใน Nginx

proxy_buffer_size   128k;
proxy_buffers   4 256k;
proxy_busy_buffers_size   256k;

หลังจาก restart Nginx เสร็จแล้วก็ลองทดสอบอีกครั้ง ก็ยังขึ้น 502 Bad Gateway เหมือนเดิม
ก็เลยมีความสงสัยว่า header size มันคืออะไร …

http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

ยาวเลยครับ… ซึ่งไม่ใช่ทางแก้ครับ ;_;
ก็เลยมานั่งคิดว่า ‘ทำไมกดซื้อสินค้าไปเรื่อยๆแล้วขึ้น 502’

cookie แหงๆ

เปิด Inspect Element ใน Google Chrome แล้วนั่งดูตัวเลข cookie กันเลยครับ

chrome inspect resources

chrome inspect resources

ก็เจอตัวการครับนั่นคือ พอเรากดซื้อสินค้าไปเรื่อยๆ cookie ก็จะโตขึ้นเรื่อยๆ จนเกือบๆ 4000 พอกดซื้ออีกครั้ง ก็บู้มมมมม กลายเป็นโกโก้ครั้น

จึงได้ความรู้มาอีกอย่างว่า

Internet Explorer 8 allowed cookies up to 4095 bytes
Chrome 9 allowed cookies up to 4096 bytes
Opera 11 allowed cookies up to 4096 bytes
Safari 5 allowed coookies up to 4097 bytes
Firefox 3.6.3 allowed cookies up to 4097 bytes

http://stackoverflow.com/questions/2543851/chrome-cookie-size-limit

Yii SMTP

yii framework มี extension การส่งเมลอยู่ที่

protected/extensions/yii-mail

โดยเราจะต้องเขียนเพิ่มที่


protected/config/main.php

    'mail' => array(
      'class' => 'ext.yii-mail.YiiMail',
      'transportType' => 'smtp',
      'transportOptions'=>array(
                'host'=>'smtp.live.com',
                'username'=>'username',
                'password'=>'password',
                'port'=>'587',
                'encryption'=>'tls',
                ),
      'viewPath' => 'application.views.mail',
      'logging' => true,
      'dryRun' => false
    ),

แต่…
แต่ทว่า…

เราจะส่งเมลไม่ไปครับ

Error 500
fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

เพราะว่า Swiftmailer ของ yii มันเก่ามากครับ

http://code.google.com/p/yii-mail/issues/detail?id=15

เราจึงต้อง Upgrade มันโดยการ download

http://swiftmailer.org/download

เอาไปทับของเก่าได้เลยครับ