سؤال

لقد نظرت حولي ولكني لم أتمكن من معرفة ما إذا كان يجب علي استخدام كل من ETag و رأس انتهاء الصلاحية أو واحد او الاخر.

ما أحاول القيام به هو التأكد من أن ملفات الفلاش الخاصة بي (والصور الأخرى وما لا يتم تحديثه فقط عندما يكون هناك تغيير في تلك الملفات.

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

أيضًا، هل هناك أي شيء أحتاج إلى القيام به برمجيًا من جهتي في نصوص PHP الخاصة بي لدعم هذا أم أن كل هذا هو Apache؟

هل كانت مفيدة؟

المحلول

إنها مختلفة قليلاً - لا تحتوي ETag على أي معلومات يمكن للعميل استخدامها لتحديد ما إذا كان سيتم تقديم طلب لهذا الملف مرة أخرى في المستقبل أم لا.إذا كان ETag هو كل ما لديه، فسيتعين عليه دائمًا تقديم طلب.ومع ذلك، عندما يقرأ الخادم ETag من طلب العميل، يمكن للخادم بعد ذلك تحديد ما إذا كان سيتم إرسال الملف (HTTP 200) أو إخبار العميل باستخدام نسخته المحلية فقط (HTTP 304).يعد ETag في الأساس مجرد مجموع اختباري لملف يتغير بشكل دلالي عندما يتغير محتوى الملف.

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

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

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

نصائح أخرى

إتاج و آخر تعديل الرؤوس هي المدققون.

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

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

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

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

Expires و Cache-Control هي "رؤوس التخزين المؤقت القوية"

Last-Modified و ETag هي "رؤوس التخزين المؤقت الضعيفة"

أولا فحص المتصفح Expires/Cache-Control لتحديد ما إذا كان سيتم تقديم طلب إلى الخادم أم لا

إذا كان لديك لتقديم طلب، وسوف ترسل Last-Modified/ETag في طلب HTTP.إذا Etag إذا تطابقت قيمة المستند مع ذلك، سيرسل الخادم رمز 304 بدلاً من 200، ولا يوجد محتوى.سيقوم المتصفح بتحميل المحتويات من ذاكرة التخزين المؤقت الخاصة به.

افتراضيًا، سيقوم Apache بإنشاء Etag مرتكز على رقم inode الخاص بالملف، وتاريخ آخر تعديل، وحجمه، والتي يجب أن تكون مناسبة تمامًا للقيام بما تريد.أعتقد أنه سيتم أيضًا إنشاء رأس آخر تعديل افتراضيًا استنادًا إلى وقت التعديل الأخير للملف الموجود على القرص، وهو أيضًا جيد تمامًا للقيام بما تريد.

من المحتمل أيضًا أن تطلب من Apache إرسال رأس انتهاء الصلاحية بتاريخ سنة واحدة في المستقبل (وفقًا لـ http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21) حتى تعرف المتصفحات أن المحتوى قابل للتخزين المؤقت.القي نظرة على mod_expires لتكوين ذلك.

ملخص آخر:

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

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

  • تنتهي يجب استخدامه بحذر، كما لو قمت بتعيين تاريخ انتهاء الصلاحية في المستقبل البعيد ولكنك تريد تغيير أحد الملفات على الفور (ملف JS على سبيل المثال)، فقد لا يحصل بعض المستخدمين على النسخة المعدلة إلا بعد فترة طويلة!

شيء إضافي أود أن أذكره هو أن بعض الإجابات ربما فاتتها هو الجانب السلبي لوجود كليهما ETags و Expires/Cache-control في رؤوسكم.

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

يمكنك قراءة المزيد عنها في منشور المدونة الرائع هذا الذي كتبه كايل سيمبسون: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

من وجهة نظري، باستخدام Exire Header، يمكن للخادم إخبار العميل متى ستكون بياناتي قديمة، بينما باستخدام Etag، سيتحقق الخادم من قيمة etag لكل طلب من العميل.

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

في المواقع الحديثة، غالبًا ما يتم تقديم ملف يسمى hash، مثل app.98a3cf23.js, ، لذلك يعد استخدام Expires Header ممارسة جيدة.بالإضافة إلى ذلك، فإنه يقلل أيضًا من تكلفة الشبكة.

نأمل أن يساعد ؛)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top