آیا تا به حال به عنوان اولین بازدیدکننده وارد صفحهای از سایت خود شدهاید و با کندی ناامیدکننده آن مواجه شدهاید؟ این تجربهی مشترک بسیاری از مدیران سایتهای وردپرسی است. دلیل این کندی، پدیدهای به نام “Cache Miss” یا “عدم وجود کش” است. وقتی صفحهای برای اولین بار بازدید میشود، سرور باید تمام پردازشها را از صفر انجام دهد تا آن را برای شما آماده کند. اما بازدیدهای بعدی بسیار سریعتر هستند، چون از نسخه کش شده استفاده میکنند.
به طور کلی ساز و کار افزونه های کشینگ را میتوان به این گونه معرفی کرد:(ذخیره یک نسخه از درخواست در سرور یا مرورگر تا برای باز خوانی بعدی همان درخواست نیاز به صرف زمان کمتری باشد).بدیهی است که تا زمانی که درخواستی شکل نگیرد کش کردن هم اتفاق نمی افتد.برای اجرای درخواست ها به صورت منظم نیاز به یک خزنده داریم.
افزونه فوقالعاده LiteSpeed Cache یک خزنده داخلی برای حل این مشکل دارد، اما در بسیاری از هاستهای اشتراکی، این خزنده با محدودیتهای شدیدی از نظر منابع (CPU و تعداد اجرا) مواجه است یا به صورت کلی غیر فعال شده است. نتیجه؟ بسیاری از صفحات سایت شما هرگز کش نمیشوند و اولین بازدیدکنندگان، کندی را تجربه میکنند.
اما نگران نباشید! در این راهنمای جامع، ما یک اسکریپت خزنده کش قدرتمند و رایگان که با PHP نوشته شده را در اختیار شما قرار میدهیم. این اسکریپت بدون هیچ محدودیتی، تمام صفحات سایت شما را پیدا کرده و کش آنها را همیشه گرم نگه میدارد.
چرا "گرم کردن کش" برای سایت شما حیاتی است؟
وقتی افزونه LiteSpeed Cache فعال است، هر صفحه میتواند دو وضعیت داشته باشد که در هدر آن مشخص میشود:
- X-LiteSpeed-Cache: miss: یعنی این صفحه در کش وجود نداشت و سرور مجبور شد آن را از نو برای شما بسازد (بازدید کند).
- X-LiteSpeed-Cache: hit: یعنی این صفحه از قبل در کش موجود بود و سرور آن را به صورت آنی و بدون هیچ پردازشی به شما تحویل داد (بازدید سریع).
هدف ما این است که تمام صفحات سایت برای همه بازدیدکنندگان وضعیت hit را داشته باشند. یک سایت ۱۰۰٪ کش شده نه تنها تجربه کاربری فوقالعادهای ایجاد میکند، بلکه با افزایش چشمگیر سرعت بارگذاری، امتیاز Core Web Vitals شما در گوگل را نیز بهبود میبخشد که یک فاکتور مهم در سئو است. اسکریپت خزنده کش ساخته شده توسط ما دقیقاً همین کار را برای شما انجام میدهد.
این اسکریپت برای بارگذاری نیاز به وب سرور خاصی ندارد و روی تمامی وب سرور هایی که قابلیت کش رو آنها فعال باشد , عملکرد مناسب و کاملی را ارائه میدهد

