Sử dụng Memcached cho bộ nhớ đệm dữ liệu PHP trong ServBay
ServBay là một môi trường phát triển Web cục bộ mạnh mẽ, được tích hợp sẵn phần mềm Memcached (máy chủ Memcached) hiệu suất cao cùng với tiện ích mở rộng PHP tương ứng. Nhờ đó, lập trình viên có thể dễ dàng triển khai cơ chế bộ nhớ đệm dữ liệu hiệu quả cho các ứng dụng PHP, qua đó nâng cao đáng kể hiệu suất hoạt động.
Bài viết này sẽ hướng dẫn chi tiết cách kiểm tra và sử dụng Memcached cũng như tiện ích mở rộng PHP liên quan trong ServBay.
Giới thiệu về Memcached
Memcached là một hệ thống lưu trữ bộ nhớ đệm đối tượng trong RAM, phân tán và hiệu suất cao. Thông qua việc lưu tạm dữ liệu (như kết quả truy vấn database, phản hồi API, các phần trang web...) trong bộ nhớ, Memcached giúp giảm số lần truy xuất vào hệ thống lưu trữ hậu trường (ví dụ: cơ sở dữ liệu), từ đó tăng tốc độ phản hồi và khả năng xử lý của các ứng dụng web động.
Đặc điểm nổi bật
- Hiệu suất cao: Lưu trữ dữ liệu trong bộ nhớ RAM giúp tốc độ đọc/ghi cực nhanh.
- Phân tán: Hỗ trợ xây dựng cụm bộ nhớ đệm trên nhiều máy chủ, dễ dàng mở rộng quy mô.
- Dễ tích hợp, sử dụng: Giao thức đơn giản, có nhiều thư viện khách hàng, dễ triển khai.
- Giảm tải cho cơ sở dữ liệu: Giảm đáng kể số truy vấn tới database, đặc biệt hữu ích trong các tình huống truy cập đồng thời cao.
Sự khác biệt giữa các tiện ích mở rộng memcache
và memcached
của PHP
Trong PHP, có hai tiện ích mở rộng phổ biến dùng để kết nối với máy chủ Memcached: memcache
và memcached
. Mặc dù tên gọi gần giống nhau, nhưng đây là hai tiện ích riêng biệt với API và tính năng khác nhau:
Tiện ích mở rộng
memcache
:- Xuất hiện sớm hơn, lâu đời.
- Cung cấp API hướng thủ tục (ví dụ:
memcache_connect()
,memcache_set()
, ...). - Tính năng cơ bản, không hỗ trợ một số chức năng nâng cao như consistent hashing (một số client có thể tự xử lý).
Tiện ích mở rộng
memcached
:- Phiên bản mới hơn, xây dựng dựa trên thư viện libmemcached.
- Cung cấp API hướng đối tượng (lớp
Memcached
). - Hỗ trợ nhiều tính năng nâng cao như consistent hashing, giao thức nhị phân, xác thực SASL, nhiều lựa chọn tuần tự hóa dữ liệu linh hoạt,...
- Hiện tại khuyến nghị sử dụng
memcached
vì nhiều tính năng hơn và thường xuyên được cập nhật, bảo trì.
ServBay mặc định cung cấp và khuyến khích sử dụng tiện ích mở rộng PHP memcached
với nhiều tính năng ưu việt.
Gói phần mềm Memcached và tiện ích mở rộng PHP trong ServBay
ServBay không chỉ tích hợp sẵn máy chủ Memcached dưới dạng một gói phần mềm dễ quản lý, mà còn cài đặt trước và tự động kích hoạt tiện ích mở rộng PHP memcached
đối với tất cả các phiên bản PHP đi kèm.
Điều này có nghĩa là, hầu hết trường hợp bạn chỉ cần cài đặt ServBay là đã có thể sử dụng máy chủ Memcached và extension PHP tương ứng, không cần biên dịch hay cấu hình bổ sung nào.
Kiểm tra trạng thái gói Memcached:
Bạn có thể tìm thấy gói phần mềm Memcached
trong giao diện chính hoặc phần quản lý gói của ServBay, và xác nhận trạng thái là “Đang chạy”. Nếu chưa chạy, hãy thử khởi động nó.
Kiểm tra tiện ích mở rộng PHP memcached
đã được tải chưa:
Để kiểm tra phiên bản PHP cụ thể đã nạp extension memcached
chưa, cách đơn giản nhất là sử dụng hàm phpinfo()
:
Tạo một file PHP mới tại thư mục gốc website trong ServBay (mặc định là
/Applications/ServBay/www
), ví dụ đặt tên làinfo.php
.Thêm nội dung sau vào file:
php<?php phpinfo(); ?>
1
2
3Truy cập file này thông qua website cục bộ đã cấu hình với ServBay (ví dụ: domain website của bạn là
servbay.demo
thì mởhttp://servbay.demo/info.php
).Trên trang
phpinfo
hiện ra, tìm mục "memcached". Nếu xuất hiện phần "memcached" với thông tin cấu hình và version, tiện ích mở rộng đã được nạp thành công và sẵn sàng sử dụng.
Sử dụng Memcached trong mã PHP
Sau khi chắc chắn máy chủ Memcached đang chạy và extension memcached
đã được nạp, bạn có thể dùng lớp Memcached
trong PHP để kết nối và thực hiện các thao tác bộ nhớ đệm.
Mặc định, Memcached server chạy trên localhost
cổng tiêu chuẩn 11211
.
Ví dụ mã nguồn
Sau đây là ví dụ PHP đơn giản sử dụng lớp Memcached
kết nối tới máy chủ Memcached cục bộ, thực hiện thao tác lưu và lấy dữ liệu:
Lưu đoạn mã bên dưới thành file PHP tại thư mục website của ServBay (ví dụ: /Applications/ServBay/www/memcached_test.php
):
php
<?php
// Thông tin máy chủ Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Tạo đối tượng client Memcached
$memcached = new Memcached();
// Thêm máy chủ Memcached vào pool kết nối của client
// Phương thức addServer() trả về true/false xác định thêm vào danh sách thành công, không phải đã kết nối thành công
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Lưu ý: addServer thất bại thường là do cấu hình sai, không phải do không kết nối được server
die("Không thể thêm máy chủ Memcached vào danh sách kết nối. Vui lòng kiểm tra lại cấu hình host và port.");
}
// Thử lấy một khóa không tồn tại để kiểm tra kết nối (không bắt buộc, nhưng nên làm)
// get() trả về false hoặc mảng rỗng khi khóa không tồn tại hoặc có lỗi kết nối
// Memcached::getResultCode() cung cấp mã trạng thái chi tiết hơn
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Thử lấy khóa không tồn tại
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Nếu không phải RES_NOTFOUND hoặc RES_SUCCESS có thể đã có lỗi kết nối
// Lưu ý: RES_SUCCESS có thể trả về nếu giá trị là rỗng
// Kiểm tra kết nối nghiêm ngặt hơn có thể cần bổ sung logic hoặc phụ thuộc vào hành vi của client
// Đối với phát triển cục bộ, thường chỉ cần addServer thành công và các thao tác tiếp theo không lỗi là được
echo "Lưu ý: Có thể gặp sự cố khi kết nối tới máy chủ Memcached. Result Code: " . $result_code . "<br>";
// Trong thực tế nên xử lý lỗi chi tiết hơn
} else {
echo "Kết nối thành công tới máy chủ Memcached ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Ví dụ thao tác bộ nhớ đệm ---
// Dữ liệu cần lưu vào bộ nhớ đệm
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => 'demo@servbay.test',
'status' => 'active'
];
$expiration = 3600; // Thời gian hết hạn cache (giây) (ở đây là 1 giờ)
// Lưu dữ liệu vào cache
// set() trả về giá trị true/false xác định thao tác thành công hay thất bại
if ($memcached->set($key, $data, $expiration)) {
echo "Dữ liệu đã được lưu thành công vào Memcached với khóa '{$key}', thời gian hết hạn {$expiration} giây.<br>";
} else {
echo "Lưu bộ nhớ đệm thất bại!<br>";
// Có thể lấy lý do thất bại qua $memcached->getResultCode()
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Thử lấy dữ liệu từ bộ nhớ đệm
echo "Đang thử lấy dữ liệu từ cache...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() trả về false nếu không có cache hoặc bị lỗi
echo "Đã lấy dữ liệu thành công từ cache:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Không tìm thấy dữ liệu trong cache hoặc lấy thất bại, khóa '{$key}'.<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Minh họa trường hợp hết hạn cache (giả sử thời gian đã qua)
// Trong thực tế, nên kiểm tra $cachedData === false để reload dữ liệu từ nguồn gốc (database hoặc API) và sau đó lưu lại cache.
// Ví dụ: xóa dữ liệu cache
/*
echo "Đang thử xóa dữ liệu khỏi cache...<br>";
if ($memcached->delete($key)) {
echo "Đã xóa dữ liệu khỏi cache thành công, khóa '{$key}'.<br>";
} else {
echo "Xóa dữ liệu cache thất bại!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Thử lấy lại dữ liệu đã xóa
echo "Đang thử lấy lại dữ liệu đã xóa...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Vẫn lấy được dữ liệu (xóa thất bại):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Dữ liệu không còn trong cache (đúng như mong đợi).<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// Ví dụ: xóa toàn bộ cache (CẨN THẬN!)
/*
echo "Đang thử xóa toàn bộ cache...<br>";
if ($memcached->flush()) {
echo "Đã xóa toàn bộ dữ liệu cache.<br>";
} else {
echo "Xóa toàn bộ cache thất bại!<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
Sau khi lưu xong, bạn truy cập file memcached_test.php
qua website cục bộ cấu hình trên ServBay để kiểm tra trạng thái kết nối, kết quả lưu/lấy dữ liệu qua cache.
Lưu ý quan trọng
- Đảm bảo gói Memcached đang ở trạng thái đang chạy trong ServBay.
- Mặc định Memcached lắng nghe trên
127.0.0.1
(hoặclocalhost
) với cổng11211
— thông thường bạn không cần thay đổi gì. - Nếu PHP không kết nối được, hãy kiểm tra trạng thái gói Memcached và chắc chắn không có firewall nào chặn kết nối cục bộ.
- Phương thức
addServer
của lớpMemcached
chỉ thêm server vào pool, KHÔNG tạo kết nối ngay hoặc kiểm tra server khả dụng. Chỉ khi gọi các hàm nhưget
,set
... mới kiểm tra thực sự. Nên kiểm tra kết quả trả về của các thao tác đó hoặc dùnggetResultCode()
để xác minh thành công.
Kết luận
ServBay cung cấp phương thức cực kỳ đơn giản để sử dụng Memcached cho các lập trình viên. Nhờ tích hợp sẵn máy chủ Memcached và tiện ích mở rộng PHP memcached
đã cài đặt và kích hoạt sẵn, bạn không cần cài đặt hoặc cấu hình phức tạp mà vẫn dễ dàng triển khai bộ nhớ đệm dữ liệu hiệu quả trong môi trường phát triển cục bộ, sẵn sàng xây dựng các ứng dụng PHP hiệu suất cao.