← جميع المقالات >
magento 2cachingvarnishredisfull-page cacheperformance optimizatione-commerce

استراتيجيات التخزين المؤقت في Magento 2: دليل كامل (2026)

Share: LinkedIn X Facebook

التخزين المؤقت هو الرافعة الأكثر تأثيرًا على الأداء في Magento 2. مكدس تخزين مؤقت مهيأ بشكل صحيح يقدم الصفحات في أجزاء من الألف من الثانية، ويقلل حمل الخادم بنسبة 90%+، ويحسن بشكل كبير درجات Core Web Vitals. يغطي هذا الدليل بنية التخزين المؤقت الكاملة — التخزين المؤقت المدمج في Magento وتخزين الصفحات الكامل (FPC) و Varnish و Redis ووسم التخزين المؤقت والمحتوى الخاص و hole punching — مع تكوينات الإنتاج ونصائح الضبط.

باختصار: Magento 2 لديه بنية تخزين مؤقت متعددة الطبقات: تخزين مؤقت للتكوين (ملفات أو Redis)، تخزين مؤقت للصفحات الكاملة (مدمج أو Varnish)، وتخزين مؤقت على مستوى التطبيق (HTML الكتل، التخطيط، الترجمات، إلخ). كل طبقة تخدم غرضًا مختلفًا وتحتاج إلى تكوين محدد لتعمل بكفاءة في الإنتاج.

جدول المحتويات

  1. نظرة عامة على بنية التخزين المؤقت في Magento 2
  2. التخزين المؤقت للتكوين والتطبيق (cache.xml)
  3. تخزين الصفحات الكامل: مدمج vs Varnish
  4. تكوين Varnish لـ Magento 2
  5. Redis كخلفية للجلسات والتخزين المؤقت
  6. وسم التخزين المؤقت والإبطال
  7. المحتوى الخاص و hole punching
  8. المفهرسات المتعلقة بالتخزين المؤقت وتأثيرها
  9. مزالق التخزين المؤقت الشائعة في الإنتاج
  10. الأسئلة الشائعة

نظرة عامة على بنية التخزين المؤقت في Magento 2

يستخدم Magento 2 نظام تخزين مؤقت متعدد الطبقات:

                     ┌─────────────────────────┐
                     │  Varnish (أو FPC مدمج)  │
                     │  تخزين HTML الصفحات الكامل │
                     └─────────────────────────┘
                                │
                     ┌─────────────────────────┐
                     │  Redis (config/default)  │
                     │  جلسات، بيانات تخزين مؤقت│
                     └─────────────────────────┘
                                │
                     ┌─────────────────────────┐
                     │  تخزين مؤقت بنظام الملفات│
                     │  ملفات مولدة، محتوى ثابت │
                     └─────────────────────────┘

كل طبقة لها استراتيجية التخزين المؤقت الخاصة بها و TTL وآلية الإبطال. طلب الصفحة يتحقق عادة من Varnish أولاً (يخدم HTML المخزن مؤقتًا في ميكروثانية)، ثم ينتقل إلى Magento (يتحقق من التخزين المؤقت المدعوم بـ Redis)، وأخيرًا إلى قاعدة البيانات كخيار أخير.

التخزين المؤقت للتكوين والتطبيق (cache.xml)

Magento يحدد أنواع التخزين المؤقت في app/etc/di.xml ويمكن للوحدات الإعلان عن تخزين مؤقت مخصص عبر etc/cache.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Cache/etc/cache.xsd">
    <type name="my_custom_cache" translate="label,description">
        <label>التخزين المؤقت المخصص</label>
        <description>يخزن البيانات المحسوبة مسبقًا للميزات المخصصة</description>
    </type>
</config>

يمكنك إدارة جميع أنواع التخزين المؤقت من CLI:

# عرض جميع أنواع التخزين المؤقت وحالتها
bin/magento cache:status

