قيمة ETAG السيئة في بيئة الاختبار وبيئة الإنتاج
-
21-09-2019 - |
سؤال
أنا أستخدم حل التخزين المؤقت الجديد للقضبان كما هو موضح هنا.
ال تطوير البيئة تعمل بشكل جيد ، ولكن اختبار و إنتاج يرسل غير صالح ETag
يتجاهل الرأس معلمة stale?
وظيفة.
هنا هو الجزء المقابل من أحد وحدات التحكم الخاصة بي:
def index
@categories = Category.all
if stale?(:etag => @categories)
respond_to do |format|
format.html
format.xml { render :xml => @categories }
format.json { render :json => @categories }
end
end
end
ال stale?
طريقة ActionController::Base
يدعو fresh_when
الطريقة التي تحدد etag
التابع Response
الكائن ، الذي يحتوي على الكود التالي:
def etag=(etag)
if etag.blank?
headers.delete('ETag')
else
headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
end
end
ال Category
يرسل النموذج الصحيح cache_key
إذا حصلت عليها في كل بيئة:
>> Category.find(1).cache_key
=> "categories/1-20100117153353"
>> ActiveSupport::Cache.expand_cache_key(Category.find(:all))
=> "categories/1-20100117153353/categories/2-20100117152007/categories/3-20100116094423/categories/4-20100116094423/categories/5-20100116094423/categories/6-20100116094423/categories/7-20100116094423/categories/8-20100117145800/categories/9-20100117145808"
لذلك أنا ببساطة لا أفهم ما يحدث ، لأنه عندما أختار عنوان URL http://localhost:3000/admin/categories/
مع ال تطوير البيئة ، ETag
يتغير في كل مرة عندما أحفظ على أ Category
ولكن مع اختبار أو إنتاج لم يحدث ذلك.
لقد اختبرته مع Webrick و نحيف
المحلول
كان الحل أن Category.all
قامت الطريقة بالتخلي عن النتائج على مستوى الفصل ، لذلك بمجرد أن يتم جلب كل شيء تم تخزينه مؤقتًا لبقية الطلبات.
لم يكن هناك في تطوير البيئة لأنه في كل مرة يتم إعادة تحميل النموذج لأنه في تلك البيئة config.cache_classes
كان false
!
نصائح أخرى
لا أعرف ما إذا كان هناك الحد الأقصى على خطوط/معلمات الرأس ، ولكن مع الكثير من الفئات ، تصبح قيمة ETAG طويلة جدًا ، كما يظهر مثالك بالفعل.
بدلاً من إنشاء سلسلة كبيرة تحتوي على جميع تواريخ الإنشاء/المعدلة ، يمكنك العثور على أحدث تاريخ تعديل واستخدام ذلك لـ ETAG.
بالإضافة إلى المقالة التي نقلت عنها الاستخدامات fresh?
بدلاً من stale?
بما في ذلك بعض الطرق الأخرى. لماذا لا تستخدم هؤلاء؟
تعديل: عند النظر إلى المقالة في الخاص بك رابط محدث يبدو أن الحل هو ، لملء واحد فقط @category
(كما يفعلون). لذلك تجد الفئة الأخيرة المعدلة
@category = Category.find(:first, :order => 'date DESC')
واستخدم هذه القيمة لإنشاء MD5 لـ ETAG.
احصل على القائمة الكاملة لـ @categories
فقط إذا كنت تقوم بتقديم الصفحة.