跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

การใช้ Cache เพื่อเพิ่มประสิทธิภาพ

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการใช้งาน Event Dispatcher ในบทนี้ เราได้สำรวจการใช้ Cache ซึ่งเป็นการเก็บข้อมูลที่ใช้บ่อยไว้ในที่ที่เข้าถึงได้รวดเร็ว เพื่อล...

การใช้ Cache เพื่อเพิ่มประสิทธิภาพ

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการใช้งาน Event Dispatcher เพื่อสร้างระบบที่ยืดหยุ่นและ decoupled ในบทนี้ เราจะมาพูดถึงอีกหนึ่งเทคนิคสำคัญในการเพิ่มประสิทธิภาพของแอปพลิเคชัน PHP ของเรา นั่นคือ การใช้ Cache

Cache คืออะไร? Cache คือการเก็บข้อมูลที่ถูกเรียกใช้งานบ่อยๆ ไว้ในที่ที่เข้าถึงได้รวดเร็วกว่าแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล) เพื่อลดเวลาในการตอบสนองของแอปพลิเคชันและลดภาระของแหล่งข้อมูลหลัก

เหตุผลหลักที่เราใช้ Cache คือ:

  • ลดเวลาในการตอบสนอง: การดึงข้อมูลจาก Cache เร็วกว่าการดึงข้อมูลจากฐานข้อมูลหรือแหล่งข้อมูลอื่นๆ มาก
  • ลดภาระของแหล่งข้อมูลหลัก: เมื่อข้อมูลถูกดึงจาก Cache บ่อยๆ จะทำให้แหล่งข้อมูลหลักไม่ต้องทำงานหนัก ทำให้สามารถรองรับจำนวนผู้ใช้งานที่มากขึ้นได้
  • ปรับปรุงประสบการณ์ผู้ใช้: เว็บไซต์ที่ตอบสนองรวดเร็วจะสร้างประสบการณ์ที่ดีให้กับผู้ใช้งาน

ประเภทของ Cache

มี Cache หลายประเภทให้เลือกใช้ แต่ในบทนี้ เราจะเน้นไปที่ 3 ประเภทหลักๆ ที่นิยมใช้กับ PHP:

  • Memcached
  • Redis
  • File-Based Cache

Memcached

Memcached เป็นระบบ Cache แบบ in-memory ที่มีประสิทธิภาพสูง ออกแบบมาเพื่อเร่งความเร็วของเว็บแอปพลิเคชันที่ขับเคลื่อนด้วยฐานข้อมูลขนาดใหญ่ โดยการ Cache ข้อมูลและ objects ใน RAM เพื่อลดจำนวนครั้งที่ต้องอ่านข้อมูลจากแหล่งข้อมูลหลัก

ข้อดี:

  • ความเร็วสูง: เนื่องจากข้อมูลถูกเก็บไว้ใน RAM
  • ง่ายต่อการใช้งาน: มี API ที่เรียบง่าย
  • รองรับการกระจาย: สามารถกระจาย Cache ไปยังหลายเซิร์ฟเวอร์ได้

ข้อเสีย:

  • ข้อมูลหายเมื่อเซิร์ฟเวอร์รีสตาร์ท: เนื่องจากเป็น in-memory Cache
  • ขนาด Cache ถูกจำกัดด้วย RAM

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

<?php

// เชื่อมต่อกับ Memcached server
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);

// กำหนด key และ value ที่จะเก็บใน Cache
$key = 'user_data_123';
$data = ['id' => 123, 'name' => 'John Doe', 'email' => 'john.doe@example.com'];

// พยายามดึงข้อมูลจาก Cache ก่อน
$cached_data = $memcached->get($key);

