سلام یه سایت فروشگاهی وردپرسی دارم که در بحث سرعت و کش سازی دارم از افزونه لایت اسپید کش استفاده میکنم
سرعت سایت پایینه و با ساخت کش اصلاح میشه و زیر 1 ثانیه باز میکنه
مشکلی که در ساخت کش دارم خزنده هاستم فعال نیست و باید پلن بالاتر ارتقاء بدم و به دلیل جابجایی و هزینه ها اینکار به نظرم منطقی نیست چون که تعداد صفحات هم زیر 200 لینک هستش
به دلیل اینکه خزنده هاست فعال نیست باید یکبار صفحه دستی باز بشه تا کش ساخته بشه
حالا میخوام که به کمک کران جاب صفحات کش بسازم که با افزونه لایت اسپید کش سازگاری داشته باشه و اعمال کنه
من اینکار رو به کمک چت جی پی تی انجام دادم ولی مشکلی که هست فقط کش موبایل رو انجام میده و دسکتاپ کش نمیشه
نحوه کار کران جاب هم اینطور هست که هر یه دقیقه 6 تا لینک رو کش سازی میکنه و دوباره اجرا میشه و خیلی ازش راضیم به دلیل اینکه زمان زیادی صرف کردم الان 3 ماهه فعاله و هیچ مشکلی نداره ولی این قسمت کش دسکتاپ رو هرجور که تونستم بهش فهموندم ولی رو نساخت
حالا من کد هارو در زیر پست میزارم هرکی خواست استفاده کنه چون برای کش موبایل عالی داره جواب میده به طوری که زیر نیم ساعت تمام کش صفحات ساخته میشه
و اگر هم میشه یه نفر هم به من کمک کنه که ببینم چیکار باید کنم که کش دسکتاپ رو هم براش بسازه
1 پسندیده
<?php
/**
* Smart Mobile Cache Builder v4.3
*/
/* ================== تنظیمات ================== */
$site_url = "https://damin.com"; // دامنه سایت
$secret_key = "123456789"; // کلید امنیتی
$limit_per_run = 6; // تعداد لینک در هر اجرا
$lock_ttl_sec = 600; // زمان اعتبار قفل (ثانیه)
$log_max_lines = 500; // حداکثر خطوط لاگ
$mobile_user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1";
/* ================== مسیر فایلها ================== */
$base_dir = __DIR__;
$urls_file = $base_dir . "/urls.json";
$progress_file = $base_dir . "/progress.json";
$lock_file = $base_dir . "/cache-builder.lock";
$log_file = $base_dir . "/cache-log.txt";
/* ================== امنیت ================== */
if (!isset($_GET['key']) || $_GET['key'] !== $secret_key) {
http_response_code(403);
exit("ACCESS DENIED");
}
/* ================== مدیریت لاگ ================== */
function log_line($msg) {
global $log_file, $log_max_lines;
$line = date("[Y-m-d H:i:s] ") . $msg . "\n";
file_put_contents($log_file, $line, FILE_APPEND | LOCK_EX);
$lines = @file($log_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines && count($lines) > $log_max_lines) {
$last = array_slice($lines, -$log_max_lines);
file_put_contents($log_file, implode("\n", $last) . "\n", LOCK_EX);
}
}
/* ================== توابع کمکی ================== */
function normalize_url($url) {
return rtrim($url, "/");
}
function acquire_lock() {
global $lock_file, $lock_ttl_sec;
if (file_exists($lock_file)) {
$age = time() - filemtime($lock_file);
if ($age > $lock_ttl_sec) @unlink($lock_file);
}
$lock_data = [ "pid" => getmypid(), "time" => time() ];
return @file_put_contents($lock_file, json_encode($lock_data), LOCK_EX) !== false;
}
function lock_exists() {
global $lock_file, $lock_ttl_sec;
if (!file_exists($lock_file)) return false;
$age = time() - filemtime($lock_file);
return ($age <= $lock_ttl_sec);
}
function release_lock() {
global $lock_file;
if (file_exists($lock_file)) @unlink($lock_file);
}
/* ================== جمعآوری لینکها ================== */
function get_all_urls($site_url, $force_rebuild = false) {
global $urls_file;
if (!$force_rebuild && file_exists($urls_file)) {
$data = json_decode(file_get_contents($urls_file), true);
if (is_array($data) && count($data)) return $data;
}
$urls = [];
$page = 1;
// محصولات
while (true) {
$api_url = $site_url . "/wp-json/wp/v2/product?per_page=100&page=" . $page;
$json = @file_get_contents($api_url);
if (!$json) break;
$data = json_decode($json, true);
if (empty($data) || !is_array($data)) break;
foreach ($data as $product) {
if (!empty($product['link'])) $urls[] = normalize_url($product['link']);
}
$page++;
}
// دستهبندیها
$cat_url = $site_url . "/wp-json/wp/v2/product_cat?per_page=100";
$cats_json = @file_get_contents($cat_url);
$cats = json_decode($cats_json, true);
if (!empty($cats) && is_array($cats)) {
foreach ($cats as $cat) {
if (!empty($cat['slug'])) {
$urls[] = normalize_url($site_url . "/product-category/" . $cat['slug']);
}
}
}
// صفحات ثابت
$static_pages = [
$site_url,
$site_url . "/shop",
$site_url . "/login",
$site_url . "/blog",
$site_url . "/about-us",
$site_url . "/contact-us",
$site_url . "/menu",
];
foreach ($static_pages as $u) $urls[] = normalize_url($u);
// ذخیره در فایل
$urls = array_values(array_unique($urls));
file_put_contents($urls_file, json_encode($urls, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES), LOCK_EX);
return $urls;
}
/* ================== چک کش موبایل ================== */
function is_cached_mobile($url, $ua) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $ua,
CURLOPT_TIMEOUT => 15,
CURLOPT_HEADER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
]);
$resp = curl_exec($ch);
curl_close($ch);
if (!$resp) return false;
if (stripos($resp, "x-litespeed-cache: hit") !== false) return true;
if (stripos($resp, "x-wp-rocket-cache: hit") !== false) return true;
return false;
}
/* ================== ساخت کش واقعی موبایل (نسخه نهایی) ================== */
function build_mobile_cache($url, $ua) {
$headers = [
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language: en-US,en;q=0.9",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Upgrade-Insecure-Requests: 1"
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $ua,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
]);
curl_exec($ch);
curl_close($ch);
}
/* ================== مدیریت پیشرفت ================== */
function read_progress() {
global $progress_file;
if (!file_exists($progress_file)) {
file_put_contents($progress_file, json_encode(["index" => 0]), LOCK_EX);
return 0;
}
$data = json_decode(file_get_contents($progress_file), true);
return isset($data['index']) ? intval($data['index']) : 0;
}
function write_progress($i) {
global $progress_file;
file_put_contents($progress_file, json_encode(["index" => $i]), LOCK_EX);
}
/* ================== اجرای اصلی ================== */
if (isset($_GET['limit'])) {
$lim = intval($_GET['limit']);
if ($lim > 0 && $lim <= 500) $limit_per_run = $lim;
}
$force_rebuild = (isset($_GET['rebuild']) && $_GET['rebuild'] == '1');
if (lock_exists()) {
header("Content-Type: text/plain; charset=utf-8");
echo "⏳ Another run is in progress. Try later.\n";
exit;
}
if (!acquire_lock()) {
header("Content-Type: text/plain; charset=utf-8");
echo "⚠️ Cannot acquire lock. Try later.\n";
exit;
}
register_shutdown_function('release_lock');
$urls = get_all_urls($site_url, $force_rebuild);
$total = count($urls);
$start_index = read_progress();
$processed = 0;
$start_time = microtime(true);
header("Content-Type: text/plain; charset=utf-8");
echo "🚀 Started. total=$total, start_index=$start_index, limit=$limit_per_run\n";
for ($i = $start_index; $i < $total && $processed < $limit_per_run; $i++) {
$url = $urls[$i];
$hit = is_cached_mobile($url, $mobile_user_agent);
if ($hit) {
log_line("SKIP (HIT): $url");
} else {
build_mobile_cache($url, $mobile_user_agent);
$hit2 = is_cached_mobile($url, $mobile_user_agent);
if ($hit2) {
log_line("CACHE BUILT: $url");
} else {
log_line("FAILED: $url");
}
}
$processed++;
write_progress($i + 1);
}
$new_index = read_progress();
if ($new_index >= $total) {
write_progress(0);
log_line("CYCLE COMPLETE: all URLs processed.");
}
$time_taken = round(microtime(true) - $start_time, 2);
echo "✅ Processed $processed links in {$time_taken}s. Progress: " . read_progress() . " / $total\n";
?>