اسکریپت خزنده کش لایت اسپید با PHP برای افزایش سرعت سایت وردپرسی

اسکریپت خزنده کش: راه حل قطعی برای هاست اشتراکی

آنچه در این مقاله میخوانید :

آیا تا به حال به عنوان اولین بازدیدکننده وارد صفحه‌ای از سایت خود شده‌اید و با کندی ناامیدکننده آن مواجه شده‌اید؟ این تجربه‌ی مشترک بسیاری از مدیران سایت‌های وردپرسی است. دلیل این کندی، پدیده‌ای به نام “Cache Miss” یا “عدم وجود کش” است. وقتی صفحه‌ای برای اولین بار بازدید می‌شود، سرور باید تمام پردازش‌ها را از صفر انجام دهد تا آن را برای شما آماده کند. اما بازدیدهای بعدی بسیار سریع‌تر هستند، چون از نسخه کش شده استفاده می‌کنند.

به طور کلی ساز و کار افزونه های کشینگ را میتوان به این گونه معرفی کرد:(ذخیره یک نسخه از درخواست در سرور یا مرورگر تا برای باز خوانی بعدی همان درخواست نیاز به صرف زمان کمتری باشد).بدیهی است که تا زمانی که درخواستی شکل نگیرد کش کردن هم اتفاق نمی افتد.برای اجرای درخواست ها به صورت منظم نیاز به یک خزنده داریم.

افزونه فوق‌العاده LiteSpeed Cache یک خزنده داخلی برای حل این مشکل دارد، اما در بسیاری از هاست‌های اشتراکی، این خزنده با محدودیت‌های شدیدی از نظر منابع (CPU و تعداد اجرا) مواجه است یا به صورت کلی غیر فعال شده است. نتیجه؟ بسیاری از صفحات سایت شما هرگز کش نمی‌شوند و اولین بازدیدکنندگان، کندی را تجربه می‌کنند.

اما نگران نباشید! در این راهنمای جامع، ما یک اسکریپت خزنده کش  قدرتمند و رایگان که با PHP نوشته شده را در اختیار شما قرار می‌دهیم. این اسکریپت بدون هیچ محدودیتی، تمام صفحات سایت شما را پیدا کرده و کش آن‌ها را همیشه گرم نگه می‌دارد.

چرا "گرم کردن کش" برای سایت شما حیاتی است؟

وقتی افزونه LiteSpeed Cache فعال است، هر صفحه می‌تواند دو وضعیت داشته باشد که در هدر آن مشخص می‌شود:

  1. X-LiteSpeed-Cache: miss: یعنی این صفحه در کش وجود نداشت و سرور مجبور شد آن را از نو برای شما بسازد (بازدید کند).
  2. X-LiteSpeed-Cache: hit: یعنی این صفحه از قبل در کش موجود بود و سرور آن را به صورت آنی و بدون هیچ پردازشی به شما تحویل داد (بازدید سریع).

هدف ما این است که تمام صفحات سایت برای همه بازدیدکنندگان وضعیت hit را داشته باشند. یک سایت ۱۰۰٪ کش شده نه تنها تجربه کاربری فوق‌العاده‌ای ایجاد می‌کند، بلکه با افزایش چشمگیر سرعت بارگذاری، امتیاز Core Web Vitals شما در گوگل را نیز بهبود می‌بخشد که یک فاکتور مهم در سئو است. اسکریپت خزنده کش ساخته شده توسط ما دقیقاً همین کار را برای شما انجام می‌دهد.

این اسکریپت برای بارگذاری نیاز به وب سرور خاصی ندارد و روی تمامی وب سرور هایی که قابلیت کش رو آنها فعال باشد , عملکرد مناسب و کاملی را ارائه میدهد

اینفوگرافیک تفاوت بین کش هیت (سرور سریع) و کش میس (سرور کند) در لایت اسپید

معرفی اسکریپت خزنده PHP سفارشی ما: یک جایگزین بی‌نقص

این اسکریپت ساده اما قدرتمند، تمام محدودیت‌های خزنده پیش‌فرض را دور می‌زند. برخی از ویژگی‌های کلیدی آن عبارت‌اند از:

  • مبتنی بر سایت‌مپ (Sitemap): تمام لینک‌های موجود در سایت‌مپ شما را، از نوشته‌ها و برگه‌ها گرفته تا محصولات و دسته‌بندی‌ها، پیدا می‌کند.

  • پردازش دسته‌ای (Batch Processing): برای جلوگیری از تایم‌اوت شدن در هاست‌های اشتراکی، لینک‌ها را در دسته‌های کوچک پردازش می‌کند.

  • قابلیت توقف و اجرای مجدد (Resumable): با ذخیره وضعیت در یک فایل، اگر اسکریپت متوقف شود، از همان‌جایی که مانده بود ادامه می‌دهد.

  • فشار بسیار کم روی سرور: با تأخیر قابل تنظیم بین درخواست‌ها، منابع هاست شما را اشغال نمی‌کند.

  • سازگاری بالا: روی تمام وب‌سرورهایی که از PHP و cURL پشتیبانی می‌کنند (تقریباً تمام هاست‌ها) به خوبی کار می‌کند.