if ($cached_data) {
  // ถ้ามีข้อมูลใน Cache ให้ใช้ข้อมูลจาก Cache
  echo "ข้อมูลจาก Cache:\n";
  print_r($cached_data);
} else {
  // ถ้าไม่มีข้อมูลใน Cache ให้ดึงข้อมูลจากแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล)
  echo "ข้อมูลจากฐานข้อมูล:\n";
  // จำลองการดึงข้อมูลจากฐานข้อมูล
  $data_from_db = $data;
  print_r($data_from_db);

  // เก็บข้อมูลลงใน Cache เพื่อใช้งานในครั้งต่อไป
  $memcached->set($key, $data_from_db, 3600); // เก็บข้อมูลไว้ 1 ชั่วโมง
}

?>

Redis

Redis เป็น in-memory data structure store ที่สามารถใช้เป็นฐานข้อมูล, Cache และ message broker ได้ รองรับ data structure ที่หลากหลาย เช่น strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes และ streams

ข้อดี:

  • ความเร็วสูง: เนื่องจากข้อมูลถูกเก็บไว้ใน RAM
  • รองรับ data structure ที่หลากหลาย: ทำให้สามารถใช้งานได้หลากหลายรูปแบบ
  • มีระบบ persistence: สามารถบันทึกข้อมูลลงดิสก์เพื่อป้องกันข้อมูลสูญหาย
  • รองรับการกระจาย: สามารถกระจาย Cache ไปยังหลายเซิร์ฟเวอร์ได้

ข้อเสีย:

  • ซับซ้อนกว่า Memcached: ต้องเรียนรู้ data structure และคำสั่งต่างๆ
  • ขนาด Cache ถูกจำกัดด้วย RAM (แต่สามารถใช้ Redis Cluster เพื่อเพิ่มขนาดได้)

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

<?php

require 'vendor/autoload.php'; // โหลด Composer autoloader

// เชื่อมต่อกับ Redis server
use Predis\Client;

$redis = new Client([
    'scheme' => 'tcp',
    'host'   => '127.0.0.1',
    'port'   => 6379,
]);

// กำหนด key และ value ที่จะเก็บใน Cache
$key = 'product_data_456';
$data = ['id' => 456, 'name' => 'Awesome Product', 'price' => 99.99];

// พยายามดึงข้อมูลจาก Cache ก่อน
$cached_data = $redis->get($key);

if ($cached_data) {
  // ถ้ามีข้อมูลใน Cache ให้ใช้ข้อมูลจาก Cache
  echo "ข้อมูลจาก Cache:\n";
  print_r(json_decode($cached_data, true)); // แปลง JSON กลับเป็น Array
} else {
  // ถ้าไม่มีข้อมูลใน Cache ให้ดึงข้อมูลจากแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล)
  echo "ข้อมูลจากฐานข้อมูล:\n";
  // จำลองการดึงข้อมูลจากฐานข้อมูล
  $data_from_db = $data;
  print_r($data_from_db);

  // เก็บข้อมูลลงใน Cache เพื่อใช้งานในครั้งต่อไป
  $redis->set($key, json_encode($data_from_db)); // แปลง Array เป็น JSON ก่อนเก็บ
  $redis->expire($key, 3600); // กำหนดอายุของ Cache เป็น 1 ชั่วโมง
}

?>

หมายเหตุ: ตัวอย่างนี้ใช้ Predis ซึ่งเป็น client library สำหรับ Redis ที่สามารถติดตั้งได้ผ่าน Composer: `composer require predis/predis`

File-Based Cache

File-Based Cache เป็นวิธีที่ง่ายที่สุดในการ implement Cache โดยการบันทึกข้อมูลลงในไฟล์บนดิสก์

ข้อดี:

  • ง่ายต่อการ implement: ไม่ต้องติดตั้งซอฟต์แวร์เพิ่มเติม
  • ใช้งานได้ในทุกสภาพแวดล้อม: ไม่ต้องพึ่งพา external dependencies

ข้อเสีย:

  • ช้ากว่า Memcached และ Redis: เนื่องจากข้อมูลถูกอ่านและเขียนจากดิสก์
  • ไม่เหมาะสำหรับข้อมูลขนาดใหญ่: การอ่านและเขียนไฟล์ขนาดใหญ่อาจทำให้ประสิทธิภาพลดลง
  • ไม่มีระบบหมดอายุอัตโนมัติ: ต้องจัดการเอง