معرفی اسکریپت خزنده PHP سفارشی ما: یک جایگزین بینقص
این اسکریپت ساده اما قدرتمند، تمام محدودیتهای خزنده پیشفرض را دور میزند. برخی از ویژگیهای کلیدی آن عبارتاند از:
مبتنی بر سایتمپ (Sitemap): تمام لینکهای موجود در سایتمپ شما را، از نوشتهها و برگهها گرفته تا محصولات و دستهبندیها، پیدا میکند.
پردازش دستهای (Batch Processing): برای جلوگیری از تایماوت شدن در هاستهای اشتراکی، لینکها را در دستههای کوچک پردازش میکند.
قابلیت توقف و اجرای مجدد (Resumable): با ذخیره وضعیت در یک فایل، اگر اسکریپت متوقف شود، از همانجایی که مانده بود ادامه میدهد.
فشار بسیار کم روی سرور: با تأخیر قابل تنظیم بین درخواستها، منابع هاست شما را اشغال نمیکند.
سازگاری بالا: روی تمام وبسرورهایی که از PHP و cURL پشتیبانی میکنند (تقریباً تمام هاستها) به خوبی کار میکند.
کد کامل اسکریپت خزنده کش
⚠️ هشدار: برای جلوگیری از مشکل محدودیت زمان اجرا در سایتهای بزرگ، بهتر است این اسکریپت از طریق Cron Job و با استفاده از PHP CLI اجرا شود.
";
}
function fetchUrl($url, $isHeadRequest = false) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => USER_AGENT,
CURLOPT_TIMEOUT => 20, // افزایش زمان انتظار برای پاسخ
CURLOPT_NOBODY => $isHeadRequest,
CURLOPT_FOLLOWLOCATION => true, // دنبال کردن ریدایرکتها (بسیار مهم)
CURLOPT_SSL_VERIFYPEER => false, // برای جلوگیری از مشکلات SSL در برخی هاستها
CURLOPT_SSL_VERIFYHOST => false,
]);
$responseBody = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['http_code' => $httpCode, 'body' => $responseBody];
}
function extractUrlsFromXML($xmlContent, $isSitemapIndex = false) {
$links = [];
if (empty($xmlContent)) {
return $links;
}
try {
$xml = new SimpleXMLElement($xmlContent);
$elementName = $isSitemapIndex ? 'sitemap' : 'url';
foreach ($xml->$elementName as $item) {
$links[] = (string)$item->loc;
}
} catch (Exception $e) {
// در صورت بروز خطا در تجزیه XML، آن را در لاگ خطای سرور مینویسد.
error_log("خطا در تجزیه XML: " . $e->getMessage());
}
return $links;
}
function loadProgress() {
if (file_exists(PROGRESS_FILE)) {
$progress = json_decode(file_get_contents(PROGRESS_FILE), true);
// اطمینان از وجود کلیدهای لازم
return $progress ?: ["done" => [], "pending" => []];
}
return ["done" => [], "pending" => []];
}
function saveProgress($progress) {
file_put_contents(PROGRESS_FILE, json_encode($progress, JSON_PRETTY_PRINT));
}
function crawlBatch(&$progress) {
$success = [];
$failed = [];
// یک دسته از لینکهای در صف انتظار را جدا میکند
$batch = array_slice($progress["pending"], 0, BATCH_SIZE);
foreach ($batch as $url) {
// ارسال درخواست GET برای گرم کردن کش و دریافت وضعیت
$result = fetchUrl($url, false);
if ($result['http_code'] >= 200 && $result['http_code'] < 300) {
$success[] = ['url' => $url, 'status' => $result['http_code']];
} else {
$failed[] = ['url' => $url, 'status' => $result['http_code']];
}
// تاخیر برای جلوگیری از فشار به سرور
sleep(DELAY_SECONDS);
}
// انتقال لینکهای پردازش شده از pending به done
$progress["done"] = array_merge($progress["done"], $batch);
$progress["pending"] = array_slice($progress["pending"], BATCH_SIZE);
saveProgress($progress);
return [$success, $failed];
}
$progress = loadProgress();
if (empty($progress["pending"]) && empty($progress["done"])) {
echo "🚀 در حال آمادهسازی لیست لینکها از سایتمپ...
";
// دریافت سایتمپ اصلی
$sitemapIndexResult = fetchUrl(SITEMAP_INDEX, false);
if ($sitemapIndexResult['http_code'] !== 200) {
exit("❌ خطا: دریافت سایتمپ اصلی با کد وضعیت " . $sitemapIndexResult['http_code'] . " ناموفق بود.");
}
// استخراج آدرس سایتمپهای داخلی
$sitemapUrls = extractUrlsFromXML($sitemapIndexResult['body'], true);
$allUrls = [];
// دریافت و استخراج لینکها از هر سایتمپ داخلی
foreach ($sitemapUrls as $sitemapUrl) {
echo "در حال پردازش: $sitemapUrl
";
$sitemapResult = fetchUrl($sitemapUrl, false);
if ($sitemapResult['http_code'] === 200) {
$urls = extractUrlsFromXML($sitemapResult['body'], false);
$allUrls = array_merge($allUrls, $urls);
}
sleep(1); // تاخیر کوتاه بین دریافت سایتمپها
}
// حذف لینکهای تکراری و ذخیره در فایل وضعیت
$progress["pending"] = array_unique($allUrls);
$progress["done"] = [];
saveProgress($progress);
echo "🔍 تعداد کل لینکهای منحصر به فرد یافت شده: " . count($allUrls) . "
";
}
echo "🧭 در حال خزش دستهای لینکها...
";
list($success, $failed) = crawlBatch($progress);
echo "✅ تعداد لینکهای با موفقیت خزش شده در این مرحله: " . count($success) . "
";
echo "❌ تعداد لینکهای ناموفق در این مرحله: " . count($failed) . "
";
echo "⏳ تعداد کل لینکهای باقیمانده: " . count($progress["pending"]) . "
";
$reportHTML = "گزارش خزیدن سایت
📊 گزارش مرحلهای خزنده سایت
";
if (!empty($success)) {
$reportHTML .= "✅ لینکهای موفق
ردیف آدرس URL کد وضعیت ";
foreach ($success as $i => $item) {
$reportHTML .= "" . ($i + 1) . " {$item['url']} {$item['status']} ";
}
$reportHTML .= "
";
}
if (!empty($failed)) {
$reportHTML .= "❌ لینکهای ناموفق
ردیف آدرس URL کد وضعیت ";
foreach ($failed as $i => $item) {
$reportHTML .= "" . ($i + 1) . " {$item['url']} {$item['status']} ";
}
$reportHTML .= "
";
}
$reportHTML .= "";
file_put_contents(REPORT_FILE, $reportHTML);
echo "📁 گزارش کامل این مرحله در فایل ذخیره شد: مشاهده گزارش
";
if (empty($progress["pending"])) {
echo "🎉 تمام لینکها با موفقیت خزش شدند!
";
// حذف فایل وضعیت پس از اتمام کامل کار
unlink(PROGRESS_FILE);
} else {
echo "برای ادامه، این اسکریپت را مجدداً اجرا کنید (یا منتظر اجرای بعدی Cron Job بمانید).
";
}
?>
راهنمای راهاندازی قدم به قدم
- ابتدا وارد هاست خود شوید.
- در قسمت روت خود یک پوشه با نام crawler ایجاد کنید.(توجه :اگر دانش کد نویسی ندارید تا کد های خزنده را با محل ذخیره سازی خود هماهنگ کنید مطابق دستورات راه اندازی که در این بخش گفته میشود , فایل هارا بسازید. این پوشه باید در قسمت root هاست همان جایی که فایل wpconfig.php وجود دارد بارگذاری شود.)
- داخل این پوشه باید فایلی با نام crawler.php ایجاد کنید.
- کدهای بالا را کپی کرده و در فایل وارد کنید .قبل از ذخیره کردن این فایل باید ادرس سایت مپ خود را در خط 14 جایگزین کنید
- مهم: ادرس نهایی فایل باید به این روش قابل دسترسی باشد:
ourdomain.com/
crawler/
crawler.php