# تفعيل/تعطيل أنواع محددة
bin/magento cache:enable block_html layout
bin/magento cache:disable full_page

# تنظيف أنواع تخزين مؤقت محددة
bin/magento cache:clean config layout block_html

# مسح جميع مخازن التخزين المؤقت (Redis + نظام الملفات)
bin/magento cache:flush

أهم أنواع التخزين المؤقت للأداء:

نوع التخزين المؤقتما يخزنهالتأثير إذا عُطّل
configتكوين XML المدمج من جميع الوحداتكل طلب يعيد قراءة ودمج XML
layouthandles التخطيط و XML المترجمةكل طلب يعيد ترجمة التخطيط
block_htmlمخرجات الكتل المقدمة (فرعية لـ FPC)FPC يعمل لكن الكتل الداخلية تعاد تقديمها
full_pageصفحات HTML كاملة التقديمكل طلب هو تحميل Magento كامل
translateقواميس الترجمةالترجمات تحمل من الملفات عند كل طلب

تخزين الصفحات الكامل: مدمج vs Varnish

Magento 2 يأتي مع تطبيقين لـ FPC.

FPC مدمج (Magento_PageCache): يخزن HTML المخزن مؤقتًا في الخلفية الافتراضية للتخزين المؤقت (عادة Redis). جيد للإعدادات أحادية الخادم أو البيئات التي لا يتوفر فيها Varnish (الاستضافة المشتركة، بعض منصات PaaS). الأداء مقبول لكنه ليس مثاليًا.

Varnish: مسرع HTTP يخدم الصفحات المخزنة مؤقتًا قبل وصولها إلى Magento. إنه أسرع لأنه يعمل على مستوى HTTP — لا تنفيذ PHP ولا تحميل إطار العمل. Adobe توصي رسميًا بـ Varnish للإنتاج.

التبديل بينهما في app/etc/env.php:

'http_cache_hosts' => [
    [
        'host' => '127.0.0.1',
        'port' => '80',
    ]
],

عند تكوين مضيفي Varnish، يقوم Magento بتعطيل FPC المدمج ويرسل رؤوس Cache-Control ليقوم Varnish بتفسيرها.

تكوين Varnish لـ Magento 2

Magento يولد VCL Varnish لك:

bin/magento varnish:vcl:generate --export-version=7 > default.vcl

إعدادات Varnish الرئيسية لـ Magento:

vcl 4.1;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # لا تخزن أبدًا صفحات المشرف أو الدفع أو العميل
    if (req.url ~ "^/(admin|customer|checkout|sales)") {
        return (pass);
    }

    # مسح عند تنظيف التخزين المؤقت
    if (req.method == "PURGE") {
        if (client.ip ~ purge_acl) {
            return (purge);
        }
        return (synth(405));
    }

    # إزالة الكوكيز للمحتوى الثابت
    if (req.url ~ "^/(pub/)?(media|static)/") {
        unset req.http.cookie;
        return (hash);
    }

    # إزالة كوكيز GA قبل البحث في التخزين المؤقت
    if (req.http.cookie) {
        set req.http.cookie = regsuball(req.http.cookie, "__utm[^=]+=[^;]+(; )?", "");
        if (req.http.cookie == "") {
            unset req.http.cookie;
        }
    }

    return (hash);
}

راقب معدل إصابة التخزين المؤقت باستخدام varnishstat. متجر Magento 2 مهيأ جيدًا يجب أن يحقق معدل إصابة تخزين مؤقت 90–95%.

Redis كخلفية للجلسات والتخزين المؤقت

Redis هو الخلفية الموصى بها للتخزين المؤقت والجلسات لمتاجر Magento 2 في الإنتاج. قم بتكوينه في app/etc/env.php:

