التخزين المؤقت للكائنات في WordPress: Redis و Memcached وواجهات برمجة التطبيقات الأصلية

نشرت: 2017-11-04

تحتاج مواقع WordPress الخاصة بالمؤسسات التي يمكن توسيع نطاقها حسب الرغبة إلى آلية تخزين مؤقت دائم تتجاوز الصفحات والصور ، وهي آلية يمكنها تخزين كائنات PHP الفعلية مؤقتًا. على الرغم من أن WordPress يوفر آلية للتخزين المؤقت للكائن من خلال ذاكرة التخزين المؤقت للكائنات في WordPress ، إلا أن هناك حلولًا أخرى توفر قوة ونفوذًا كبيرين. قبل أن ندخل في كل ذلك ، نحتاج أولاً إلى معرفة ما هو التخزين المؤقت للكائن وكيف يعمل في PHP.

ما هو كائن التخزين المؤقت؟

PHP هي لغة موجهة للكائنات. يستخدم نموذج الكائن لهيكلة التعليمات البرمجية. نتيجة لذلك ، يتكون موقع WordPress الخاص بك من العديد من كائنات PHP المختلفة التي يتم إنشاؤها باستمرار وإنشاء مثيل لها وتدميرها (بواسطة مدير الذاكرة). إنشاء العناصر وإتلافها له تكلفة عامة ، خاصة إذا كانت كثيرة. ومع ذلك ، فإن معظم هذه العناصر تميل إلى إعادة استخدامها كثيرًا لأنها تمثل الوظائف الأساسية. هذا يعني أنه في كل مرة يحتاجها التطبيق مرة أخرى ، سيحتاج إلى إنشاء مثيل لها من البداية.

ماذا لو كان بإمكانك تخزين كائن تم إنشاء مثيل له مستخدَمًا بشكل متكرر بحيث لا تحتاج إلى إتلافه وإنشائه طوال الوقت؟

يمكنك استخدام دالة serialise() في PHP لتحويل كائن أو كائن أولي إلى تمثيل رقمي (بايت blob) يمكن تخزينه في الذاكرة أو القرص للوصول إليه لاحقًا. ثم تحسب رقم تجزئة البايت باستخدام دالة hash() وتخزن كلاهما. التجزئة كمفتاح والبايت blob كقيمة. لاستردادها ، يمكنك استخدام رقم التجزئة المحسوب للبايت blob والذي تم تخزينه في البداية كمفتاح. يمكنك تحويل أي شيء (سلسلة ، عدد صحيح ، كائن ، منطقي ، مصفوفة ، إلخ) إلى تمثيل قابل للتخزين لقيمة بهذه الطريقة.

مثال:

$serialized = serialize( array ( 'test' ));

قم بإجراء العملية العكسية ، مع عدم التسلسل ():

$original = unserialize ( $serialized );

بشكل عام ، هناك ثلاث طرق يمكنك من خلالها تخزين الكائنات مؤقتًا: استخدام ذاكرة التخزين المؤقت للكائنات WordPress الأصلية ، أو Transients API ، أو مخزن قيمة مفتاح خارجي مثل Redis أو Memcached.

ووردبريس كائن التخزين المؤقت

يقدم WordPress اثنين من واجهات برمجة تطبيقات التخزين المؤقت للكائنات: ذاكرة التخزين المؤقت للكائنات WordPress الأصلية و Transients API. إنهما متطابقان ، وفي حين أن هذا يمكن أن يسبب التباسًا ، إلا أن هناك منطقًا وراء ذلك.

يمكن لـ WordPress Object Cache الأصلي تخزين الكائنات والأوليات في ذاكرة التخزين المؤقت ، ولكن ليس بطريقة ثابتة افتراضيًا. هذا يعني أن التخزين المؤقت يحدث في الذاكرة ، وأن الكائنات المخزنة مؤقتًا لا تعيش بعد دورة حياة الطلب. لذلك لا يمكنك مشاركة الكائنات المخزنة مؤقتًا عبر عمليات تحميل صفحات مختلفة. تحتاج إلى تزويد تنفيذ متجرك الخاص باستخدام Drop-Ins ، وهي مكونات إضافية "متقدمة" يمكنها توسيع وظائف WordPress. يمكنك رؤيتها على لوحة معلومات WordPress الخاصة بك ، في قائمة المكونات الإضافية:

WordPress Drop-Ins

