Lập trình PHP

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 hàm 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

# service memcached start

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

# service memcached restart

Ứ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 php-memcached

# yum clean all
# yum -y update
# yum -y install php-pecl-memcache

Sau khi cài đặt xong thì khởi động lại Apache và Memcache

# service htpd restart
# service memcached restart

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

# php -m | grep memcache

Nếu thấy có dòng memechaced thì đã cài đặt thành công.

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 Memcached và Apache

# service htpd restart
# service memcached restart

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);