ตัวอย่างการใช้งาน File-Based Cache:

<?php

$cache_dir = 'cache/';
$key = 'article_data_789';
$cache_file = $cache_dir . md5($key) . '.cache';
$cache_lifetime = 3600; // 1 ชั่วโมง

// ตรวจสอบว่ามีไฟล์ Cache หรือไม่ และไฟล์ยังไม่หมดอายุ
if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_lifetime)) {
  // ถ้ามีไฟล์ Cache และไฟล์ยังไม่หมดอายุ ให้ดึงข้อมูลจากไฟล์ Cache
  echo "ข้อมูลจาก Cache:\n";
  $cached_data = unserialize(file_get_contents($cache_file)); // อ่านข้อมูลจากไฟล์และ unserialize
  print_r($cached_data);
} else {
  // ถ้าไม่มีไฟล์ Cache หรือไฟล์หมดอายุ ให้ดึงข้อมูลจากแหล่งข้อมูลหลัก (เช่น ฐานข้อมูล)
  echo "ข้อมูลจากฐานข้อมูล:\n";
  // จำลองการดึงข้อมูลจากฐานข้อมูล
  $data = ['id' => 789, 'title' => 'Caching in PHP', 'content' => 'This is an example of file-based caching.'];
  print_r($data);

  // สร้าง directory Cache ถ้ายังไม่มี
  if (!is_dir($cache_dir)) {
    mkdir($cache_dir, 0777, true);
  }

  // เก็บข้อมูลลงในไฟล์ Cache เพื่อใช้งานในครั้งต่อไป
  file_put_contents($cache_file, serialize($data)); // Serialize ข้อมูลและเขียนลงไฟล์
}

?>

Trade-offs และแนวปฏิบัติที่ดี

การเลือกใช้ Cache ประเภทใดนั้น ขึ้นอยู่กับความต้องการและข้อจำกัดของโปรเจกต์ของคุณ ไม่มี Cache ประเภทใดที่ดีที่สุดเสมอไป สิ่งสำคัญคือต้องเข้าใจ trade-offs ของแต่ละประเภทและเลือกสิ่งที่เหมาะสมที่สุด

แนวปฏิบัติที่ดีในการใช้ Cache:

  • กำหนด Cache Lifetime ที่เหมาะสม: Cache Lifetime ที่สั้นเกินไปจะทำให้ไม่ได้ประโยชน์จากการ Cache เท่าที่ควร แต่ Cache Lifetime ที่ยาวเกินไปอาจทำให้ข้อมูลเก่า
  • Invalidate Cache เมื่อข้อมูลมีการเปลี่ยนแปลง: เมื่อข้อมูลในแหล่งข้อมูลหลักมีการเปลี่ยนแปลง ต้อง invalidate Cache เพื่อให้ผู้ใช้เห็นข้อมูลล่าสุด
  • Monitor Cache Performance: ตรวจสอบประสิทธิภาพของ Cache อย่างสม่ำเสมอ เพื่อให้แน่ใจว่า Cache ทำงานได้อย่างถูกต้องและมีประสิทธิภาพ
  • ใช้ Cache Layer ที่ abstraction สูง: ใช้ libraries หรือ frameworks ที่มี Cache abstraction layer เพื่อให้ง่ายต่อการเปลี่ยน Cache engine ในอนาคต

การใช้ Cache เป็นเทคนิคที่มีประสิทธิภาพในการเพิ่มประสิทธิภาพของแอปพลิเคชัน PHP แต่ต้องใช้อย่างระมัดระวังและเข้าใจ trade-offs ที่เกี่ยวข้อง ในบทต่อไป เราจะพูดถึงการใช้ Queue เพื่อจัดการ Task แบบ Asynchronous

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务