أتش تي أم أل تعطيل التخزين المؤقت. مشكلة التخزين المؤقت في Microsoft Internet Explorer

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

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

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

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

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

لنفترض أن المورد المطلوب له عنوان url التالي: test.html?id=7. كما ترون من عنوان url "ويتم تمرير معلمة واحدة إليه. دعنا نضيف، على سبيل المثال، with مساعدة جافا سكريبت، هناك معلمة أخرى في عنوان 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");

قليلا عن التخزين المؤقت

غالبًا ما يواجه مشرفو المواقع التخزين المؤقت: تحاول المتصفحات والخوادم الوكيلة، التي تحاول تسريع الويب للمستخدم، الاحتفاظ بأكبر قدر ممكن عدد كبير منالمستندات في ذاكرة التخزين المؤقت. إذا قمت بفتح صفحة موقع في المتصفح، ثم صفحة أخرى، ثم عدت إلى الصفحة الأولى، مع وجود احتمال كبير أن يأخذها المتصفح من القرص الخاص بك (أو حتى من ذاكرة الوصول العشوائي)، حيث قام بحفظ الصفحة في زيارته الأولى. ومن الواضح أن هذه العملية عادة ما تكون أسرع بكثير من استرداد نفس المستند من الشبكة. بعد كل شيء، لعرض الصفحة، لا تحتاج فقط إلى الحصول على كود HTML، ولكن أيضًا لتنزيل جميع المستندات المصاحبة من الشبكة: ملفات CSS، والصور، والبرامج النصية بتنسيق ملفات منفصلة، إلخ. إذا بحثت في مجلدات ذاكرة التخزين المؤقت على محرك الأقراص لديك (بالنسبة إلى IE، يوجد هذا المجلد عادةً هنا: "C:\Documents and Settings\" اسم المستخدم\الإعدادات المحلية\المؤقتة ملفات الانترنت"، لمتصفح فايرفوكس: "C:\Documents and Settings\ اسم المستخدم\الإعدادات المحلية\بيانات التطبيق\موزيلا\فايرفوكس\الملفات الشخصية\ _سلسلة_عشوائية_. default\Cache")، ستلاحظ عدد الملفات التي تم حفظها بواسطة متصفحك.

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

مشكلة التخزين المؤقت في إنترنت مايكروسوفتإكسبلورر

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

req.open("GET", "xmlprovider.php?hash=" + Math.random());

أو قم بتعيين رأس انتهاء الصلاحية على تاريخ سابق في البرنامج النصي الخاص بك والذي يقوم بإنشاء محتوى XML. في PHP سيكون مثل هذا:

// تعطيل رأس التخزين المؤقت لـ IE("انتهاء الصلاحية: الاثنين، 26 يوليو 1997 الساعة 05:00:00 بتوقيت جرينتش"); header("آخر تعديل: " . gmdate("D, d M Y H:i:s") . " GMT"); header("التحكم في ذاكرة التخزين المؤقت: عدم وجود ذاكرة تخزين مؤقت، يجب إعادة التحقق"); header("Pragma: no-cache"); ...

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

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

لذا، فلنقم بتشغيل Apache باستخدام الإعدادات الافتراضية القياسية. هنا وأكثر نستخدم Apache و PHP. ولكن هذا لا يعني بأي حال من الأحوال أن المشكلة الموضحة وحلولها غير متوفرة على النظام الأساسي للخوادم الأخرى، على سبيل المثال، Microsoft IIS. لذلك، دعونا نبدأ أباتشي. أنشئ مجلدًا فارغًا لذاكرة التخزين المؤقت في جذر الخادم وضع ملف test-1.php هناك بالمحتوى التالي:

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

حاول الآن عرض المجلد الخاص بك في المتصفح. للقيام بذلك، افتح المتصفح الخاص بك واكتب في شريط العناوين

عظيم! انقر الآن على ملف test-1.php الخاص بك ولاحظ الوقت (على سبيل المثال، قمت بوضع نافذة المتصفح بجوار ساعة Windows):

خلاب! الآن اضغط على الزرين "رجوع" ثم "الأمام" في المتصفح:

