Lập trình PHP
NFS (Bài trước)
(Bài tiếp) Pure FTPD

Memcached là gì?

Memcached lầ một hệ thống dùng bộ nhớ để lưu trữ các đối tượng cần truy xuất nhanh, nó là hệ thống cached phân tán (có thể thiết lập quản lý truy xuất ở nhiều máy chủ), mục đích chính của Memcached là tăng tốc ứng dụng web, giảm tải truy vấn database.

Memcached dùng bộ nhớ vật lý thật của máy để lưu trữ dữ liệu theo cặp key/value, ứng dụng nào dùng đến Memcached thì truy vấn đến nó bằng các API tương ứng để lưu hay lấy giá trị.

Trang chủ: https://memcached.org/

memcached

Nguyên tắc hoạt động đơn giản: Giả sử ứng dụng của bạn có dùng đến Memcached, khi nhận được một truy vấn có yêu cầu lấy dữ liệu nào đó, thì ứng dụng sẽ kiểm tra xem có lưu trong Memcached hay không, nếu có nó sẽ lấy dữ liệu đã lưu và trả về cho user (rất nhanh vì không truy xuất từ bộ nhớ, giảm tải CPU vì không phải tính toán để tạo ra đối tượng). Nếu đối tượng chưa được lưu trong Memcached thì nó truy vấn đến CSDL, tính toán để tạo ra đối tượng, lưu lại và Memcached rồi trả về cho user, và các yêu câu sau thì chỉ việc lấy kết quả từ Memcached.

Cài đặt Memcached trên CentOS

# yum -y update
# yum -y install memcached

Sau khi có Memcached, thiết lập để nó chạy cùng hệ thống

Trên CentOS 6
# chkconfig memcached on

Trên CentOS 7
# systemctl enable memcached

Memcached là dịch vụ lắng nghe ở cổng 11211, nên muốn các ứng dụng Client truy cập được vào Memcached có mở cổng này

Mở cổng 11211 cho Memcached

Trên CentOS 6
# iptables -I INPUT -p udp --dport 11211 -j DROP
# iptables -I INPUT -p tcp --dport 11211 -j DROP

Trên CentOS 6 - nếu muốn an toàn, chỉ Local truy cập được Memcached (an toàn)
# iptables -I INPUT -p udp --dport 11211 -j DROP
# iptables -I INPUT -p tcp --dport 11211 -j DROP
# iptables -I INPUT -p udp -s 127.0.0.1 --dport 11211 -j ACCEPT
# iptables -I INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT

Trên CentOS 7
# firewall-cmd --permanent --zone=public --add-port=11211/tcp

Chạy dịch vụ Memcached

# systemctl start memcached

Cấu hình dịch vụ Memcached

File cấu hình của Memcached tại /etc/sysconfig/memcached, nếu muốn thay đổi một số thông số thì chỉnh ở file này

# vi /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""

CACHESIZE="64" thiết lập sử dụng 64MB bộ nhớ để làm cache, nếu nhiều ram thừa tăng số này nên

Để an toàn, chỉ cho phép các ứng dụng trên cùng máy truy cập vào cached thiết lập

OPTIONS="-l 127.0.0.1 -U 0"

Chỉnh lại thiết lập rồi thì khởi động lại Memcached

# systemctl restart memcached

Ứng dụng Memcached cho PHP

Nếu muốn PHP truy cập được server Memcached thì cần cài thêm extension có tên memcache

pecl install memcached

Nếu có sử dụng PHP-FPM thì cần khởi động lại

systemctl restart php-fpm

Kiểm tra xem PHP đã tải module memcache.so chưa

# php -m | grep memcache

Nếu thấy có dòng memchaced thì đã cài đặt thành công. Nếu chưa có, bạn có thể cần thêm vào php.ini: extension=memcache.so

Sau đây tìm cách tăng tốc ứng dụng PHP của bạn bằng cách sử dụng Memcached

Dùng Memcached lưu PHP SESSION

Như là biết mỗi phiên làm việc của PHP có thể khởi tạo một biến $_SESSION để trao đổi lưu giữ dữ liệu giữa các phiên làm việc. Mặc định kết thúc phiên làm việc thì Session lưu ra một file trên đĩa, và phục hồi cho phiên làm việc tiếp theo nếu cookie phù hợp. Nơi lưu các file session đặt ở thiết lập session.save_path trong php.ini

Giờ muốn Memcached là nơi session được lưu giữ, để tăng tốc ứng dụng PHP thì mở file php.ini (php.ini ở đâu) ra và thêm vào cuối thiết lập sau:

session.save_handler = memcached
session.save_path = "192.168.1.10:11211"
memcached.sess_locking = 0
memcached.sess_prefix = 'memc.sess.'

Trong đó 192.168.1.10 là IP của Server, hãy thay bằng IP trên Server của bạn, hoặc localhost nếu PHP và Memcached nằm trên cùng một Server thật (lưu ý phù hợp với options của Memcached ở trên). memcached.sess_prefix thiết lập tiền tố các key lưu trong trong Memcache, sau này bạn xem nhưng key nào có tiền tố do bạn đặt, biết đó là do PHP Session lưu.

Sau đó khởi động lại các Apache (http) hoặc nginx nếu có dùng nginx, cũng như php-fpm

# systemctl restart httpd
# systemctl restart nginx 
# systemctl restart php-fpm 

Từ đây Session đã lưu trong Memcached

Dùng Memcached trong ứng dụng PHP

<?
$keycache   = 'key_luu_tru_noi_dung_abc';
$memcached  = new \Memcached();
$memcached->addServer('127.0.0.1', '11211');

$objectget = $memcached->get($keycache);
if ($objectget !== false)
{
    //Có đối tượng lưu trong cached
    var_dump($objectget);
}
else
{
    //Không có đối tượng với key trên trong cached
}

//Không có cached ...
//Thi hành các lệnh PHP mong muốn




//Lưu đối tượng nào đó vào cached để truy cập sau
$obj = ['abc','xyz'];
$memcached->add($keycache, $obj);


//Xóa một key nào đó
$memcached->delete($key);

?>

zend-cache Zend Framework dùng Memcached

Nếu có sử dụng Zend Framework, thì thành phần zend-cache của nó có adapter để sử dụng Memcached, đồng thời phù hợp chuẩn PRS-6 (Cache Interface)

 use Zend\Cache\StorageFactory;

 // Tạo đối tượng Cache
 $cache = StorageFactory::factory([
 'adapter' => [
    'name'    => \Zend\Cache\Storage\Adapter\Memcache::class,
    'options' => [
            'ttl' => 86400,                    //Thời gian (s) lưu cache
            'servers' => '127.0.0.1',          //IP server Memcached, thay bằng của bạn
            'namespaceSeparator' => '.',
            'lib_options' => [
                \Memcached::OPT_PREFIX_KEY => 'mywebsite.'//Tiền tố lưu cache cho web
            ]
        ],
    ],
 ]);


 $key = 'abc-mot-key-nao-do';
 $rs  = null;
 $objectget = $cache->getItem($key, $rs);

 if ($rs)
 {
 //Đối tượng lưu lấy được
 var_dump($objectget);
 }
 else {
 //Không có lưu cache, hoặc đã hết hạn
 }




 //Lưu một giá trị vào cache

 $ob = ["abc", "xyz"];
 $cache->setItem($key, $ob);

Sử dụng Memcached unix socket

Cách chạy dịch vụ Memcached ở trên, nó lắng nghe ở cổng chỉ định, sau đó các ứng dụng kết nối đến nó thông qua giao thức tcp. Nếu các dịch vụ cùng chạy trên một máy (ví dụ PHP-FPM và Memcached) thì có thể thiết lập kết nối giữa PHP và Memcached qua unix socket thay cho tcp để tăng tốc truy cập.

Có thể thiết lập để khi Memcached chạy nó tạo ra file sock, ví dụ file sock là: /tmp/memcached.sock, thì file cấu hình /etc/sysconfig/memcached có thể cập nhật thành:

# PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="500"
OPTIONS="-s '/tmp/memcached.sock' -a 0766"

Sau đó khởi động lại

systemctl restart memcached

Từ đây các dịch vụ có thể kết nối bằng cách dùng file /tmp/memcached.sock

Ví dụ, trong php.ini có thể sửa thành:

session.save_handler = memcached
;session.save_path = "192.168.1.11:11211"
session.save_path = "/tmp/memcached.sock"
memcached.sess_locking = 0
memcached.sess_prefix = 'memc.sess.'

Kết nối từ code PHP:

$memcached  = new \Memcached();
$memcached->addServer('/tmp/memcached.sock', 0);

Chú ý là có công cụ dòng lệnh để giám sát cơ bản memcached là memcached-tool, bạn có thể xem thống kê bằng cách gõ

memcached-tool 192.168.1.11:11211

Hoặc nếu dùng unix socket

memcached-tool /tmp/memcached.sock

Bạn có thể truy vấn thêm bằng cách sử dụng tham số theo hướng dẫn từ việc gõ

memcached-tool 192.168.1.11:11211 -h
NFS (Bài trước)
(Bài tiếp) Pure FTPD