Hướng dẫn cache website chạy PHP bằng cách đơn giản nhất

15:28 02/02/2018   Trịnh Tuấn Tài

Hầu hết các web server có thể xử lý các lượng truy cập bình thường và đa phần các trang web không có quá nhiều truy cập. Vì vậy, có thể bạn tự hỏi: Tại sao bạn nên cache trang web của bạn được hỗ trợ PHP? Các máy chủ web có thể phục vụ nhiều yêu cầu (request), nhiều file cùng một lúc, nhưng tất cả các file này nên là file tĩnh. Một tập lệnh PHP được thực thi bởi máy chủ web và tiếp theo nó sẽ tạo ra dữ liệu HTML được gửi đến người dùng (trình duyệt web). Cho nên khi thực hiện điều này, máy chủ cần sử dụng nhiều bộ nhớ hơn cách gửi một file tới người dùng.

 

Các trang web không chỉ có truy cập từ người dùng thật

Nếu trang WordPress hoặc PHP của bạn có một vài người truy cập trong vòng một giờ, một máy chủ web sẽ có thể xử lý TẤT CẢ các trang và trả về cho người dùng truy cập mà không gặp bất kỳ sự cố nào. Mọi thứ vẫn tốt đẹp, nhưng sẽ như thế nào nếu trang web của bạn được truy cập bởi bot hay ddos? Kịch bản xấu nhất là các truy cập "không tự nhiên" này có thể làm chậm trang web của bạn và tất cả các trang web khác được lưu trữ trên cùng một web server!

 

Dùng WP Super Cache nếu với WordPress

Ngay cả khi trang WordPress của bạn không có nhiều bài đăng hoặc nhận xét, bạn vẫn nên cài đặt plugin WP Super Cache. Plugin này hoạt động trên hầu hết các máy chủ và có thể coi như một bảo hiểm cho website của bạn sống khỏe! WordPress cần rất nhiều truy vấn cơ sở dữ liệu để hiển thị một trang duy nhất cho mỗi người dùng truy cập. Mỗi kết nối cơ sở dữ liệu cần một số bộ nhớ và sẽ sử dụng một số CPU. Sử dụng plugin cache này giúp trang bình thường đã xem không sử dụng cơ sở dữ liệu nữa và máy chủ của bạn có thể xử lý nhiều lưu lượng truy cập hơn.

 

Cache cho các trang web PHP khác

Có rất nhiều cách để cache trang web PHP của bạn, có các module cache riêng biệt khả dụng hoặc giúp tạo ra các phiên bản cache với mỗi trang sử dụng PHP. Giải pháp nào tốt nhất cho tình huống của bạn - điều này phụ thuộc vào ứng dụng và loại lưu trữ mà bạn đang sử dụng.

 

Hướng dẫn PHP cache cơ bản

Nếu bạn đang tìm kiếm cách để lưu cache các trang đơn từ trang web của mình, bạn nên thử hướng dẫn này. Đoạn mã đơn giản có thể "tải xuống" mã HTML từ trang được chọn và lưu trữ mã HTML dưới dạng trang tĩnh. Code sau sẽ kiểm tra, đọc / ghi và xuất ra phiên bản bộ nhớ cache.

<?php
function get_and_write($url, $cache_file) {
	$string = file_get_contents($url);
	$f = fopen($cache_file, 'w');
	fwrite ($f, $string, strlen($string));
	fclose($f);
	return $string;
}
 
function read_content($path) {
	$f = fopen($path, 'r');
	$buffer = '';
	while(!feof($f)) {
		$buffer .= fread($f, 2048);
	}
	fclose($f);
	return $buffer;
}
 
$cache_file = '/home/user/public_html/cache/cache.page.php';
$url = 'http://www.domain.com/page.php';
 
if (file_exists($cache_file)) { // is there a cache file?
    $timedif = (time() - filemtime($cache_file));
     if ($timedif < 3600*24) {
        $html = read_content($cache_file);
    } else { // create a new cache file
        $html = get_and_write($url, $cache_file);
    }
} else { // no file? create a cache file
    $html = get_and_write($url, $cache_file);
}
echo $html;
exit;

Đoạn code trên khá đơn giản nhưng không có độ tùy biến cao. Để làm nó này hoạt động, bạn cần tạo một danh sách cho các tệp tin cache và cho URL. Trong ví dụ tiếp theo chúng ta sử dụng một số mod_rewrite cho phù hợp với cấu trúc tập tin.

Trong trường hợp sau, chúng ta sử dụng một phần từ URL và chuyển chuỗi này như một biến bằng cách sử dụng chuỗi truy vấn. Dưới đây là một số URL ví dụ:

http://domain.com/page/great-post-about-scripts
http://domain.com/page/php-upload-tutorial 
http://domain.com/page/jquery-plugin-review 

Trong tệp tin .htaccess chúng ta sử dụng quy tắc này:

RewriteEngine on
RewriteRule ^page/([a-z-]*)$ /page.php?pageurl=$1 [L]

Công cụ ghi đè sẽ truyền bất cứ thứ gì sau "page/" vào tệp page.php dưới dạng một chuỗi truy vấn. Bên trong file page.php, chúng ta cần một code để tự động hóa yêu cầu của chúng ta và tạo ra phiên bản bộ nhớ cache.

<?php
if (!empty($_GET['pageurl']) && preg_match('/^[a-z-]*$/', $_GET['pageurl'])) {
    $cache_file = '/home/user/public_html/cache/cache-'.$_GET['pageurl'].'.php';
    $url = 'http://www.domain.com/page.php?page='.$_GET['pageurl'];
} else {
	header ("HTTP/1.1 301 Moved Permanently");
    header("Location: ".$url);
    exit;
}

 

Đoạn code sử dụng trong hướng dẫn trên chỉ là một ví dụ, bạn cần thay đổi code để làm cho nó hoạt động trong tình huống của bạn. Nếu bạn có thắc mắc, nhận xét hoặc đề xuất, xin vui lòng gửi chúng vào phần bình luận dưới đây, cảm ơn!