التخزين المؤقت للنصوص البرمجية php. PHP والويب

12.04.2019

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

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

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

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

بدءًا من PHP 5.5، تمت إضافة دعم للتخزين المؤقت للكود الثانوي من ZendFramework إلى مترجم اللغة. في الإصدارات الجديدة، تسمح لك ذاكرة التخزين المؤقت هذه بزيادة أداء موردك بشكل كبير؛ على سبيل المثال، هناك معلومات تفيد بأن Wordpres والمحركات الأخرى تعمل بسرعة مضاعفة تقريبًا على PHP 7. قبل إعداد التخزين المؤقت لرمز التشغيل PHP، تحتاج إلى تثبيت الحزمة الخاصة به:

Sudo apt تثبيت php-opcache

أو لتوزيعات ريد هات:

سودو يم تثبيت php-opcache

بعد ذلك، لتمكين التخزين المؤقت، تحتاج إلى إضافة بضعة أسطر إلى php.ini، ويمكنك أيضًا إنشاء ملف ملف منفصلفي /etc/php/conf.d/

السادس /etc/php.d/opcache.ini

zend_extension=opcache.so;
opcache.error_log=/var/log/php-fpm/opcache-error.log
opcache.enable=1;
opcache.memory_consumption=256;
opcache.interned_strings_buffer=8;
opcache.max_accelerated_files=4000;
opcache.revalidate_freq=180;
opcache.fast_shutdown=0;
opcache.enable_cli=0;
opcache.revalidate_path=0;
opcache.validate_timestamps=2;
opcache.max_file_size=0;
opcache.file_cache= /var/www/site/opcache;

دعونا نلقي نظرة على ما تعنيه هذه السطور حتى تعرف القيم التي يجب تعيينها. يقوم السطر الأول بتحميل الامتداد، ولا يلزم تغيير أي شيء هنا.

  • opcache.error_log - يحدد الملف لتسجيل سجل الأخطاء، والذي سيكون مفيدًا لتصحيح الأخطاء؛
  • opcache.log_verbosity_level - يشير إلى مدى تفصيل ملف السجل، والقيمة من 1 إلى 4؛
  • opcache.enable - يتيح التخزين المؤقت؛
  • opcache.enable_cli - يتيح التخزين المؤقت لصفحات php لإصدار وحدة التحكم؛
  • opcache.memory_consumption - الكمية ذاكرة الوصول العشوائيلتخزين ذاكرة التخزين المؤقت.
  • opcache.max_accelerated_files - عدد البرامج النصية/الملفات التي يجب تخزينها مؤقتًا؛
  • opcache.validate_timestamps - التحقق من وقت تعديل البيانات في ملف البرنامج النصي؛
  • opcache.revalidate_freq - التحقق من التردد للمعلمة السابقة؛
  • opcache.revalidate_path - اضبط على 0 للتحقق من التضمين في المرة الأولى فقط؛
  • opcache.enable_file_override - يقوم بتخزين الطلبات مؤقتًا لسمات الملف، على سبيل المثال، الوجود، وما إلى ذلك؛
  • opcache.blacklist_filename - قائمة الملفات التي لا تحتاج إلى تخزينها مؤقتًا؛
  • opcache.max_file_size - أكبر مقاسملف نصي للتخزين المؤقت، 0 - غير محدود؛
  • opcache.interned_strings_buffer - الكمية المسموح بهاخطوط في المخزن المؤقت.
  • opcache.fast_shutdown - استخدم طريقة سريعةتحرير الذاكرة.

بعد حفظ كافة الإعدادات، كل ما عليك فعله هو إعادة تشغيل PHP أو خادم الويب الخاص بك:

إعادة تشغيل Systemctl php-fpm

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

chmod 777 /var/www/site/opcode.php

http://localhost/opcache.php

هنا تستطيع ان ترى إحصاءات مفصلةللتخزين المؤقت والإعدادات وحجم الذاكرة المحتلة.

تخزين الجلسات في memcached

بشكل افتراضي، يقوم PHP بتخزين الجلسات في نظام الملفات، وفي بعض الحالات، يمكنك تسريعها قليلاً وظيفة PHP، إذا قمت بنقل تخزين الجلسات من الملفات إلى ذاكرة الوصول العشوائي (RAM)، على سبيل المثال، memcached. تحتاج أولاً إلى تثبيت memcached ومكتبة php للعمل معها:

sudo apt تثبيت memcached php-memcached

أو للأنظمة المستندة إلى Red Hat:

Sudo yum install memcached php-memcached

نحتاج أولاً إلى تكوين memcached، وفتح الملف /etc/sysconfig/memcached والعثور على السطر CACHESIZE، وهنا تحتاج إلى تحديد مقدار ذاكرة الوصول العشوائي المخصصة لذاكرة التخزين المؤقت:

السادس /etc/sysconfig/memcached

session.save_handler = memcache
session.save_path = "tcp://localhost:11211"

كل ما تبقى هو إعادة تشغيل مترجم php الخاص بك:

إعادة تشغيل Systemctl php-fpm

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

التخزين المؤقت لصفحات fastcgi

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

السادس /etc/nginx/vhosts/site.conf

fastcgi_cache_path /var/nginx/cachelevels=1:2keys_zone=MYAPP:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

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

أنت الآن بحاجة إلى تكوين كتلة معالجة php:

الموقع ~ \.php$ (
fastcgi_pass unix:/var/run/php7-fpm.sock;
fastcgi_index Index.php;
تشمل fastcgi_params؛
fastcgi_cache MYAPP;
fastcgi_cache_valid 200 60m;
}

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

ليرة سورية -lR /var/nginx/cache/

باستخدام هذه الطرق، سيتم تحميل صفحاتك بشكل أسرع بكثير. إذا كنت بحاجة إلى تعطيل التخزين المؤقت لـ php لـ الصفحات الفردية، ثم قم أولاً بإنشاء المتغير no_cache بالقيمة 0:

تعيين $no_cache 0؛

ثم نتحقق المعلمات المطلوبة، وإذا كان مطابقًا، فاضبط القيمة على 1:

إذا ($request_method = POST)
{
تعيين $no_cache 1؛
}

وفي النهاية، نقوم بتمرير قيمة هذا المتغير إلى التوجيهات التالية، مما سيؤدي إلى تعطيل التخزين المؤقت عند عدم الحاجة إليه:

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

غالبًا ما تستخدم المتصفحات الحديثة ذاكرة تخزين مؤقت محلية في عملها. ماذا يعني هذا؟ هذا يعني أن المتصفح، بعد أن يتلقى مستند HTML أو صورة أو أي مورد آخر من الخادم، يضعه في مكانه ذاكرة التخزين المؤقت المحلية e (وبعبارة أخرى، يكتب المورد المستلم إلى الأقراص الصلبةجهاز المستخدم) وأثناء الطلبات اللاحقة لمثل هذا المورد لا يصل إلى الخادم، ولكنه يتلقى المورد من ذاكرة التخزين المؤقت المحلية.

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

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

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

إنشاء عنوان URL جديد

لنفترض أن المورد المطلوب له عنوان url التالي: test.html?id=7. كما ترون من عنوان URL، يتم تمرير معلمة واحدة إليه. دعونا نضيف، على سبيل المثال، متى مساعدة جافا سكريبت، هناك معلمة أخرى في عنوان url، وسنجعلها قيمتها رقم عشوائي. سيبدو عنوان URL الناتج بالطريقة الآتية: test.html?id=7&rnd=0.6700820127538827. معلمة عشوائيةسيتم إنشاؤها من جديد في كل مرة. وفيما يلي قائمة توضح هذا النهج:

إنشاء عنوان URL جديد document.write(""); رابط الاختبار

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

يمكنك أيضًا إدارة التخزين المؤقت من جانب الخادم. ولتحقيق ذلك، يكون المورد المرسل إلى المتصفح مصحوبًا بحقول رأسية. وصف تفصيلييمكن العثور على حقول الرأس في معيار Rfc 2068، الذي يصف بروتوكول HTTP 1.1.

انتهاء صلاحية حقل الرأس

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

إذا كان الحقل > انتهاء الصلاحية< содержит дату, прошедшую, по отношению к текущей, то при следующем обращении к ресурсу браузер будет вынужден снова обратиться к серверу. Это произойдет вследствие того, что либо документ не будет занесен в кэш — как уже устаревший, либо при обращении к кэшу браузер определит, что документ уже устарел. Следующий листинг на PHP демонстрирует использование заголовка Expires:

حقل رأس آخر تعديل

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

* الطلبات من الخادم بتاريخ آخر تحديث للموارد
* يقارن تاريخ الاستلام وتاريخ المورد في ذاكرة التخزين المؤقت المحلية
* إذا كان المورد موجودًا على الخادم أحدث من المواردفي ذاكرة التخزين المؤقت - يتم طلب المورد من الخادم

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

header("آخر تعديل: " . gmdate("D, d M Y H:i:s") . " GMT");

حقول التحكم في ذاكرة التخزين المؤقت ورأس Pragma

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

يتم تعريف الحقل الثاني في معيار RFC 2068، الذي يصف بروتوكول HTTP 1.1. يسمح لك حقل الرأس هذا بتعطيل التخزين المؤقت وطلب مورد من الخادم في كل مرة. توضح القائمة التالية استخدام حقلي رأس Cache-Control وPragma لتعطيل التخزين المؤقت:

header("التحكم في ذاكرة التخزين المؤقت: عدم وجود ذاكرة تخزين مؤقت، يجب إعادة التحقق"); header("Pragma: no-cache");

جيد سيئ

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

أدى ظهور صفحات الويب الديناميكية إلى تغيير الأمور نحو الأسوأ، مما أدى إلى كسر نموذج عرض صفحات الويب هذا بشكل فعال بسبب مشكلتين:

  • عندما يتلقى الخادم طلبًا لصفحة ويب ديناميكية، يتم إجراء بعض المعالجة الوسيطة، على سبيل المثال، تحليل البرنامج النصي بواسطة المحرك بي أتش بيوالتي يجب أن تكتمل. وبفضل هذا، نحصل على تأخير قبل أن يبدأ خادم الويب في إرسال المخرجات إلى المتصفح. للبساطة بي أتش بي-script هذا ليس ضروريا، ولكن لأكثر من ذلك تطبيق معقدمحرك بي أتش بيقد يستغرق الأمر عدة خطوات قبل أن تصبح الصفحة جاهزة للإرسال. هؤلاء إجراءات إضافيةيؤدي إلى تأخير ملحوظ بين طلبات المستخدمين والعرض الفعلي للصفحات في متصفحاتهم.
  • يستخدم خادم الويب النموذجي، مثل Apache، وقت تعديل الملف لإخبار متصفح الويب بحالة ذاكرة التخزين المؤقت للصفحة المطلوبة بشكل صحيح. بالنسبة لصفحات الويب الديناميكية، في الواقع بي أتش بي- قد يتغير البرنامج النصي في بعض الأحيان فقط، بينما يتغير المحتوى الذي يعرضه، والذي قد يكون موجودًا في قاعدة بيانات، بشكل متكرر. ليس لدى خادم الويب طريقة لمعرفة أنه قد تم إجراء تغييرات على قاعدة البيانات، لكنه لا يرسل تاريخ التعديل الأخير. إذا لم يتلق العميل (المتصفح) أي إشارة إلى مدة صحة البيانات، فإنه يفترض أنه يحتاج إلى طلب صفحة جديدة في المرة القادمة. سيستجيب خادم الويب دائمًا بإصدار محدث من الصفحة، بغض النظر عما إذا كانت البيانات قد تغيرت أم لا. لتجنب هذا العيب، يستخدم معظم مطوري الويب العلامات الوصفية أو HTTP- رؤوس لإخبار المتصفح بعدم استخدام النسخة المخبأة من الصفحة مطلقًا. ومع ذلك، فإن هذا ينفي القدرة الطبيعية لمتصفح الويب على تخزين صفحات الويب مؤقتًا وله بعض العيوب المهمة. على سبيل المثال، يمكن أن يتغير محتوى الصفحة الديناميكية مرة واحدة يوميًا، وبالتالي فإن الفائدة التي يتم الحصول عليها من قيام المتصفح بتخزين الصفحة مؤقتًا حتى لمدة 24 ساعة واضحة.
  • عادة، بالنسبة لتطبيقات PHP الصغيرة، من الممكن تمامًا تجاهل وجود هذه المشكلات، ومع ذلك، مع زيادة التعقيد وحركة المرور على موقعك، قد تواجه مشكلات. ومع ذلك، يمكن حل هاتين المشكلتين، الأولى عن طريق التخزين المؤقت من جانب الخادم، والثانية عن طريق إدارة التخزين المؤقت من جانب العميل من التطبيق الخاص بك. سيعتمد النهج الذي تتبعه لحل المشكلات على تطبيقك، ولكن في هذا الفصل سنرى كيف يمكنك حل كلتا المشكلتين باستخدام PHP وبعض فئات المكتبات كُمَّثرَى.

    كيف أمنع المتصفحات من تخزين الصفحة مؤقتًا؟

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

    من خلال إدراج تاريخ سابق في علامة تعريف انتهاء الصلاحية، فإنك تخبر المتصفح أن النسخة المخزنة مؤقتًا من الصفحة تكون دائمًا قديمة. هذا يعني أنه لا ينبغي للمتصفح أبدًا تخزين الصفحة مؤقتًا. العلامة الوصفية Pragma: no-cache هي اتفاقية مدعومة جيدًا إلى حد ما وتتبعها معظم متصفحات الويب. بمجرد اكتشاف هذه العلامة، عادةً لا يقومون بتخزين الصفحة مؤقتًا (على الرغم من عدم وجود ضمان، فهذا مجرد تقليد).

    يبدو هذا جيدًا، ولكن هناك مشكلتان في استخدام العلامات الوصفية:

  • إذا لم تكن العلامة موجودة عندما طلب المتصفح الصفحة لأول مرة، ولكنها ظهرت لاحقًا (على سبيل المثال، قمت بتعديل ملف التضمين pageheader.php الذي يمثل رأس كل صفحة ويب)، فسيظل المتصفح غير مدرك وسيستخدمه بكل سرور. نسخة مخبأة من الأصل.
  • الخوادم الوكيلة التي تقوم بتخزين صفحات الويب مؤقتًا، مثل الصفحات المشتركة مزود خدمة الإنترنت، لن يقوم بفحص المحتوى مباشرة على الإطلاق لغة البرمجة-وثيقة. وبدلاً من ذلك، يعتمدون فقط على خادم الويب الذي جاءت منه المستندات والبروتوكول HTTP. بمعنى آخر، قد يعتقد متصفح الويب أنه لا ينبغي له تخزين الصفحة مؤقتًا، ولكن الخادم الوكيل الموجود بين المتصفح وخادم الويب الخاص بك ربما لا يعرف ذلك - وسيستمر في إرسال نفس الصفحة، التي أصبحت الآن قديمة، إلى العميل .
  • أفضل نهج هو استخدام البروتوكول مباشرة HTTPباستخدام وظيفة PHP header()، أي ما يعادل علامتي التعريف أعلاه:

    يمكننا المضي قدمًا خطوة أخرى باستخدام رأس Cache-Control، المتوافق مع المتصفحات التي تدعمه HTTP 1.1:

    Header("تنتهي الصلاحية: الإثنين، 26 يوليو 1997، الساعة 05:00:00 بتوقيت جرينتش"); header("التحكم في ذاكرة التخزين المؤقت: عدم التخزين، عدم وجود ذاكرة تخزين مؤقت، يجب إعادة التحقق"); header("Cache-Control: post-check=0, pre-check=0", FALSE); header("Pragma: no-cache");

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

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

    Internet Explorer والتخزين المؤقت لتنزيل الملفات

    إذا عند خدمة تنزيل الملف بي أتش بي- يستخدم البرنامج النصي رؤوسًا مثل Content-Disposition: Attachment أو filename=myFile.pdf أو Content-Disposition: inline, filename=myFile.pdf الذي ستواجه مشكلات معه متصفح الانترنت'om إذا طلبت من المتصفح عدم تخزين الصفحة مؤقتًا.

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

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

    كيف يمكنني التقاط البيانات من جانب الخادم للتخزين المؤقت؟

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

    بضع كلمات حول التخزين المؤقت باستخدام القوالب كيف يمكنني إدارة التخزين المؤقت من جانب العميل؟ باستخدام PHP?

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

    أسماء الوظائف الجديدة

    إذا كنت تستخدم بي أتش بي 4.3.0 ثانية أباتشييتم الوصول إلى رؤوس HTTP من خلال الدالة apache_request_headers() وapache_response_headers(). أصبحت الدالة getallheaders() اسمًا مستعارًا لـ ميزة جديدة apache_request_headers() .

    آلية العمل مع ذاكرة التخزين المؤقت لمتصفح الويب عادت مرة أخرى HTTP. تشارك العديد من الرؤوس في توجيه متصفحات الويب والخوادم الوكيلة للتخزين المؤقت للصفحة بشكل مستقل، وهو وضع معقد بسبب حقيقة أنه لا يمكن الوصول إلى بعضها إلا من خلال HTTP 1.1.

    التحقق من رؤوس HTTP في متصفحك

    بسيطة ولكن جدا أداة مريحةللتحقق من رؤوس الطلب والاستجابة LiveHttpHeaders- الملحق للمتصفح موزيلا. من الضروري أن تعرف بالضبط ما هي الرؤوس التي يرسلها البرنامج النصي الخاص بك، خاصة عندما تتعامل مع رؤوس التخزين المؤقت HTTP.

    للتبسيط، سننظر فقط في الرؤوس التخزين المؤقت HTTP 1.0، وهي Expires وLast-Modified وIf-Modified-Since، بالإضافة إلى رمز حالة HTTP 304 (غير معدل).

    عناوين أخرى متاحة من HTTP 1.1، مثل Cache-Control وETag، يهدفان إلى توفير آلية متقدمة يمكن استخدامها جنبًا إلى جنب مع حالة جلسة الويب، بمعنى آخر، قد يختلف إصدار صفحة معينة المعروضة لزائر غير مصرح به بشكل كبير عن تلك المعروضة إلى مستخدم معتمد. العناوين HTTPتمت إضافة الإصدار 1.1 في الأصل للسماح بالتخزين المؤقت لهذه الصفحات.

    انتهاء صلاحية عمر الصفحة

    أسهل رأس يمكن استخدامه هو رأس انتهاء الصلاحية، الذي يحدد تاريخًا (ربما في المستقبل) تنتهي فيه صلاحية الصفحة. حتى هذه اللحظة، يُسمح لمتصفح الويب باستخدام النسخة المخبأة من الصفحة.

    مثال 7.6.php

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

    التواريخ والأوقات في HTTP

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

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

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

    وقت تغيير الصفحة

    أكثر عملية للاستخدام رؤوس آخر تعديلوIf-Modified-Since، متوفر في HTTP 1.0. يُعرف من الناحية الفنية باسم تقديم طلب GET مشروط، حيث تقوم بإرجاع أي محتوى بناءً على شرط رأس الطلب If-Modified-Since.

    عند استخدام هذه الطريقة، يجب عليك إرسال رأس Last-Modified في كل مرة يتم فيها الوصول إلى برنامج PHP النصي الخاص بك. في المرة التالية التي يطلب فيها المتصفح الصفحة، سيرسل رأس If-Modified-Since الذي يحتوي على الوقت الذي يمكن أن يستخدمه البرنامج النصي الخاص بك لتحديد ما إذا كان قد تم تحديث الصفحة منذ الطلب الأخير. إذا لم يكن الأمر كذلك، فسيرسل البرنامج النصي الخاص بك رمز حالة HTTP 304 للإشارة إلى أن الصفحة لم تتغير، دون طباعة محتوى الصفحة.

    اضبط وقت تعديل ملف ذاكرة التخزين المؤقت بهذا السطر: $lastModified = filemtime($cache_file);

    بعد ذلك، باستخدام وقت تعديل ملف ذاكرة التخزين المؤقت، نرسل رأس Last-Modified. نحتاج إلى إرسال هذا لكل صفحة يتم تقديمها لإجبار المتصفح على إرسال رأس If-Modified-Since إلينا مع كل طلب.

    // قم بإصدار رأس HTTP Last-Modified header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModified) . " GMT");

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

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

    تخزين صفحاتك مؤقتًا في 5 خطواتالأصل: تم نشره في PHP / JavaScript بواسطة ibzi في 17 فبراير 2007
    ترجمة: كوزما فيسكوف ( [البريد الإلكتروني محمي]، http://kuzma.russofile.ru)

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


    دعونا نلقي نظرة على تقنية التخزين المؤقت خطوة بخطوة:

  • في الدليل الرئيسيقم بإنشاء الملفات .htaccess، وstart_cache.php، وend_cache.php، بالإضافة إلى مجلد يسمى Cache_files.
  • يحتاج المجلد Cache_files إلى تعيين 777 سمة.
  • اكتب داخل ملف .htaccess السطور التالية: php_value auto_prepend_file /home/username/public_html/start_cache.php php_value auto_append_file /home/username/public_html/end_cache.php String /الصفحة الرئيسية/اسم المستخدم/public_html/يجب استبداله بالمسار إلى الدليل الرئيسي الخاص بك.
  • نضع الكود التالي في البرنامج النصي start_cache.php: لا تنس تصحيح المسار /الصفحة الرئيسية/اسم المستخدم/public_html/إلى المسار إلى الدليل الرئيسي الخاص بك.
  • وقم بوضع الكود التالي في البرنامج النصي end_cache.php:
  • سيتم تخزين جميع صفحاتك مؤقتًا لمدة 3600 ثانية = ساعة واحدة. يمكنك بسهولة تغيير هذه المعلمة في البرنامج النصي start_cache.php. سيتم حفظ ذاكرة التخزين المؤقت للصفحة في مجلد Cache_files.

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

    أيضا، في هذه الطريقةهناك عيب خطير آخر: يضع مؤلف المقال ذاكرة التخزين المؤقت بأكملها في مجلد واحد، مما يؤدي إلى حدوث مشكلة إذا كان هناك صفحات كافية على موقعك، على سبيل المثال، في أنظمة Unix هناك تباطؤ كبير في الأداء عندما يكون هناك هناك أكثر من 1000 ملف في مجلد. في هذا الصدد، من الضروري إجراء عدد من التغييرات على الخوارزمية وتنظيم الملفات في مجلدات فرعية منفصلة داخل المجلد Cache_files. على سبيل المثال، استخدام أول 3-4 أحرف من ذاكرة التخزين المؤقت MD5 لهذا الغرض.

    ل الموارد الديناميكيةمن الممكن تمامًا اختيار وقت التخزين المؤقت لعدة (5-10) ثوانٍ أو 1-2 دقائق، مما سيقلل بشكل كبير من الحمل على الخادم، لكنه لن يضر بتفاعل الموقع.

    بالنسبة للصفحات التي يكون التفاعل فيها مهمًا بشكل خاص، يمكنك تقديم استثناءات في .htaccess، والتي ستسمح لها بالتغيير باستمرار، وبالنسبة للصفحات الأخرى، يمكنك استخدام التخزين المؤقت.

    تجديد المحتوى أثناء التنقل

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

    ويتم ذلك من خلال مجموعة التوجيهات التالية:

    RewriteCond %(REQUEST_FILENAME) !-s RewriteRule ^page\.html$ page.php

    هنا، يؤدي طلب page.html إلى تشغيل page.php المقابل داخليًا إذا كان page.html لا يزال مفقودًا أو حجمه صفر. الحيلة هنا هي أن page.php هو برنامج نصي PHP عادي يقوم، بالإضافة إلى إنتاج مخرجاته الخاصة، بكتابة مخرجاته في ملف page.html. وبتشغيل هذا مرة واحدة، يقوم الخادم بتمرير البيانات إلى page.html. عندما يريد مشرف الموقع تحديث المحتوى، فإنه ببساطة يحذف page.html (عادةً باستخدام cronjob).

    توجد مشكلة في التخزين المؤقت للصفحة في Internet Explorer.

    في IE، عند العمل باستخدام رأس "Vary"، يوجد خطأ غير سار يتعلق بالتخزين المؤقت للصفحة. تم حل المشكلة عن طريق إضافة الأسطر التالية إلى .htaccess:

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

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

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

    للتخزين المؤقت أم لا؟

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

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

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

    المبادئ العامة لتخزين الصفحات في ذاكرة التخزين المؤقت

    يمكن لبرنامج PHP التحكم في التخزين المؤقت لنتائج عمله عن طريق تكوين حقول إضافية في رأس استجابة HTTP عن طريق استدعاء وظيفة Header().

    عدة عبارات عامة نموذجية ليس فقط لبرامج PHP:

    • لا يتم تخزين الصفحات المرسلة عبر POST مؤقتًا أبدًا.
    • الصفحات المطلوبة عبر GET والتي تحتوي على معلمات (يوجد "؟" في عنوان URL) لا يتم حفظها في ذاكرة التخزين المؤقت ما لم يتم تحديد خلاف ذلك.

    وهكذا في معظم المواقف تعليمات إضافيةلا حاجة لإضافته إلى البرنامج. يمكن تقليل النقاط الرئيسية التي يجب الانتباه إليها إلى نقطتين:

    • تعطيل التخزين المؤقت للمستندات المخزنة مؤقتًا بشكل افتراضي
    • تخزين المستندات التي لم يتم تخزينها مؤقتًا بشكل افتراضي.
    منع التخزين المؤقت للمستندات المخزنة مؤقتًا بشكل افتراضي

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

    • انتهاء الصلاحية - يحدد تاريخ انتهاء صلاحية المستند. يؤدي تعيينه في الماضي إلى تحديد تعطيل ذاكرة التخزين المؤقت لهذه الصفحة.
    • التحكم في ذاكرة التخزين المؤقت: عدم وجود ذاكرة تخزين مؤقت - التحكم في ذاكرة التخزين المؤقت. تحدد قيمة عدم وجود ذاكرة تخزين مؤقت ما إذا كانت ذاكرة التخزين المؤقت لهذه الصفحة معطلة أم لا. بالنسبة لإصدار البروتوكول HTTP/1.0، يتم تطبيق "Pragma: no-cache".
    • تاريخ آخر تعديل - تاريخ آخر تعديل للمحتوى. الحقل صالح فقط ل صفحات ثابتة. يستبدل Apache هذا الحقل بقيمة حقل التاريخ للصفحات التي تم إنشاؤها ديناميكيًا، بما في ذلك الصفحات التي تحتوي على SSI.

    يوفر موقع الويب www.php.net الكود التالي لتعطيل التخزين المؤقت.

    Header("تنتهي الصلاحية: الإثنين، 26 يوليو 1997، الساعة 05:00:00 بتوقيت جرينتش"); // التاريخ في الماضي header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // تعديل الرأس دائمًا("التحكم في ذاكرة التخزين المؤقت: عدم وجود ذاكرة تخزين مؤقت، يجب إعادة التحقق"); // HTTP/1.1 header("Pragma: no-cache"); // HTTP/1.0

    ومع ذلك، أعتقد أن هذا العنوان زائدة عن الحاجة. في معظم الحالات يكفي:

    لوضع علامة على مستند على أنه "قديم"، يجب عليك تعيين انتهاء الصلاحية مساويًا لحقل التاريخ.

    Header("Expires: " . gmdate("D, d M Y H:i:s") . "GMT");

    حسنًا، يجب ألا ننسى أن النماذج المطلوبة عبر POST لا تخضع أيضًا للتخزين المؤقت.

    تخزين المستندات التي لم يتم تخزينها مؤقتًا بشكل افتراضي

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

    Header("التحكم في ذاكرة التخزين المؤقت: عام");

    إذا كانت الصفحة تأخذ في الاعتبار المعلومات المخزنة في متصفح المستخدم (نوع المتصفح وإصداره، والمفاتيح، والترخيص، وما إلى ذلك)، فلا يمكن حفظ هذه الصفحة في وكيل، ولكن يمكن حفظها في ذاكرة التخزين المؤقت للمتصفح المحلي:

    Header("التحكم في ذاكرة التخزين المؤقت: خاص");

    التخزين المؤقت حتى انتهاء الصلاحية

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

    التخزين المؤقت للتحديث التنبؤي

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

    المهمة الرئيسية هي الحصول على تاريخ الاثنين المقبل بتنسيق RFC-1123

    $dt_tmp=getdate(date("U")); header("Expires: " . gmdate("D, d M Y H:i:s", date("U")-(86400*($dt_tmp["wday"]-8))) . " GMT"); header("التحكم في ذاكرة التخزين المؤقت: عام");

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

    نهج آخر يستخدم لأكثر من ذلك التحديث التشغيليالمعلومات وفي وقت واحد حضور مرتفعالخادم (وإلا لن يكون التخزين المؤقت فعالاً) هو استخدام رأس Cache-control: max-age=secs، الذي يحدد الوقت الذي يعتبر المستند بعده قديمًا وله أولوية أعلى عند حساب "حداثة" المستند .

    إذا قمت بنشر الأخبار على فترات 30 دقيقة:

    Header("التحكم في ذاكرة التخزين المؤقت: عام");
    header("التحكم في ذاكرة التخزين المؤقت: max-age=1800");

    التخزين المؤقت للمحتوى

    يوفر HTTP/1.1 تحكمًا أكثر ذكاءً استنادًا إلى المحتوى باستخدام توجيهات Vary. أوصي بشدة باستخدامه عند إنشاء صور أو نصوص كبيرة، والتي، كما تظهر الممارسة، نادرًا ما تتغير. وفي الوقت نفسه، إذا عاد المستخدم، فلن يتم إعادة تحميله إذا ظل المحتوى كما هو، وسيتم أخذ الصفحة من الخادم الخاص بك إذا تغير محتواها.

    لنفكر في مثال لإصدار صورة من قاعدة بيانات تم تحديدها بواسطة المعرف. تبدو مكالمة الصفحة كما يلي:

    http://www.your.server/viewpic.php3?id=23123

    مما يعني أنه وفقًا للقواعد، لن يتم حفظ الصفحة في ذاكرة التخزين المؤقت (المعلمات موجودة)، ولكن يمكنك التحكم في ذلك من خلال الرأس.

    Mysql_connect("host", "user", "passwd"); $image=mysql("db", "اختر الصور،اكتب من الصور حيث المعرف=$id"); Header("التحكم في ذاكرة التخزين المؤقت: عام، يجب إعادة التحقق منه"); Header("Vary: Content-ID"); Header("Content-ID: ".md5(mysql_result($image, 0, "pics"))); Header("نوع المحتوى: ".mysql_result($image, 0, "type")); صدى mysql_result($image, 0, "pics"); mysql_freeResult($image); mysql_Close();

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

    ملاحظات للأباتشي الروسية

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

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

    الخطوةالاولى. قم بإنشاء ملف top-cache.php

    نحن بحاجة إلى إنشاء ملفين. أولاً: قم بإنشاء ملف باسم top-cache.php وانسخ الكود التالي فيه:

    ماذا يحدث في هذا الكود؟ تقوم الأسطر الخمسة الأولى بإنشاء اسم ملف ذاكرة التخزين المؤقت وفقًا لـ PHP الحاليملف. على سبيل المثال، إذا استخدمنا ملفًا باسم list.php، فسيبدو ملف ذاكرة التخزين المؤقت مثل Cached-list.html.

    ينشئ السطر 6 متغير $cachetime، الذي يحدد عمر ذاكرة التخزين المؤقت.

    تعريف الأسطر 9 إلى 13 التعبير الشرطي، والذي يتحقق من وجود ملف بالاسم المحدد في المتغير $cachefile. إذا كان الملف موجودًا، فسيتم إدراج تعليق مع الملف المحدد في المتغير $cachefile. يقوم بيان الخروج بعد ذلك بإحباط البرنامج النصي وإرسال الملف إلى متصفح العميل. أي أنه إذا تم العثور على ملف ثابت، فلن يتم تنفيذ كود PHP بواسطة الخادم.

    يقوم السطر 14 بإنشاء مخزن مؤقت إذا لم يتم العثور على الملف المحدد بواسطة $cachefile.

    الخطوة الثانية. قم بإنشاء ملف Bottom-cache.php

    الآن دعونا ننشئ الثانية ملف PHPبالاسم Bottom-cache.php وانسخ الكود التالي فيه:

    إذا كان الملف بالاسم المحدد في المتغير $cachefile غير موجود على الخادم، هذا الرمزويتم إنشاء الملف. في المرة التالية التي يتم فيها الوصول إلى الصفحة، سيخدم ملف ذاكرة التخزين المؤقت $ الثابت متصفح العميل بدلاً من تنفيذ كافة تعليمات PHP البرمجية النصية.

    الخطوة الثالثة. بما في ذلك ملفات ذاكرة التخزين المؤقت في رمز الصفحة

    الآن لدينا اثنان الملف المطلوب. نحن فقط ندرجهم فيها صفحة PHP، والتي يجب تخزينها مؤقتًا. ينبغي تضمين ملف top-cache.php في أعلى الصفحة، وملف Bottom-cache.php في النهاية:

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