'session' => [
    'save' => 'redis',
    'redis' => [
        'host' => '127.0.0.1',
        'port' => '6379',
        'database' => 0
    ]
],
'cache' => [
    'frontend' => [
        'default' => [
            'backend' => 'Cm_Cache_Backend_Redis',
            'backend_options' => [
                'server' => '127.0.0.1',
                'port' => '6379',
                'database' => 1
            ]
        ],
        'page_cache' => [
            'backend' => 'Cm_Cache_Backend_Redis',
            'backend_options' => [
                'server' => '127.0.0.1',
                'port' => '6379',
                'database' => 2,
                'compress_data' => '1'
            ]
        ]
    ]
]

فصل قواعد البيانات أمر بالغ الأهمية — الجلسات (0) والتخزين المؤقت الافتراضي (1) وتخزين الصفحات (2) يجب ألا تشارك نفس قاعدة بيانات Redis أبدًا. خلفية تخزين الصفحات تستفيد من الضغط (compress_data: 1) لأنها تخزن كتل HTML كاملة.

وسم التخزين المؤقت والإبطال

يستخدم Magento 2 نظام وسم تخزين مؤقت متطور. كل جزء من المحتوى المخزن مؤقتًا — HTML الكتل، الصفحات الكاملة، مخرجات التخطيط — موسوم بمعرفات تصف ما يعتمد عليه:

  • صفحة فئة موسومة بـ cat_c_{category_id}
  • صفحة منتج موسومة بـ cat_p_{product_id}
  • HTML الكتل موسومة بكلاس الكتلة والقالب الخاص بها

عند حفظ منتج أو فئة، Magento يمسح فقط التخزين المؤقت الموسوم بمعرف تلك الكيان — ليس مخزن التخزين المؤقت بأكمله. لهذا cache:clean المحدد بالوسم أسرع من cache:flush.

يمكنك توسيع وسم التخزين المؤقت في الوحدات المخصصة:

$cacheKey = 'my_module_data_' . $id;
$tags = ['my_module', 'my_module_' . $id];
$this->cache->save($data, $cacheKey, $tags);

ثم الإبطال بالوسم:

$this->cache->clean(\Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG, ['my_module_42']);

المحتوى الخاص و hole punching

الصفحات المقدمة من FPC لا يمكن أن تحتوي على محتوى خاص بالعميل — نفس HTML المخزن مؤقتًا يجب أن يكون مناسبًا لجميع الزوار. Magento يحل هذه المشكلة بـ المحتوى الخاص و hole punching.

المحتوى الخاص يتم تحميله بشكل غير متزامن عبر AJAX بعد تحميل الصفحة. بيانات العميل (عناصر السلة، قائمة الرغبات، منتجات المقارنة) تُجلب من /customer/section/load وتُحقن في DOM بواسطة Magento_Customer/js/section-config و Magento_Customer/js/customer-data.

hole punching يتم التعامل معه تلقائيًا بواسطة علامة $_isScopePrivate في Magento. الكتل المحددة كخاصة تُستبعد من FPC وتُقدم ديناميكيًا:

protected $_isScopePrivate = true;

أقسام العميل في etc/sections.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="checkout/cart/add">
        <section name="cart"/>
    </action>
</config>

هذا يخبر Magento بتحديث قسم العميل cart بعد إضافة منتج — مما يضمن تحديث مصغر السلة دون إبطال تخزين الصفحات الكامل.

المفهرسات المتعلقة بالتخزين المؤقت وتأثيرها

المفهرسات والتخزين المؤقت مرتبطان ارتباطًا وثيقًا. المفهرسات تحسب البيانات مسبقًا التي تخزنها طبقة التخزين المؤقت للاسترجاع السريع:

المفهرسعلاقته بالتخزين المؤقتالتأثير
catalog_product_priceتخزين أسعار المنتجات يعتمد على هذافهرس قديم → أسعار خاطئة مخزنة
catalog_category_productتخزين صفحات الفئات يعتمد على الفهرسفهرس قديم → منتجات مفقودة في الصفحات المخزنة
catalogsearch_fulltextتخزين نتائج البحثفهرس قديم → نتائج بحث قديمة