تنظیم کرون جاب (Cron Job)
این مهمترین مرحله برای خودکارسازی فرآیند است. ما از کرون جاب استفاده میکنیم تا سرور به صورت خودکار در بازههای زمانی مشخص، اسکریپت خزنده کش لایت اسپید ما را اجرا کند.
- وارد کنترل پنل هاست خود (مثلاً cPanel) شوید و بخش Cron Jobs را پیدا کنید.
- برای پیدا کردن مسیر صحیح PHP، به بخش MultiPHP Manager بروید و نسخه PHP مخصوص دامنه خود را پیدا کنید (مثلاً ea-php81).
- یک کرون جاب جدید با زمانبندی دلخواه (مثلاً هر ۱۵ دقیقه یک بار: */15 * * * *) و با دستور زیر ایجاد کنید:
/usr/local/bin/ea-php81 /home/YourUsername/public_html/private_tools_xyz/lscache_crawler.php > /dev/null 2>&1
- /usr/local/bin/ea-php81: مسیر PHP که از MultiPHP Manager پیدا کردید.(توجه :در هاستینگ های مختلف ممکن است متفاوت باشد , بهترین راه برای پیدا کردن این بخش تیکت زدن به خود هاستینگ میباشد.)
- /home/YourUsername/…: مسیر کامل و مطلق فایل اسکریپت شما در هاست.
- /dev/null 2>&1: این بخش از ارسال ایمیلهای اضافی پس از هر بار اجرا جلوگیری میکند.

چگونه از عملکرد صحیح خزنده مطمئن شویم؟
پس از اجرای کرون جاب، میتوانید به پوشهای که اسکریپت را در آن آپلود کردهاید سر بزنید. باید دو فایل جدید ایجاد شده باشد: crawl_progress.json (برای پیگیری وضعیت) و crawl_report.html (برای مشاهده گزارش).
(توجه: اگر این فایل ها وجود نداشت نسبت به تنظیمات قابل مشاهده بودن فایل های حساس در هاست اقدام فرمایید.)
مهمتر از آن، برای تأیید گرم شدن کش:
- یک صفحه از سایت خود را در مرورگر در حالت Incognito باز کنید.
- ابزار توسعهدهندگان را با کلید F12 باز کرده و به تب Network بروید.
- صفحه را رفرش (Reload) کنید.
- روی اولین درخواست (آدرس اصلی صفحه) کلیک کنید. در بخش Headers به دنبال X-LiteSpeed-Cache یا cash control بگردید. اگر مقدار آن hit بود، یعنی اسکریپت خزنده شما کار خود را به درستی انجام داده است!
(مهم : اگر پاسخی مبنی بر hit بودن کش در هدر صفحه پیدا نکردید , لطفا تنظیمات بخش افزونه کش خود را بررسی کنید.
اگر مشکلی وجود نداشت از ارائه دهنده هاست خود درخواست رفع مشکل را انجام دهید.)
نتیجهگیری
محدودیتهای هاست اشتراکی نباید مانع سرعت سایت شما شود. با استفاده از این اسکریپت خزنده و تنظیم یک کرون جاب ساده، شما میتوانید کنترل کامل گرم کردن کش سایت خود را در دست بگیرید و مطمئن شوید که تمام بازدیدکنندگان شما، حتی برای اولین بار، با سریعترین نسخه از سایتتان روبرو میشوند.
آیا شما هم از این اسکریپت استفاده کردید؟ تجربیات یا سوالات خود را در بخش نظرات با ما به اشتراک بگذارید!
ارادتمند , تولید شده در استودیو گروه نرم افزاری وبلایزر.

















