การใช้ Memcached เพื่อแคชข้อมูล PHP ใน ServBay
ServBay เป็นเครื่องมือพัฒนาเว็บแบบโลคอลที่ทรงพลัง มาพร้อมกับซอฟต์แวร์ Memcached Server ที่มีประสิทธิภาพสูง พร้อม PHP Extension ที่จำเป็น เพื่อช่วยให้นักพัฒนาสามารถนำ Memcached มาใช้งานในการแคชข้อมูลภายในแอปพลิเคชัน PHP ได้อย่างสะดวกและรวดเร็ว ส่งผลให้ประสิทธิภาพของแอปพลิเคชันดีขึ้นอย่างชัดเจน
บทความนี้จะอธิบายอย่างละเอียดเกี่ยวกับวิธีตรวจสอบและใช้งาน Memcached พร้อมกับ PHP Extension ที่เกี่ยวข้องใน ServBay
แนะนำ Memcached
Memcached คือระบบแคชอ็อบเจกต์ในหน่วยความจำ (Memory Object Cache) ที่มีประสิทธิภาพสูงและรองรับแบบกระจาย (Distributed) โดยการจัดเก็บข้อมูลต่าง ๆ เช่น ผลลัพธ์การ Query ฐานข้อมูล, การตอบกลับ API หรือชิ้นส่วนของหน้าเว็บ ไว้ชั่วคราวในหน่วยความจำ เพื่อลดจำนวนครั้งในการเข้าถึงฐานข้อมูล ช่วยให้เว็บแอปพลิเคชันแบบไดนามิกตอบสนองและรับโหลดได้สูงขึ้น
คุณสมบัติเด่น
- ประสิทธิภาพสูง: ข้อมูลถูกจัดเก็บใน RAM ทำให้การอ่าน/เขียนทำได้รวดเร็วเป็นอย่างยิ่ง
- รองรับการกระจาย: สามารถสร้างคลัสเตอร์แคชข้ามเซิร์ฟเวอร์ได้อย่างง่ายดาย และขยายระบบตามการเติบโตได้สะดวก
- ใช้งานง่าย: โปรโตคอลเข้าใจง่าย มีไลบรารีไคลเอนต์สำหรับหลากหลายภาษาและแพลตฟอร์ม จึงสามารถผสานการทำงานเข้ากับโค้ดได้รวดเร็ว
- ลดภาระฐานข้อมูล: ลดจำนวนการ Query ฐานข้อมูลได้อย่างมีประสิทธิภาพโดยเฉพาะในกรณีที่มีทราฟฟิกสูง
ความแตกต่างระหว่าง PHP Extension memcache
และ memcached
ใน PHP มี Extension สำคัญ 2 ตัวที่นิยมใช้เชื่อมต่อกับ Memcached Server ได้แก่ memcache
และ memcached
แม้ชื่อจะใกล้เคียงกันแต่ฟังก์ชันและ API มีความต่างกันดังนี้
memcache
Extension:- เป็น Extension ยุคแรก ๆ สำหรับ PHP
- ใช้แนวทางแบบ Procedural API เป็นหลัก (
memcache_connect()
,memcache_set()
, ฯลฯ) - ฟีเจอร์พื้นฐาน ไม่รองรับฟีเจอร์ขั้นสูงบางอย่าง เช่น Consistent Hashing (แต่บางไคลเอนต์อาจมี)
memcached
Extension:- เป็น PHP Extension ที่ใหม่กว่า (พัฒนาบนไลบรารี libmemcached)
- ใช้ Object-Oriented API (
Memcached
class) - รองรับความสามารถขั้นสูงมากมาย เช่น Consistent Hashing, Binary Protocol, SASL Authentication, Serialization ที่ยืดหยุ่น
- โดยทั่วไปแนะนำให้ใช้
memcached
เนื่องจากทันสมัย ฟีเจอร์มากกว่า และยังมีการดูแลต่อเนื่อง
ServBay ติดตั้งและเปิดใช้งาน memcached
PHP Extension ที่ทำงานได้เต็มความสามารถให้เป็นค่าเริ่มต้น
Memcached Server และ PHP Extension ใน ServBay
ServBay รวม Memcached Server ไว้ในรูปแบบที่สามารถจัดการได้สะดวก และติดตั้ง Extension memcached
ให้กับ PHP ทุกเวอร์ชันที่รวมมากับ ServBay โดยเปิดใช้งานเป็นค่าเริ่มต้น
นั่นหมายความว่าโดยปกติ เมื่อคุณติดตั้ง ServBay แล้ว ทั้ง Memcached Server และ Extension สำหรับ PHP จะพร้อมใช้งานทันที โดยไม่ต้องคอมไพล์หรือตั้งค่าเพิ่มเติม
ตรวจสอบสถานะแพ็คเกจ Memcached:
สามารถดูสถานะของ Memcached
ได้ที่หน้าหลักหรือหน้าจัดการแพ็คเกจของ ServBay โดยควรแสดงว่า “กำลังทำงาน” หากยังไม่ทำงาน สามารถกดเริ่มต้นได้
ตรวจสอบว่ามีการโหลด memcached
PHP Extension แล้วหรือไม่:
วิธีตรวจสอบเวอร์ชัน PHP ว่าได้โหลด Extension memcached
สำเร็จหรือไม่ที่ง่ายที่สุดคือใช้ฟังก์ชัน phpinfo()
:
สร้างไฟล์ PHP ใหม่ เช่น
info.php
ในโฟลเดอร์รากของเว็บไซต์ ServBay (โดยปกติคือ/Applications/ServBay/www
)ใส่โค้ดต่อไปนี้ในไฟล์:
php<?php phpinfo(); ?>
1
2
3เข้าถึงไฟล์นี้ผ่านโดเมนเว็บไซต์โลคอลของ ServBay (เช่น ถ้าโดเมนคุณคือ
servbay.demo
ให้เปิดhttp://servbay.demo/info.php
ด้วยห้องเว็บ)ในหน้า
phpinfo
ที่แสดงผล ให้ค้นหาคำว่า "memcached" หากพบหมวดหมู่ "memcached" พร้อมรายละเอียดการตั้งค่าและเวอร์ชัน แสดงว่า Extension ถูกโหลดสำเร็จและพร้อมใช้งาน
การใช้งาน Memcached ในโค้ด PHP
เมื่อแน่ใจว่า Memcached Server กำลังทำงาน และ Extension memcached
ถูกรวมใน PHP แล้ว คุณสามารถนำ class Memcached
มาใช้เชื่อมต่อกับเซิร์ฟเวอร์และจัดการแคชได้ทันที
Memcached Server ใน ServBay จะรันอยู่บน localhost
และใช้พอร์ตมาตรฐาน 11211
โดยอัตโนมัติ
ตัวอย่างโค้ด
ต่อไปนี้คือตัวอย่างโค้ด PHP ง่าย ๆ สำหรับเชื่อมต่อ Memcached Server ในเครื่อง และทดลองเก็บ/ดึงข้อมูล:
ให้นำโค้ดนี้ไปวางในไฟล์ PHP ในโฟลเดอร์เว็บไซต์ ServBay (เช่น /Applications/ServBay/www/memcached_test.php
):
php
<?php
// ข้อมูลเซิร์ฟเวอร์ Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// สร้างอินสแตนซ์ของลูกค้า Memcached
$memcached = new Memcached();
// เพิ่มเซิร์ฟเวอร์ Memcached เข้าไปในกลุ่มการเชื่อมต่อ
// ฟังก์ชัน addServer() คืนค่าเป็น boolean เพื่อระบุว่าสำเร็จหรือไม่ ยังไม่ได้หมายความว่าเชื่อมต่อสำเร็จ
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// หมายเหตุ: ถ้า addServer ล้มเหลว มักเป็นปัญหาการตั้งค่า ไม่เกี่ยวกับการเชื่อมต่อเซิร์ฟเวอร์
die("ไม่สามารถเพิ่มเซิร์ฟเวอร์ Memcached เข้ารายการเชื่อมต่อได้ กรุณาตรวจสอบ host และ port");
}
// ทดลองดึง key ที่ไม่มีอยู่ เพื่อทดสอบการเชื่อมต่อ (ไม่จำเป็น แต่แนะนำ)
// get() คืนค่า false หรือ array ว่าง เมื่อ key ไม่มีหรือเกิดปัญหาเชื่อมต่อ
// สามารถใช้ Memcached::getResultCode() เพื่อตรวจสอบรหัสสถานะได้
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // ดึง key ที่ไม่มีอยู่จริง
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// ถ้าไม่ใช่ RES_NOTFOUND หรือ RES_SUCCESS อาจแปลว่าขัดข้องกับการเชื่อมต่อ
// หมายเหตุ: RES_SUCCESS จะคืนมาเมื่อตรวจสอบ key ที่ว่างเปล่าเช่นกัน
// ถ้าต้องการตรวจสอบละเอียดควรมี logic เพิ่มเติมหรืออิงกับลักษณะของไคลเอนต์แต่ละตัว
// โดยทั่วไปหาก addServer สำเร็จและไม่มี error จากการดำเนินการ ต่อไปถือว่าเชื่อมต่อได้
echo "หมายเหตุ: การเชื่อมต่อกับเซิร์ฟเวอร์ Memcached อาจมีปัญหา Result Code: " . $result_code . "<br>";
// ในงานจริงอาจต้องจัดการ error ให้ละเอียดขึ้น
} else {
echo "เชื่อมต่อ Memcached เซิร์ฟเวอร์สำเร็จที่ ({$memcached_host}:{$memcached_port})<br>";
}
// --- ตัวอย่างการใช้งานแคช ---
// ข้อมูลที่จะถูกเก็บแคช
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // อายุข้อมูลแคช หน่วยเป็นวินาที (ตัวอย่างนี้: 1 ชั่วโมง)
// ตั้งค่าแคชข้อมูล
// set() คืนค่า boolean เพื่อระบุว่าสำเร็จหรือไม่
if ($memcached->set($key, $data, $expiration)) {
echo "แคชข้อมูลใน Memcached สำเร็จ key คือ '{$key}' อายุข้อมูล {$expiration} วินาที<br>";
} else {
echo "ไม่สามารถแคชข้อมูลได้!<br>";
// ตรวจสอบรหัสผิดพลาดได้ผ่าน $memcached->getResultCode()
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// ทดลองดึงข้อมูลจากแคช
echo "กำลังดึงข้อมูลจากแคช...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() คืนค่า false เมื่อไม่พบหรือผิดพลาด
echo "ได้รับข้อมูลจากแคชสำเร็จ:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "ไม่พบข้อมูลในแคช หรือเกิดข้อผิดพลาดกับ key '{$key}'<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// กรณีตัวอย่างเมื่อลบข้อมูลออกจากแคช (สมมุติว่าเวลาผ่านไปจนหมดอายุ)
// ในแอปปกติ คุณควรตรวจ $cachedData ถ้าเป็น false ให้โหลดใหม่จากแหล่งข้อมูลเดิม (เช่น Database) แล้วค่อยบันทึกลงแคช
// ตัวอย่างการลบ key ออกจากแคช
/*
echo "กำลังลบข้อมูลออกจากแคช...<br>";
if ($memcached->delete($key)) {
echo "ลบข้อมูลสำเร็จ key '{$key}' ออกจากแคช<br>";
} else {
echo "ลบข้อมูลจากแคชไม่สำเร็จ!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// ทดลองดึง key ที่เพิ่งลบออก
echo "กำลังตรวจสอบข้อมูลที่ถูกลบ...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "ยังดึงข้อมูลจากแคชได้ (ลบไม่สำเร็จ):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "ข้อมูลไม่พบในแคชแล้ว (ผลลัพธ์ตามคาด)<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// ตัวอย่างการลบข้อมูลแคชทั้งหมด (ใช้งานอย่างระวัง)
/*
echo "กำลังลบข้อมูลแคชทั้งหมด...<br>";
if ($memcached->flush()) {
echo "ลบข้อมูลแคชทั้งหมดสำเร็จ<br>";
} else {
echo "ลบแคชทั้งหมดไม่สำเร็จ!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
เมื่อเปิดไฟล์ memcached_test.php
ผ่านเว็บไซต์โลคอลที่ตั้งค่าไว้กับ ServBay คุณจะเห็นผลสรุป สถานะการเชื่อมต่อ การตั้งค่าข้อมูลและการดึงข้อมูลจากแคช
ข้อควรระวัง
- ตรวจสอบว่าแพ็คเกจ Memcached ใน ServBay กำลังทำงานอยู่
- โดยปกติ Memcached จะฟัง port
11211
ที่127.0.0.1
(หรือlocalhost
) ไม่จำเป็นต้องเปลี่ยนแปลงค่าเริ่มต้น - ถ้าเชื่อมต่อผ่าน PHP ไม่สำเร็จ ให้ตรวจสอบสถานะเซิร์ฟเวอร์ Memcached และ firewall ในระบบที่อาจบล็อกการเชื่อมต่อภายในเครื่อง
- วิธี addServer ของ class
Memcached
คือแค่เพิ่ม host ไปยัง pool ของเซิร์ฟเวอร์ ยังไม่ใช่การเชื่อมต่อแบบจริงจัง การเชื่อมต่อเกิดขึ้นตอนเรียกใช้งานเช่น get, set จริงจังเท่านั้น สามารถตรวจสอบความสำเร็จได้จากค่าที่ตีกลับหรือการใช้ getResultCode()
สรุป
ServBay เป็นทางเลือกที่สะดวกและมีประสิทธิภาพสำหรับนักพัฒนาที่ต้องการใช้งาน Memcached ในงาน PHP เครื่องมือรวม Memcached Server กับ PHP Extension memcached
เอาไว้พร้อมใช้งานโดยไม่ต้องติดตั้งหรือปรับแต่งเพิ่มเติม ช่วยให้คุณเริ่มทดสอบและแคชข้อมูลในหน่วยความจำเพื่อยกระดับแอปพลิเคชัน PHP ได้อย่างรวดเร็วสำหรับทุกงานพัฒนาโลคอล