کد کامل اسکریپت خزنده کش

				
					<?php
// =============================================================================
// == 🚀 Cache Warmer Script - by Webalizer.ir ==
// =============================================================================

// --- تنظیمات اولیه سرور ---
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
ini_set('memory_limit', '512M'); // افزایش حافظه برای سایت‌های بزرگ
set_time_limit(300); // افزایش زمان اجرا به ۵ دقیقه

// --- ثابت‌ها و تنظیمات اصلی خزنده ---
define('SITEMAP_INDEX', "https://YOUR_WEBSITE.com/sitemap_index.xml"); // ← آدرس سایت‌مپ اصلی خود را وارد کنید
define('USER_AGENT', "webalizerCrawler"); 
define('DELAY_SECONDS', 3);      // تاخیر بین هر درخواست (برای جلوگیری از فشار به سرور)
define('BATCH_SIZE', 20);       // تعداد لینک‌هایی که در هر بار اجرا خزش می‌شوند
define('PROGRESS_FILE', __DIR__ . "/crawl_progress.json"); // فایل ذخیره وضعیت
define('REPORT_FILE', __DIR__ . "/crawl_report.html");    // فایل گزارش نهایی

// بررسی روش اجرا: توصیه به استفاده از خط فرمان (CLI) برای Cron Job
if (php_sapi_name() !== 'cli') {
    echo "<p style='background: #fff3cd; border: 1px solid #ffeeba; padding: 15px; font-family: tahoma; direction: rtl;'>
    <strong>⚠️ هشدار:</strong> برای جلوگیری از مشکل محدودیت زمان اجرا در سایت‌های بزرگ، بهتر است این اسکریپت از طریق Cron Job و با استفاده از PHP CLI اجرا شود.
    </p>";
}


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 "<h2>🚀 در حال آماده‌سازی لیست لینک‌ها از سایت‌مپ...</h2>";
    
    // دریافت سایت‌مپ اصلی
    $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 "<p>در حال پردازش: $sitemapUrl</p>";
        $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 "<h3>🔍 تعداد کل لینک‌های منحصر به فرد یافت شده: " . count($allUrls) . "</h3>";
}


echo "<h2>🧭 در حال خزش دسته‌ای لینک‌ها...</h2>";
list($success, $failed) = crawlBatch($progress);

echo "<p style='color:green;'>✅ تعداد لینک‌های با موفقیت خزش شده در این مرحله: " . count($success) . "</p>";
echo "<p style='color:red;'>❌ تعداد لینک‌های ناموفق در این مرحله: " . count($failed) . "</p>";
echo "<p style='color:blue;'>⏳ تعداد کل لینک‌های باقی‌مانده: " . count($progress["pending"]) . "</p>";


$reportHTML = "<!DOCTYPE html><html dir='rtl' lang='fa-IR'><head><meta charset='UTF-8'><title>گزارش خزیدن سایت</title>
</head><body>
<h1>📊 گزارش مرحله‌ای خزنده سایت</h1>";

if (!empty($success)) {
    $reportHTML .= "<h3>✅ لینک‌های موفق</h3><table><tr><th>ردیف</th><th>آدرس URL</th><th>کد وضعیت</th></tr>";
    foreach ($success as $i => $item) {
        $reportHTML .= "<tr class='success'><td>" . ($i + 1) . "</td><td><a href='{$item['url']}' target='_blank'>{$item['url']}</a></td><td>{$item['status']}</td></tr>";
    }
    $reportHTML .= "</table>";
}

if (!empty($failed)) {
    $reportHTML .= "<h3>❌ لینک‌های ناموفق</h3><table><tr><th>ردیف</th><th>آدرس URL</th><th>کد وضعیت</th></tr>";
    foreach ($failed as $i => $item) {
        $reportHTML .= "<tr class='failed'><td>" . ($i + 1) . "</td><td><a href='{$item['url']}' target='_blank'>{$item['url']}</a></td><td>{$item['status']}</td></tr>";
    }
    $reportHTML .= "</table>";
}

