THAM KHẢO BÀI CÁCH SỬ DỤNG CACHE RULES MỚI NHẤT
Khi các bạn sử dụng cloudflare để cache cho website là 1 điều rất lợi hại giúp tối ưu tải và tiết kiệm băng thông rất nhiều, ngoài ra còn chống ddos nữa.
Vậy khi dữ liệu cache và cần xóa cache nếu có các tương tác như cập nhật bài mới, thay đổi views, comment thì không thể đời 2 tiếng sau mới update theo cơ chế mặc định của cloudflare như vậy cảm thấy khá chậm đúng không.
Đối với wordpress thì việc này khá đơn giản vì có tích hợp plugin cloudflare để quản lý xóa và thiết lập khi có bài mới là auto xóa cache để update dữ liệu lên trang home.
Nhưng với trường hợp bạn code 1 app web thuần bằng PHP thì không có các plugin đó sẽ tích hợp kiểu gì? Bài viết này sẽ giúp bạn làm việc này.
Nội dung chính
CÁCH TÍCH HỢP API TOKEN VÀ ZONE ID ĐỂ XÓA CACHE CLOUDFLARE
Bước 1: Cần có Zone ID và API Token của cloudflare
Để lấy 2 thông số này các bạn vào overview của domain cần xóa cache, kéo xuống dưới góc phải sẽ thấy khu vực Zone ID và get your api key.

Zone ID thì đã có sẵn còn API key thì bạn phải tạo như sau:

Bước 2: Sau khi có API key và zone id nhập vào config.php của bạn
Config.php
// Zone_id of domain on cloudflare use to remove cache by cloudflare => get zone id by overview and scroll to nearly right footer
"cf_zone_id" => "dfbbf0543xxxxxxxxxxxx0235501b969",
"cf_token" => "1-2HIE4IHfIJxxxxxxxxxxxkiUpnRpvQ",
Bước 3: Tạo thư viện để gán tag cho các trang muốn xóa
Tag ở đây như 1 nhãn ID giúp cloudflare và ta biết được vị trí cần xóa cache
VD: chúng ta thường có các nhóm như trang chủ home, list, category, trang chi tiết 1 bài viết
vậy gán tag cho trang chủ có thể là home và list => khi có dữ liệu hay cập nhật bài viết thì sẽ tìm các tag là home và list để xóa cache lúc này bài mới sẽ hiển thị ra ngoài trang chủ.
Tạo file lib/cf_cache_tags.php:
<?php
// lib/cf_cache_tags.php
/**
* Gắn Cache-Tag + Cache-Control cho Cloudflare.
* Cloudflare sẽ đọc Cache-Tag và remove header đó trước khi trả về client.
*/
function cf_set_cache_tags(array $tags, int $edgeTtlSeconds = 7200): void
{
// normalize tags: trim, lowercase, bỏ rỗng, unique
$clean = [];
foreach ($tags as $t) {
$t = strtolower(trim((string)$t));
if ($t !== '') $clean[$t] = true;
}
$tags = array_keys($clean);
if (!$tags) return;
// Cache-Control cho CDN/browser (tuỳ mày chỉnh)
// - s-maxage: dành cho shared cache/CDN
// - max-age: browser
header('Cache-Control: public, max-age=120, s-maxage=' . $edgeTtlSeconds);
// Cache-Tag: tag1,tag2
header('Cache-Tag: ' . implode(',', $tags));
}
/**
* Helper build tag chuẩn hoá để purge theo logic.
*/
function cf_tags_home(): array
{
return ['home', 'list'];
}
function cf_tags_category(int $catId): array
{
return ['category', 'list', 'cat_' . $catId];
}
function cf_tags_post(int $postId): array
{
return ['post', 'post_' . $postId];
}
Ví dụ gắn tag trong các trang
Vào file App.class.php => file route các trang
VD gắn vào trang home
protected function homeindex(){
global $mysql;
global $conne;
Main::set("image",$this->config['url']."/themes/".$this->config['theme']."/images/logo_fb.png");
Main::set("url", $this->config['url'].'/'.$_GET["a"]);
$act_home='active';
include(ROOT.'/lib/cf_cache_tags.php');
cf_set_cache_tags(cf_tags_home(), 7200); // edge 2h
include(THEME."/header.php");
include(THEME."/index.php");
$this->footer();
}
Khi vào trang home sẽ gán tag thông qua hàm cf_set_cache_tags(cf_tags_home(), 7200);
Bước 4: Tạo hàm xóa cache – Purge theo Tag (Cloudflare API)
Tạo file lib/cf_purge.php:
<?php // lib/cf_purge.php function cf_api_request(string $url, string $token, array $payload): array { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_SLASHES),
CURLOPT_TIMEOUT => 15,
]);
$raw = curl_exec($ch);
$err = curl_error($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($raw === false) {
return ['ok' => false, 'http' => $code, 'error' => $err ?: 'curl_error'];
}
$json = json_decode($raw, true);
if (!is_array($json)) {
return ['ok' => false, 'http' => $code, 'error' => 'invalid_json', 'raw' => $raw];
}
// Cloudflare trả { success: true/false, errors: [], ... }
return [
'ok' => (bool)($json['success'] ?? false),
'http' => $code,
'response' => $json,
];
}
/**
* Purge theo Cache-Tags
* Cloudflare limit max operations/request thường là 100. :contentReference[oaicite:2]{index=2}
*/
function cf_purge_by_tags(string $zoneId, string $token, array $tags): array
{
$tags = array_values(array_unique(array_filter(array_map('trim', $tags))));
if (!$tags) return ['ok' => true, 'http' => 0, 'response' => ['success' => true, 'skipped' => true]];
// chia batch 100 tags/request cho chắc
$results = [];
foreach (array_chunk($tags, 100) as $batch) {
$url = "https://api.cloudflare.com/client/v4/zones/{$zoneId}/purge_cache";
$results[] = cf_api_request($url, $token, ['tags' => $batch]);
}
return ['ok' => true, 'batches' => $results];
}
/**
* Purge theo URL (khi thật sự cần “đúng 1 trang”)
*/
function cf_purge_by_urls(string $zoneId, string $token, array $urls): array
{
$urls = array_values(array_unique(array_filter(array_map('trim', $urls))));
if (!$urls) return ['ok' => true, 'http' => 0, 'response' => ['success' => true, 'skipped' => true]];
foreach ($urls as &$u) {
// Nếu mày truyền path "/abc" thì tự ghép domain ở nơi gọi cho chắc
// Ở đây assume full URL
}
$url = "https://api.cloudflare.com/client/v4/zones/{$zoneId}/purge_cache";
return cf_api_request($url, $token, ['files' => $urls]);
}
function cf_purge_everything($zoneId, $token)
{
$url = "https://api.cloudflare.com/client/v4/zones/$zoneId/purge_cache";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $token",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"purge_everything" => true
]),
CURLOPT_TIMEOUT => 15,
]);
$res = curl_exec($ch);
curl_close($ch);
return json_decode($res, true);
}
Bước 5: Sau khi setup xong thử chạy xóa cache xem sao
Tạo đường dẫn thực thi xóa => Vào file App.class.php tạo route với tên cf_clear để test
protected function cf_clear(){
//require_once __DIR__ . '/lib/cf_purge.php';
//require_once __DIR__ . '/lib/cf_cache_tags.php';
include(ROOT."/lib/cf_purge.php");
include(ROOT."/lib/cf_cache_tags.php");
$CF_ZONE_ID = $this->config['cf_zone_id']; // hoặc define trong config riêng
$CF_TOKEN = $this->config['cf_token']; // token quyền "Cache Purge" cho zone
$tagsToPurge = [];
$tagsToPurge[] = 'home';
$tagsToPurge[] = 'list';
/*if (!empty($catId)) {
$tagsToPurge[] = 'cat_'.$catId;
}
*/
$tagsToPurge = array_values(array_unique($tagsToPurge));
//$xoa_theo_tag_chi_dinh= cf_purge_by_tags($CF_ZONE_ID, $CF_TOKEN, $tagsToPurge);
$xoa_full_cache_domain= cf_purge_everything($CF_ZONE_ID, $CF_TOKEN);
print_r($xoa_full_cache_domain);
}
Nếu kết quả trả về có phần tử mảng [success] => 1 tức là xóa thành công.
Bước 6: Giả lập môi trường test xem có thực sự xóa cache không.

Bạn ra trang home hãy F5 và xem ở phần HEADERS của trang nếu cf-cache-status: HIT tức là đã cache
Tiếp đến hay chạy đường dẫn domain/cf_clear nếu trả về success:1 là xóa thành công và ra lại trang home check HEADERS nếu cf-cache-status: MISS tức là đã xóa cache thành công.
Tương tự từ ví dụ trên chúng ta có thể mở rộng tùy ý tích hợp cho các ứng dụng cần thiết.
Có thể xem chi tiết tại video hướng dẫn của Admin đã lưu trữ.
