ปัญหาอย่างหนึ่งของการเขียนโปรแกรมระบบใหญ่คือเรื่องของขนาดของข้อมูล ซึ่งเมื่อเมื่อข้อมูลใน Database ปริมาณมากทำให้การ Query ข้อมูลนั้นใช้เวลานาน เนื่องจากตัว DBMS จะต้องเข้าไปอ่านข้อมูลจาก Harddisk ขึ้นมาทำให้เกิดปัญหาคอขวดเมื่อมีผู้ใช้งานปริมาณมาก

ปัญหานี้แก้ได้โดยวิธีการนำข้อมูลที่ใช้บ่อยๆ ไปเก็บเป็น cache ไว้ในแรมเมื่อต้องการข้อมูลนี้อีกให้เรานำข้อมูลในแรมออกมาใช้ในทันที โดยไม่ต้องไป โหลดข้อมูลจาก Harddisk ให้เสียเวลา เป็นตัวช่วยในการลดภาระของ Server ได้อย่างมาก เพิ่มประสิทธิภาพของโปรแกรมให้รองรับการใช้งานของผู้ใช้ปริมาณมากๆ ได้

ซึ่งตัวช่วยของเราในงานนี้มีชื่อว่า Memcache (เมมแคช) ตัว Memcache นี้จะให้เราเก็บข้อมูลที่ใช้บ่อยๆ ไว้ในแรม เมื่อเราต้องการข้อมูลให้เราเรียกจาก key ขึ้นมาได้เลยโดยไม่ต้องไป query จาก database เริ่มต้นการการตรวจสอบว่า Server ของเรานั้นรองรับการใช้งาน Memcache หรือไม่ดังนี้

connect(‘localhost’, 11211) or die (“Could not connect”);
// ติดต่อกับ server โดย localhost คือ url ของตัว server ที่เราจะทำ cache และ 11211 คือ port สำหรับติดต่อ memcache

echo “Version : “.$memcache->getVersion().”
\n”;
// getVersion เพิ่อดูว่า server ติดตั้งโปรแกรมเวอร์ชันอะไร
?>

ตัวอย่างการใช้งาน Memcache

connect(‘localhost’, 11211);

$key = md5($sql);
// เข้ารหัส query เป็น key ของ memcache เพื่อใช้เรียก memcache

$getResult = $memcache->get($key);
// ดึงข้อมูลออกมาจากแคชที่ได้เก็บไว้โดยใช้ key
// หากดึงข้อมูลแล้วไม่เจอเราจะไปโหลดขอ้มูลจาก database เพื่อมาเก็บในแคช
// แต่ถ้าหากดึงแล้วเจอข้อมูลเราจะใช้ข้อมูลในแคชโดยไม่ต้องดึงจาก database
if($getResult){
echo “Load data with memcache
\n”;

print_r($getResult);
// แสดงข้อมูลที่ได้จาก memcache

} else {
echo “Load data from database
\n”;
// ไม่มีขอ้มูลในแคช ให้โหลดจาก database ขึ้นมาเพื่อเก็บในแคช
$result = mysql_query($sql) or die(mysql_error());
$arr = array();
while($rs = mysql_fetch_array($result)){
array_push($arr, array(
‘id’ => $rs[‘id’],
‘title’ => $rs[‘title’],
‘detail’ => $rs[‘detail’],
‘time’ => $rs[‘time’]
));
}

$memcache->set($key, $arr, MEMCACHE_COMPRESSED, 120) ;
// นำข้อมูลที่ได้เก็บในแคช
// $key คือ คีย์ที่ใช้เรียก memcache
// $arr คือ ข้อมูลที่ต้องการเก็บในแคช
// MEMCACHE_COMPRESSED คือการสั่งให้เก็บโดยการบีบอัดข้อมูล
// 120 คือเวลาที่จะเก็บแคชนี้ไว้ในแรม 120 วินาที

print_r($arr);
}
?>

เท่านี้ก็สามารถเก็บข้อมูลในแคชได้แล้ว โดยสามารถนำไปประยุกต์ใช้ได้โดยต้องคิดว่า query ไหนที่มีการใช้งานบ่อยๆ ก็ควรเก็บเป็น memcache ไว้เพิ่อลดภาระของการโหลดข้อมูล หาก query ไหนที่ใช้ไม่บ่อยไม่ควรใช้ memcache เพราะจะทำให้สิ้นเปลืองเนื้อที่ในแรมโดยไม่มีประโยชน์

ข้อมูลจาก : http://www.php.net/manual/en/book.memcache.php