$reportHTML .= "<script data-no-optimize="1">window.lazyLoadOptions=Object.assign({},{threshold:300},window.lazyLoadOptions||{});!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function o(t){return e({},at,t)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,vt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,vt,e)}function i(t){return s(t,null),0}function r(t){return null===c(t)}function u(t){return c(t)===_t}function d(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function f(t,e){et?t.classList.add(e):t.className+=(t.className?" ":"")+e}function _(t,e){et?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function v(t,e){!e||(e=e._observer)&&e.unobserve(t)}function b(t,e){t&&(t.loadingCount+=e)}function p(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function h(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function m(t){return!!t[lt]}function E(t){return t[lt]}function I(t){return delete t[lt]}function y(e,t){var n;m(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[lt]=n)}function L(a,t){var o;m(a)&&(o=E(a),t.forEach(function(t){var e,n;e=a,(t=o[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function k(t,e,n){f(t,e.class_loading),s(t,st),n&&(b(n,1),d(e.callback_loading,t,n))}function A(t,e,n){n&&t.setAttribute(e,n)}function O(t,e){A(t,rt,l(t,e.data_sizes)),A(t,it,l(t,e.data_srcset)),A(t,ot,l(t,e.data_src))}function w(t,e,n){var a=l(t,e.data_bg_multi),o=l(t,e.data_bg_multi_hidpi);(a=nt&&o?o:a)&&(t.style.backgroundImage=a,n=n,f(t=t,(e=e).class_applied),s(t,dt),n&&(e.unobserve_completed&&v(t,e),d(e.callback_applied,t,n)))}function x(t,e){!e||0<e.loadingCount||0<e.toLoadCount||d(t.callback_finish,e)}function M(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function N(t){return!!t.llEvLisnrs}function z(t){if(N(t)){var e,n,a=t.llEvLisnrs;for(e in a){var o=a[e];n=e,o=o,t.removeEventListener(n,o)}delete t.llEvLisnrs}}function C(t,e,n){var a;delete t.llTempImage,b(n,-1),(a=n)&&--a.toLoadCount,_(t,e.class_loading),e.unobserve_completed&&v(t,n)}function R(i,r,c){var l=g(i)||i;N(l)||function(t,e,n){N(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";M(t,a,e),M(t,"error",n)}(l,function(t){var e,n,a,o;n=r,a=c,o=u(e=i),C(e,n,a),f(e,n.class_loaded),s(e,ut),d(n.callback_loaded,e,a),o||x(n,a),z(l)},function(t){var e,n,a,o;n=r,a=c,o=u(e=i),C(e,n,a),f(e,n.class_error),s(e,ft),d(n.callback_error,e,a),o||x(n,a),z(l)})}function T(t,e,n){var a,o,i,r,c;t.llTempImage=document.createElement("IMG"),R(t,e,n),m(c=t)||(c[lt]={backgroundImage:c.style.backgroundImage}),i=n,r=l(a=t,(o=e).data_bg),c=l(a,o.data_bg_hidpi),(r=nt&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),k(a,o,i)),w(t,e,n)}function G(t,e,n){var a;R(t,e,n),a=e,e=n,(t=Et[(n=t).tagName])&&(t(n,a),k(n,a,e))}function D(t,e,n){var a;a=t,(-1<It.indexOf(a.tagName)?G:T)(t,e,n)}function S(t,e,n){var a;t.setAttribute("loading","lazy"),R(t,e,n),a=e,(e=Et[(n=t).tagName])&&e(n,a),s(t,_t)}function V(t){t.removeAttribute(ot),t.removeAttribute(it),t.removeAttribute(rt)}function j(t){h(t,function(t){L(t,mt)}),L(t,mt)}function F(t){var e;(e=yt[t.tagName])?e(t):m(e=t)&&(t=E(e),e.style.backgroundImage=t.backgroundImage)}function P(t,e){var n;F(t),n=e,r(e=t)||u(e)||(_(e,n.class_entered),_(e,n.class_exited),_(e,n.class_applied),_(e,n.class_loading),_(e,n.class_loaded),_(e,n.class_error)),i(t),I(t)}function U(t,e,n,a){var o;n.cancel_on_exit&&(c(t)!==st||"IMG"===t.tagName&&(z(t),h(o=t,function(t){V(t)}),V(o),j(t),_(t,n.class_loading),b(a,-1),i(t),d(n.callback_cancel,t,e,a)))}function $(t,e,n,a){var o,i,r=(i=t,0<=bt.indexOf(c(i)));s(t,"entered"),f(t,n.class_entered),_(t,n.class_exited),o=t,i=a,n.unobserve_entered&&v(o,i),d(n.callback_enter,t,e,a),r||D(t,n,a)}function q(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function H(t,o,i){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?$(t.target,t,o,i):(e=t.target,n=t,a=o,t=i,void(r(e)||(f(e,a.class_exited),U(e,n,a,t),d(a.callback_exit,e,n,t))));var e,n,a})}function B(e,n){var t;tt&&!q(e)&&(n._observer=new IntersectionObserver(function(t){H(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function J(t){return Array.prototype.slice.call(t)}function K(t){return t.container.querySelectorAll(t.elements_selector)}function Q(t){return c(t)===ft}function W(t,e){return e=t||K(e),J(e).filter(r)}function X(e,t){var n;(n=K(e),J(n).filter(Q)).forEach(function(t){_(t,e.class_error),i(t)}),t.update()}function t(t,e){var n,a,t=o(t);this._settings=t,this.loadingCount=0,B(t,this),n=t,a=this,Y&&window.addEventListener("online",function(){X(n,a)}),this.update(e)}var Y="undefined"!=typeof window,Z=Y&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),tt=Y&&"IntersectionObserver"in window,et=Y&&"classList"in document.createElement("p"),nt=Y&&1<window.devicePixelRatio,at={elements_selector:".lazy",container:Z||Y?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",it="srcset",rt="sizes",ct="poster",lt="llOriginalAttrs",st="loading",ut="loaded",dt="applied",ft="error",_t="native",gt="data-",vt="ll-status",bt=[st,ut,dt,ft],pt=[ot],ht=[ot,ct],mt=[ot,it,rt],Et={IMG:function(t,e){h(t,function(t){y(t,mt),O(t,e)}),y(t,mt),O(t,e)},IFRAME:function(t,e){y(t,pt),A(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){y(t,pt),A(t,ot,l(t,e.data_src))}),y(t,ht),A(t,ct,l(t,e.data_poster)),A(t,ot,l(t,e.data_src)),t.load()}},It=["IMG","IFRAME","VIDEO"],yt={IMG:j,IFRAME:function(t){L(t,pt)},VIDEO:function(t){a(t,function(t){L(t,pt)}),L(t,ht),t.load()}},Lt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,o=this._settings,i=W(t,o);{if(p(this,i.length),!Z&&tt)return q(o)?(e=o,n=this,i.forEach(function(t){-1!==Lt.indexOf(t.tagName)&&S(t,e,n)}),void p(n,0)):(t=this._observer,o=i,t.disconnect(),a=t,void o.forEach(function(t){a.observe(t)}));this.loadAll(i)}},destroy:function(){this._observer&&this._observer.disconnect(),K(this._settings).forEach(function(t){I(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;W(t,n).forEach(function(t){v(t,e),D(t,n,e)})},restoreAll:function(){var e=this._settings;K(e).forEach(function(t){P(t,e)})}},t.load=function(t,e){e=o(e);D(t,e)},t.resetStatus=function(t){i(t)},t}),function(t,e){"use strict";function n(){e.body.classList.add("litespeed_lazyloaded")}function a(){console.log("[LiteSpeed] Start Lazy Load"),o=new LazyLoad(Object.assign({},t.lazyLoadOptions||{},{elements_selector:"[data-lazyloaded]",callback_finish:n})),i=function(){o.update()},t.MutationObserver&&new MutationObserver(i).observe(e.documentElement,{childList:!0,subtree:!0,attributes:!0})}var o,i;t.addEventListener?t.addEventListener("load",a,!1):t.attachEvent("onload",a)}(window,document);</script></body></html>";
file_put_contents(REPORT_FILE, $reportHTML);
echo "<p>📁 گزارش کامل این مرحله در فایل ذخیره شد: <a href='crawl_report.html' target='_blank'>مشاهده گزارش</a></p>";


if (empty($progress["pending"])) {
    echo "<h1>🎉 تمام لینک‌ها با موفقیت خزش شدند!</h1>";
    // حذف فایل وضعیت پس از اتمام کامل کار
    unlink(PROGRESS_FILE);
} else {
    echo "<h4>برای ادامه، این اسکریپت را مجدداً اجرا کنید (یا منتظر اجرای بعدی Cron Job بمانید).</h4>";
}
?>
				
			

راهنمای راه‌اندازی قدم به قدم

  1. ابتدا وارد هاست خود شوید.
  2. در قسمت روت خود یک پوشه با نام crawler ایجاد کنید.(توجه :اگر دانش کد نویسی ندارید تا کد های خزنده را با محل ذخیره سازی خود هماهنگ کنید مطابق دستورات راه اندازی که در این بخش گفته میشود , فایل هارا بسازید. این پوشه باید در قسمت root هاست همان جایی که فایل wpconfig.php وجود دارد بارگذاری شود.)
  3. داخل این پوشه باید فایلی با نام crawler.php ایجاد کنید.
  4. کدهای بالا را کپی کرده و در فایل وارد کنید .قبل از ذخیره کردن این فایل باید ادرس سایت مپ خود را در خط 14 جایگزین کنید
  5. مهم: ادرس نهایی فایل باید به این روش قابل دسترسی باشد:
    ourdomain.com/
    crawler/
    crawler.php
آموزش تصویری تنظیم کرون جاب در سی‌پنل برای اسکریپت خزنده کش

تنظیم کرون جاب (Cron Job)

این مهم‌ترین مرحله برای خودکارسازی فرآیند است. ما از کرون جاب استفاده می‌کنیم تا سرور به صورت خودکار در بازه‌های زمانی مشخص، اسکریپت خزنده کش لایت اسپید ما را اجرا کند.

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

چگونه از عملکرد صحیح خزنده مطمئن شویم؟

پس از اجرای کرون جاب، می‌توانید به پوشه‌ای که اسکریپت را در آن آپلود کرده‌اید سر بزنید. باید دو فایل جدید ایجاد شده باشد: crawl_progress.json (برای پیگیری وضعیت) و crawl_report.html (برای مشاهده گزارش).

(توجه: اگر این فایل ها وجود نداشت نسبت به تنظیمات قابل مشاهده بودن فایل های حساس در هاست اقدام فرمایید.)

مهم‌تر از آن، برای تأیید گرم شدن کش:

  1. یک صفحه از سایت خود را در مرورگر در حالت Incognito باز کنید.
  2. ابزار توسعه‌دهندگان را با کلید F12 باز کرده و به تب Network بروید.
  3. صفحه را رفرش (Reload) کنید.
  4. روی اولین درخواست (آدرس اصلی صفحه) کلیک کنید. در بخش Headers به دنبال X-LiteSpeed-Cache یا cash control بگردید. اگر مقدار آن hit بود، یعنی اسکریپت خزنده شما کار خود را به درستی انجام داده است!
    (مهم : اگر پاسخی مبنی بر hit بودن کش در هدر  صفحه پیدا نکردید , لطفا تنظیمات بخش افزونه کش خود را بررسی کنید.
    اگر مشکلی وجود نداشت از ارائه دهنده هاست خود درخواست رفع مشکل را انجام دهید.)

نتیجه‌گیری

محدودیت‌های هاست اشتراکی نباید مانع سرعت سایت شما شود. با استفاده از این اسکریپت خزنده و تنظیم یک کرون جاب ساده، شما می‌توانید کنترل کامل گرم کردن کش سایت خود را در دست بگیرید و مطمئن شوید که تمام بازدیدکنندگان شما، حتی برای اولین بار، با سریع‌ترین نسخه از سایتتان روبرو می‌شوند.

آیا شما هم از این اسکریپت استفاده کردید؟ تجربیات یا سوالات خود را در بخش نظرات با ما به اشتراک بگذارید!

ارادتمند , تولید شده در استودیو گروه نرم افزاری وبلایزر.

100%تخفیف رو از دست نده
افزونه prefmatters ورژن 2.5.2

رایگان

افزونه مداد زرد نسخه 7.6.7

رایگان

قالب فروشگاهی فلت سام – رایگان

رایگان

قالب فروشگاهی وودمارت – رایگان

رایگان

افزونه چند زبانه کردن سایت – رایگان

رایگان

افزونه چند فروشندگی دکان پرو – رایگان

رایگان

افزونه بهینه سازی سرعت سایت wp rocket – رایگان

رایگان

افزونه لینک سازی داخلی interlink manager – رایگان

رایگان

افزونه یواست سئو پرمیوم – رایگان

رایگان

افزونه رنک مث سئو پرو

رایگان

افزونه اسلایدر روولوشن

رایگان

افزونه ویژوال کامپوزر

رایگان

افزونه لیر اسلایدر

رایگان

افزونه فرم ساز گرویتی فرم

رایگان

افزودنی آلتیمیت المنتور

رایگان

افزودنی پاور پک المنتور

رایگان

افزونه المنتور پرو

رایگان

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

[gravityform id=”3″ title=”true”]

نام و نام خانوداگی
شماره تماس*
تاریخ و زمان
زمانی که توانایی پاسخگویی به تماس ما دارید را مشخص کنید.
تاریخ*
خدمت درخواستی