أُووبس! الزمن لا يتغير !!! ماذا يعني ذلك؟ نعم فقط أن المتصفح يأخذ الصفحة من ذاكرة التخزين المؤقت !!! ماذا عنا موسوعيشفرة؟ نعم، لا يعمل!

ولنعد إلى المصادر الأصلية

ما هي المشكلة؟ المشكلة هي الاستخدام غير الصحيح لرؤوس الاستجابة. تخصص مواصفات RFC2616 فصلاً كاملاً للتخزين المؤقت. لكن لسوء الحظ، لا يقرأ مشرفو المواقع كثيرًا المواصفات. فماذا تعني تلك الرؤوس التي مررناها للتو؟ دعونا نراهم. يعد هذا أمرًا مريحًا جدًا للقيام به باستخدام الوظيفة الإضافية لشريط أدوات Firefox Web Developer: معلومة. منظرإجابةالرؤوس(بالنسبة لـ IE هناك أداة مشابهة تسمى DevToolbar):

لذلك مررنا العناوين التالية:

تنتهي صلاحيته: الإثنين، 26 يوليو 1997، الساعة 05:00:00 بتوقيت جرينتش - يحدد هذا الرأس وقت ملاءمة المعلومات. نحاول تمرير تاريخ في الماضي، معتقدين أن هذا سيجبر المتصفح على تحميل الصفحة من الخادم في كل مرة. إنه لا يجبرك، كما لاحظنا بوضوح من خلال التجربة.

آخر تعديل: السبت، 26 يناير 2008 17:03:02 بتوقيت جرينتش — تاريخ ووقت تعديل المعلومات الموجودة على الصفحة. لا يؤثر هذا الرأس على التخزين المؤقت على الإطلاق (اقرأ في RFC2616!)، باستثناء أنه يمكن استخدامه لطلب مع المدققين. على سبيل المثال، روبوت البحثيمكنه طلب بيانات مثل هذه: GET /megapage.html HTTP/1.1 If-Mofidied-Since: Sat, 26 Jan 2008 17:03:02 GMT

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

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

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

تعطيل التخزين المؤقت

قم بإعادة حفظ ملف test-1.php بالاسم الجديد test-2.php وقم بتغييره كما يلي:

حاول الآن فتح مجلد الاختبار الخاص بنا مرة أخرى http://localhost/test-cache/، انقر فوق الاسم test-2.php وانقر الآن على الزرين "Back" و"Forward". الوقت يتغير في كل مرة! وهذا يعني أن المتصفح لا يأخذ الصفحة من ذاكرة التخزين المؤقت عند التحرك للأمام/للخلف، ولكنه يطلبها مرة أخرى من الخادم. وهو في الواقع ما كنا بحاجة إليه. دعونا نلقي نظرة على رؤوس الاستجابة:

ها هو! نمرر رأسين:

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

تنتهي صلاحيته: السبت، 26 يناير 2008 20:31:55 +0300 - تنتهي صلاحية الصفحة على الفور، أي الآن.

وهذه الرؤوس هي التي تمنع التخزين المؤقت في المتصفح. ولكن لا يزال من الأصح إضافة تعليمات للخوادم الوكيلة إلى رأس التحكم في ذاكرة التخزين المؤقت (ملف test-3.php):

الحظر العملي للتخزين المؤقت

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

LoadModuleنتهي_module Modules/mod_expires.so LoadModule headers_module Modules/mod_headers.so... AddModule mod_expires.c AddModule mod_headers.c

عظيم! الآن فقط قم بإنشاء ملف .htaccess في المجلد الخاص بك واكتب ما يلي فيه:

# # تعطيل التخزين المؤقت في هذا المجلد # يجب تمكين الوحدات # mod_headers.c و mod_expires.c # # Header Cache-Control Header append Cache-Control "no-store, no-cache, must-revalidate" # Header Expires ExpiresActive On ExpiresDefault " الآن"

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

إذن التخزين المؤقت

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

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

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

أو يمكنك الاستغناء عن PHP تمامًا. قم بإنشاء ملف .htaccess في المجلد وأدخل ما يلي فيه:

# # السماح بالتخزين المؤقت في هذا المجلد # يجب تمكين الوحدات # mod_headers.c و mod_expires.c # # رأس التحكم في ذاكرة التخزين المؤقت إلحاق التحكم في ذاكرة التخزين المؤقت "عام" # انتهاء صلاحية الرأس ExpiresActive عند ExpiresDefault "الوصول بالإضافة إلى ساعة واحدة"

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

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

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

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

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

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

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

لنفترض أن المورد المطلوب له عنوان url التالي: test.html?id=7. كما ترون من عنوان URL، يتم تمرير معلمة واحدة إليه. دعنا نضيف، على سبيل المثال، باستخدام JavaScript، معلمة أخرى إلى عنوان 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");

جيد سيئ

تعطيل التخزين المؤقت باستخدام PHP

تعطيل التخزين المؤقت باستخدام PHP

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

يمكنك منع المتصفح والخوادم الوكيلة من تخزين المستندات مؤقتًا باستخدام الأدوات التالية: لغة PHP، وهي وظائف Header().

للقيام بذلك، استخدم الأوامر التالية في بداية البرنامج النصي:

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

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

من كتاب تعزيز موقع الويب الخاص بك المؤلف نيكولاي ماتسيفسكي

تحتوي مواصفات التخزين المؤقت RFC-2616 على فصل كامل مخصص للتخزين المؤقت لـ HTTP. ويتناول بالتفصيل ما تعنيه العناوين الفردية. دعونا نلقي نظرة على النقاط الرئيسية. يحدد رأس Expires الوقت الذي تكون فيه المعلومات ذات صلة. بالنسبة للموارد،

من الكتاب سجل ويندوزالمؤلف كليموف الكسندر

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

من كتاب العمل على الإنترنت لديمتري ماكارسكي

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

من الكتاب الاستخدام الفعالسي ++. 55 الطرق الصحيحةتحسين بنية ورمز برامجك بواسطة مايرز سكوت

تعطيل التخزين المؤقت لكلمة المرور (Internet Explorer 4 والإصدارات الأحدث) يُقال إن هذا الإعداد محدود الاستخدام. تنطبق المعلومات المقدمة على شبكة الإنترنت. إصدارات المستكشف 4.01 مع تثبيت حزمة التحديث الثانية، إلى 5 و5.01 إصدارات الإنترنت Explorer يعمل تحت Windows 95، 98، NT 4.0 والإنترنت

من كتاب إنشاء المواقع . الترويج لموقع الويب. كسب المال على موقع المؤلف ماكس أناتولي

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

من الكتاب أدوات الشبكةلينكس بقلم سميث رودريك دبليو.

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

من كتاب لينكس : الدليل الكاملالمؤلف كوليسنيتشينكو دينيس نيكولاييفيتش

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

من كتاب الخوارزميات الأساسية وهياكل البيانات في دلفي من تأليف باكنيل جوليان م.

القاعدة 38: نموذج العلاقة "يحتوي على" أو "يتحقق من خلال" مع التركيب. التركيب هو علاقة بين الأنواع التي تحدث عندما يحتوي كائن من نوع واحد على كائنات من أنواع أخرى. على سبيل المثال: عنوان الفئة (...)؛ // فئة العنوان السكني

من كتاب العمل على الانترنت. موسوعة المؤلف تاشكوف بيتر أندريفيتش من كتاب لينكس من خلال عيون الهاكر المؤلف فلينوف ميخائيل إيفجينيفيتش

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

من كتاب المؤلف

13.4.1. تكوين التخزين المؤقت على خادم DNS للاستمتاع بهذه الميزة، يجب عليك إضافة المعلمات التالية إلى كتلة الخيارات الخاصة بالملف name.conf: إعادة التوجيه أولاً ( 81.3.165.35; 81.3.150.2;); في الأقواسقائمة عناوين IP لخوادم DNS التي

من كتاب المؤلف

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

من كتاب المؤلف

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

من كتاب المؤلف

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

من كتاب المؤلف

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