PDA

View Full Version : سوال: خارج کردن فایل های css و js از کش مرورگر



php_love
شنبه 06 آبان 1391, 15:00 عصر
سلام دوستان

من سایتم رو آپ کردم , ولی هر وقت تو فایل های css و js تغییراتی اعمال می کنم , و اون ها رو جایگزینه , فایلهای اصلی تویه هاست میکنم , به دلیل کش شدن فایل ها توسط مرورگر , تغییرات رو مشاهده نمی کنم و باید حتما کش رو خالی کنم تا تغییرات نشون داده بشه , البته من که برنامه نویس هستم متوجه این قضیه هستم , ولی کسی که از این جریان اطلاعی نداره , سایت رو یا ظاهری کج و ماوج میبینه تا وقتی که کشش خالی بشه .

اگه میشه راهنمایی کنید چطور می تونم کش مرورگر کاربرا رو وقتی تغییرات اعمال می کنم , پاک کنم .

ممنون

eshpilen
یک شنبه 07 آبان 1391, 13:13 عصر
میتونی URL رو تغییر بدی.
مثلا به این شکل:

<script src="js/my_script.js?2"></script>
اون عدد 2 بعد از علامت سوال رو که میبینی باعث میشه که از نسخهء کش شدهء my_script.js استفاده نشه. البته با این فرض که نسخهء کش شدهء my_script.js مال زمانی بوده که URL اسکریپت به این شکل نبوده. مثلا شاید اون موقع js/my_script.js یا js/my_script.js?1 بوده.

Unique
دوشنبه 08 آبان 1391, 01:27 صبح
راه حلی که دوستمون گفتن شدنیه اما شما که نمیتونی هر بار بیای کل این اسامی را توی فایلت تغییر بدی !
مشکل اینه که به نظر من شما مشکل را بزرگ کردی ! و با یک Ctrl-F5 همشون بروز میشن و نیاز به پاک کردم history یا به قول شما cache نیست. اما اگه واقعا میخوای این کار را بکنی باید از یک اسکریپت استفاده کنی که فایل css و js شما را برای مرورگر بفرسته و با استفاده از ETag به مرورگر میگی که نسخه جدید هست یا نه ! اول چک میکنی که فایلت عوض شده یا نه ! حالا از تاریخ Modified یا حتی حجم ! اگه عوض شده بود میای و ETag جدید تولید میکنی ! اما این کار هم بیخودیه MD5 فایل را بگذار جای ETag و هر بار فایل بروز بشه مرورگر آخریش را خواهد داشت ! من فقط برای عکس ها و فلش ها این کار را میکنم اما برای js و css هم میشه.

در آخر بگم که ETag یک http header هستش برای کنترل آخرین نگارش component ها ! مثل image , stylesheet, javascript و غیره ...

MMSHFE
دوشنبه 08 آبان 1391, 06:19 صبح
دوست عزیز، پیاده سازی راه حلی که جناب Eshpilen گفتن آنچنان هم سخت نیست. کافیه تگ script خودتون رو اینطوری بسازین:

<script src="my_script.js?<?php echo mt_rand(); ?>" language="text/javascript"></script>
همونطور که میبینید، هربار PHP یک عدد تصادفی جلوی ? میگذاره. نیازی هم نیست مرتباً کدتون رو تغییر بدین.
موفق باشید.

eshpilen
دوشنبه 08 آبان 1391, 14:28 عصر
یه راه دیگر هم اینکه که کدهای جاوااسکریپت رو توی فایل با پسوند PHP بذارید و در ابتدای فایل، هدرهای HTTP ضدکش به مرورگر ارسال کنید.

MMSHFE
دوشنبه 08 آبان 1391, 14:41 عصر
درسته. فقط حتماً برای اجرای صحیح باید این کد رو توی فایل PHP بگذاریم:

header('Content-Type: text/javascript');

Unique
سه شنبه 09 آبان 1391, 02:06 صبح
همونطور که میبینید، هربار PHP یک عدد تصادفی جلوی ? میگذاره. نیازی هم نیست مرتباً کدتون رو تغییر بدین.

من فکر کنم اینطوری مرورگر هر بار فایل را دانلود میکنه و این اصلا مناسب نیست !


یه راه دیگر هم اینکه که کدهای جاوااسکریپت رو توی فایل با پسوند PHP بذارید و در ابتدای فایل، هدرهای HTTP ضدکش به مرورگر ارسال کنید.

این روش هم باعث میشه هر بار مرورگر فایل را دانلود کنه ! یعنی توی هر صفحه هی فایل شما دانلود میشه !

روش درست استفاده از ETag هست و بس. چون در این روش مرورگر وقتی نسخه جدید را میگیره که ETag قبلی با جدید متفاوت باشه .

eshpilen
سه شنبه 09 آبان 1391, 08:10 صبح
روش درست استفاده از ETag هست و بس. چون در این روش مرورگر وقتی نسخه جدید را میگیره که ETag قبلی با جدید متفاوت باشه .
هرچیزی به جای خودش.
معمولا نیاز نیست و صرف نداره این کار رو بکنیم. چون اینم نیاز به اجرای کدهای PHP داره (یا شایدم با htaccess بشه). گذشته از نیاز به برنامه نویسی اضافه و باگهایی که ممکنه پیش بیاد. ضمنا بهرحال یک درخواست و پاسخ برای انجام این عملیات بین مرورگر و سرور رد و بدل میشن (که با فایلهای استاتیک کش شده وجود نداره) که این خودش Latency و بار کاری داره برای دو طرف. تنها فرقی که هست اینه که درصورتی که فایل تغییر نکرده باشه، محتویات اون در پاسخ ارسال نمیشن و فقط هدرها ارسال میشن. اینم اگر حجم فایل واقعا زیاد نباشه چندان مهم بنظر نمیاد.
بنظر من همون فایلهای استاتیک و تغییر URL درصورت نیاز، برای کاربردهای عادی مناسب تره.
تاجاییکه میدونم یاهو هم از همین روش استفاده میکنه. در یک مقاله ای از خودشون خوندم.

MMSHFE
سه شنبه 09 آبان 1391, 21:46 عصر
من فکر کنم اینطوری مرورگر هر بار فایل را دانلود میکنه و این اصلا مناسب نیست !
فکر میکنم هدف این تاپیک هم همین بوده و ایشون درخواست کرده بودن که راهی پیشنهاد بشه که فایلهای JS یا CSS کش نشه.