من ناحية أخرى ، يعمل Transients API خارج الصندوق. يمكنك حفظ المتغيرات والمصفوفات والكائنات المرتبطة بتاريخ انتهاء الصلاحية مباشرة على قاعدة بيانات ولها تخزين مؤقت للكائن الدائم. ومع ذلك ، فإن المشكلة هي أنه عند انتهاء صلاحية الكائنات المخزنة مؤقتًا ، فإنها تظل في قاعدة البيانات تشغل مساحة. هذا يعني أن هناك نفقات إضافية يتم إنفاقها في صيانة قاعدة البيانات ، وتقليم العناصر منتهية الصلاحية مرة واحدة كل فترة.

يكتشف WordPress ما إذا كنت قد نفذت ذاكرة التخزين المؤقت للكائنات الثابتة الخاصة بك ، وعندما يكتشف أن الأمر كذلك ، يتم تجاوز المكالمات إلى Transients API وتوجيهها إلى ذاكرة التخزين المؤقت للكائنات WordPress (وبالتالي سبب كونها متطابقة).

يمكن للمطورين تنفيذ ذاكرة التخزين المؤقت للكائنات الخاصة بهم ، أو استخدام مكون إضافي لبرنامج WordPress (المزيد عن ذلك لاحقًا) أو التنفيذ الخاص بنا ، إذا كان عميل Pressidium. ليس لدينا ذاكرة التخزين المؤقت للكائن قيد التشغيل افتراضيًا ، حيث يمكن أن يتسبب ذلك في عقوبات أداء إذا تم استخدامها في موقف خاطئ. لا يوجد حل "مقاس واحد يناسب الجميع" عندما يتعلق الأمر بالتخزين المؤقت للكائنات في مواقع WordPress.

ريديس وميمكاشد

لا تستخدم مخازن القيمة الرئيسية الجداول وأنواع البيانات المحددة مسبقًا لتخزين المعلومات في سجلات مثل RDBMS. وهي مصممة لتخزين واسترداد أزواج المفتاح / القيمة ، كما هو الحال في هياكل بيانات القاموس التي تجدها في لغات البرمجة.

أحد الأمثلة الرائعة على هذا المتجر هو Redis. بصرف النظر عن هياكل بيانات القاموس ، فهي تدعم عددًا كبيرًا من الهياكل الأخرى ، بما في ذلك المجموعات المتقدمة مثل المجموعات المصنفة مع استعلامات النطاق والفهارس الجغرافية المكانية مع استعلامات نصف القطر. يوفر التخزين المؤقت للكائنات الثابتة .

ريديس

Redis ليس مجرد مخزن ذي قيمة رئيسية أو ذاكرة تخزين مؤقت. وهو يدعم نسخ البيانات ، والبرمجة النصية ، والتوافر العالي في تكوين الكتلة. يمكنك أيضًا ضبط مستوى الثبات على القرص الذي تريده. الشيء الجيد في Redis هو أنه إذا قمت بإعادة التشغيل ، فستظل معظم ذاكرة التخزين المؤقت على القرص ، وستكون البيانات المفقودة جزءًا صغيرًا فقط. الشيء هو أنه عند إعادة التشغيل ، سيتعين على الخادم إعادة إنشاء ذاكرة التخزين المؤقت وهذا يؤدي في معظم الأحيان إلى زيادة الحمل. مع Redis لم يحدث هذا. بالإضافة إلى ذلك ، يتم حذف الكائنات منتهية الصلاحية على الفور من قاعدة البيانات. لا يوجد وقت إضافي للإدارة هناك أيضًا.

لدى Redis Labs صفحة ممتازة تعرض حالات استخدام Redis في المؤسسة: وتتراوح هذه من مجموعات البيانات الكبيرة جدًا إلى البحث عن النص الكامل وسلسلة الوقت الفعلي وتكامل Spark والمزيد.

على الرغم من أن كل هذه الميزات تكلف من حيث التعقيد وربما السرعة في بعض الحالات ، فإن تحسين كود Redis Drop-In الخاص بك يمكن أن يحقق مكاسب قليلة. لا تنس حقيقة أن Redis يقوم بالتخزين المؤقت للكائنات ، وهو أمر لا يفعله Memcached ، على الرغم من أنه أسهل بكثير في الاستخدام.

ميمكاشد

