سؤال

أريد إنشاء علامة إلكترونية تتطابق مع ما ينتجه Apache.كيف يقوم أباتشي بإنشاء علاماته الإلكترونية؟

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

المحلول

يستخدم Apache التنسيق القياسي لـ inode-filesize-mtime.التحذير الوحيد لذلك هو أن mtime يجب أن يكون وقتًا زمنيًا ومحشوًا بالأصفار بحيث يكون مكونًا من 16 رقمًا.إليك كيفية القيام بذلك في PHP:

$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));

نصائح أخرى

شيء واحد يجب تذكره حول علامات Apache's Etags هو أنها لا تعمل بشكل جيد في المجموعات لأنها تتضمن معلومات inode يمكن - وربما ستختلف - بين الأجهزة الموجودة في نفس المجموعة.

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

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

الإجابة أعلاه (من كريس) تعمل بشكل جيد، ولكن يمكن تبسيطها باستخدام قالب ضمني في sprintf:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));

المقترح %016x لا يعمل لأنه يتم تطبيق الحشو بعد التحويل إلى ست عشري، وليس قبله.

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