عند تشغيل المفهرس (عبر bin/magento indexer:reindex)، يتم إبطال وسوم التخزين المؤقت المرتبطة تلقائيًا. لهذا تؤدي إعادة الفهرسة إلى تنظيف التخزين المؤقت — ولكن فقط للكيان المتأثر، وليس مجموعة التخزين المؤقت بأكملها.

مزالق التخزين المؤقت الشائعة في الإنتاج

  1. عدم فصل قواعد بيانات Redis. الجلسات والتخزين المؤقت الافتراضي وتخزين الصفحات على نفس قاعدة بيانات Redis يسبب ضغط إخلاء وخلط البيانات.

  2. Varnish بدون فحوصات صحة مناسبة. إذا تعطل خلفية Magento، يجب على Varnish تقديم محتوى قديم بدلاً من إرجاع أخطاء. قم بتكوين وضع grace في VCL.

  3. الإبطال المفرط. الوحدات التي تمسح جميع التخزين المؤقت بدلاً من استخدام التنظيف المستهدف بالوسم تقلل معدلات إصابة التخزين المؤقت بشكل كبير.

  4. تعطيل التخزين المؤقت أثناء التطوير ونسيان إعادة التفعيل. متجر يعمل مع تعطيل التخزين المؤقت في الإنتاج سيكون أبطأ 10-50 مرة.

  5. تقديم بيانات العميل من FPC. لا تضع علامة على الكتل كغير خاصة إذا كانت تحتوي على بيانات خاصة بالمستخدم — هذا يخزن بيانات عميل واحد ويقدمها لآخرين.

  6. تجاهل إخلاء خلفية التخزين المؤقت. راقب maxmemory و evicted_keys في Redis. إذا نفدت ذاكرة Redis، فإنه يخلّي إدخالات التخزين المؤقت (بما في ذلك الجلسات النشطة).

الأسئلة الشائعة

س: ما هو أسرع تكوين تخزين مؤقت لـ Magento 2؟
Varnish كـ FPC مع Redis للجلسات والتخزين المؤقت الافتراضي وتخزين الصفحات. قواعد بيانات Redis منفصلة لكل منها. قاعدة البيانات 0 للجلسات و 1 للتخزين المؤقت الافتراضي و 2 لتخزين الصفحات.

س: كيف أتحقق من معدل إصابة تخزين Varnish المؤقت في الإنتاج؟
شغّل varnishstat -1 -f MAIN.cache_hit,MAIN.cache_miss. معدل إصابة أقل من 85% يشير إلى تكوين خاطئ.

س: هل Redis يحتفظ ببيانات التخزين المؤقت عبر إعادة التشغيل؟
فقط إذا تم تكوينه بتوجيهات save (لقطات RDB) أو استمرارية AOF. افتراضيًا، بيانات تخزين Redis المؤقتة مؤقتة وتنجو من إعادة التشغيل فقط إذا تم تفعيل الاستمرارية.

س: هل يجب استخدام cache:clean أم cache:flush في النشر؟
cache:clean أكثر أمانًا — يمسح فقط إدخالات التخزين المؤقت الملغاة. cache:flush يزيل كل شيء بما في ذلك الإدخالات الصالحة، مسببًا تخزينًا مؤقتًا باردًا وطلبات أولية بطيئة بعد النشر.

س: كيف أكتشف أي وسم تخزين مؤقت يتم إبطاله؟
فعّل تسجيل تصحيح التخزين المؤقت في app/etc/di.xml أو استخدم أداة مراقبة مثل New Relic لتتبع أنماط إبطال التخزين المؤقت.


هل تحتاج إلى مساعدة عملية في ضبط مكدس التخزين المؤقت لـ Magento 2؟ اطلع على خدمة تحسين الأداء و خدمة تحسين VPS . اقرأ أيضًا عن مفهرسات Magento 2 و Core Web Vitals للصورة الكاملة للأداء.