Memcached هو نظام تخزين مؤقت للكائنات عالي الأداء في الذاكرة وفقًا لموقع الويب الرسمي ، وهو مصمم خصيصًا لتسريع تطبيقات الويب الديناميكية وتخفيف حمل قاعدة البيانات. إنه أيضًا أبسط ومباشر للاستخدام من Redis.

نظرًا لكونها مصممة خصيصًا للقيام بالتخزين المؤقت للكائنات لصفحات الويب ، وحقيقة أنها تستخدم قاعدة بيانات في الذاكرة تجعلها أسرع حل للتخزين المؤقت للكائنات. ومع ذلك ، كما ذكرنا سابقًا ، إذا تمت إعادة تشغيل الخادم الخاص بك ، فإن ذاكرة التخزين المؤقت الخاصة بك قد نفدت. وحتى يتم إعادة بنائه ، من المحتمل أن تواجه زيادة في الحمل. ولكن كما يقول المبدعون: "فكر في الأمر كذاكرة قصيرة المدى لموقعك على الويب" ، لذا فهو يعتمد على ما تريد القيام به في المقام الأول.

نظرًا لأن Memcached تستخدم قاعدة بيانات في الذاكرة لحفظ ذاكرة التخزين المؤقت ، فهي فعالة جدًا في التخزين المؤقت لاستعلامات SQL ومخرجات استدعاء الوظيفة وما إلى ذلك.

إضافات ووردبريس

  • WP Redis ، المكون الإضافي الرسمي Redis WordPress. يدعم WP-CLI والتجميع والنسخ المتماثل.
  • Redis Object Cache آخر ملحق Redis للجهة الخلفية لبرنامج WordPress.
  • Memcached Object Cache ، الواجهة الخلفية لـ Memcached.
  • حذف العابرين منتهية الصلاحية ، هذا البرنامج المساعد يحذف كائنات العابرين منتهية الصلاحية من قاعدة البيانات. إنه يدعم المواقع المتعددة أيضًا!

كيفية تنفيذ المعايير

الهدف من مقالتنا هو إثارة حماسك بشأن التخزين المؤقت للكائنات والبدء في الترقيع بنفسك. يمكنك تجربة العديد من تطبيقات ذاكرة التخزين المؤقت المستمرة ومعرفة مدى جودة أداء التطبيق. يمكنك استخدام وظيفة microsecond () PHP لقياس المكالمات. على سبيل المثال: اتصل microsecond() قبل وبعد استدعاء wp_cache_get() ، اطرح القيم وقم بتخزين النتيجة. افعل ذلك للعديد من تطبيقات ذاكرة التخزين المؤقت ، وانظر في الحالات التي تلاحظ فيها زيادة في الأداء.

في Pressidium ، ليس لدينا ميزة التخزين المؤقت للكائنات بشكل افتراضي وعلى الرغم من أن هذا أمر يمكن طلبه ، فإننا لا ننصح به عادةً من البداية. نجري الاختبارات ونتأكد من أن موقعك سيستفيد منها.

استنتاج

لنفترض أنه من أجل عرض صفحة ما ، يحتاج التطبيق إلى قراءة 2000 عنصر عابر. هذا يعني 2000 قراءة في قاعدة البيانات. باستخدام نظام التخزين المؤقت للكائنات الثابتة ، يتم إلغاء تحميل هذه القراءات البالغ عددها 2000 إلى مخزن قيمة المفتاح. إذا كنت تستخدم memcached ، فإنك تخاطر بفقدان كل ذاكرة التخزين المؤقت الخاصة بك في إعادة التشغيل المفاجئة. بشكل عام ، قد لا يكون Redis بنفس سرعة Memcached ولكن ميزات المؤسسة والمثابرة الخاصة به تفيدك على المدى الطويل.

ومع ذلك ، فإن الحجم الواحد لا يناسب الجميع! على سبيل المثال ، رأينا حالات Redis التي أدت في الواقع إلى إبطاء مواقع الويب ، وفي حالات أخرى حيث قاموا بتسريعها بشكل لا يصدق. يتعلق هذا بعدد من الكائنات التي يستخدمها تطبيقك: بشكل عام ، إذا كان التطبيق الخاص بك يستخدم عددًا قليلاً (دعنا نقول العشرات) فلن تستفيد كثيرًا من التخزين المؤقت للكائنات ، وفي أسوأ الحالات ، سوف لديك شبكة الحمل. ومع ذلك ، إذا كان طلبك بالمئات ، فقد يكون من المفيد إلقاء نظرة.