ایجاد: ۱۲:۵۷ ۱۳۹۱/۷/۱۲
ویرایش: ۱۳:۰۲ ۱۳۹۳/۱۰/۳

آموزش‌ها

»

همه چیز درباره کش(cache) سمت سرور و کاربر

کش سمت کاربر

با کمک ارسال header مربوطه، می‌توان به براوزر کاربر گفت که هر فایل را چه مدتی روی سیستم کاربر کش کند. مثلا می‌توانید بگویید که تصاویر را یک سال، jsها را سه ماه و css ها را یک ماه و صفحه شما را یک هفته در دستگاه وی کش کند. البته این زمان‌ها برای مثال بود و هر کسی با توجه به میزان تغییرات هریک از محتویات می‌تواند میزان آن را عوض کند.
برای کش سمت کاربر محتویات استاتیک (js, image, css, fonts) از htaccess استفاده می‌شود با کمک «یکی» از کدهای زیر:
<IfModule mod_expires.c>
   ExpiresActive On
   ExpiresByType image/x-icon            A29030400
   ExpiresByType application/javascript        A2592000
   ExpiresByType application/x-javascript        A2592000
   ExpiresByType text/css                A2592000
   ExpiresByType image/gif                A2592000
   ExpiresByType image/png                A2592000
   ExpiresByType image/jpeg            A2592000
   ExpiresByType application/x-troff        A29030400
   ExpiresByType application/pdf            A29030400
</IfModule>
<IfModule mod_headers.c>
   <FilesMatch ".(gif|jpg|jpeg|png|js|css|htm|html)$">
       Header set Cache-Control "max-age=2592000, public"
   </FilesMatch>
   <FilesMatch ".(ico|rm|pdf)$">
       Header set Cache-Control "max-age=29030400, public"
   </FilesMatch>
</IfModule>
البته راهی که برخی از وبمسترها استفاده می‌کنند، این است که تمام محتویات استاتیک را یکسال کش می‌کنند و در صورت تغییر مثلا یک تصویر، نام آن را عوض می‌کنند و در فایل php (که کش نمی‌شود) نام جدید آن را درج می‌کنند و برخی هم بجای تغییر نام، تاریخ ویرایش فایل را به انتهای نام فایل به عنوان پارامتر درج می‌کنند:
<img src="test.png?1234567890" alt="test" />
که عدد 1234567890 از تابع filemtime محاسبه و چاپ شده است و filemtime تا زمانی که فایل ویرایش نشده، ثابت می‌ماند.
همچنین در مورد فایل php می‌توان با فراخواین تابع ساده زیر، هر صفحه php مان را به مقدار دلخواه کش کنیم مثلا می‌توان صفحاتی که می‌دانیم تغییرات کمتری در آنها پیش می‌آید را بیشتر و سایر صفحات را به مقدار کمتری در سمت کاربر کش کنیم:
function cache($sec=300)
{
  if(empty($sec))
  {
    @header('Cache-Control: no-cache');
    @header('Expires: -1');
  }
  else
  {
    @header('Pragma: public');
    @header('Cache-Control: maxage='.$sec);
    @header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$sec) . ' GMT');
  }
}
که اگر با هدرهای فوق آشنایی ندارید، توصیه می‌کنم مقاله مختصر و مفید A Beginner's Guide to HTTP Cache Headers را مطالعه نمایید.

کش سمت سرور

کش سمت سرور هم می‌تواند در کوئری‌های SQL انجام شود و هم در محتویاتی که php تولید می‌کند که ما با اولی کاری نداریم فعلا.
اما در مورد دومی؛ ماژول‌ها، افزونه‌ها و کلاس‌هایی برای این کار وجود دارد که همیشه و برای هر سایتی مناسب نیستند و نصب و یادگیری آنها نیز چندان ساده نیست.
شخصا این سیستم کش ساده و پایه‌ای را دوست دارم که انعطاف پذیری بالایی دارد.
همانطور که در لینک فوق می‌بینید، برای کش شدن یک صفحه php بر حسب uri یا آدرس درخواست شده با حذف دامنه (که ممکن است متغیر باشد) در سرور فایلی تولید شده است (که در صورت نبودن یا اکسپایر شدن مجددا تولید می‌شود) که همان فایل به سمت کاربر ارسال می‌شود و مجددا php, mysql وارد کار نمی‌شود که محتویات یک صفحه تولید شود. نهایتا کد مربوطه به کمک htaccess به ابتدا و انتهای تمام فایل‌ها الحاق شده است.

فواید کش چیست؟

پرواضح است که کش سمت کاربر به دلیل درخواست کمتر از سرور در کاهش پهنای باند مصرفی اثر مهمی دارد.
همچنین کش سمت سرور نیز به دلیل صرفه‌جویی در منابع فیزیکی سرور و کاهش زمان تولید یک صفحه، اثر مهمی سرعت سایت (خصوصا سایتی با ترافیک بالا) دارد.

محدودیت‌های کش چیست؟

همانطور که در اینجا گفته شده؛ همه صفحات یک سایت را نمی‌توان کش کرد. مثلا کش کردن صفحات نتیجه جستجو، پاسخ درخواست‌های ajax متغیر و ... امکان‌پذیر هست اما عملا بسیار کم‌فایده و بعضا مضر است!
همچنین صفحاتی که تغییرات زیادی دارد (مثلا رای کاربران به نظرات و ...) یا تعداد بازدید آن در زمان درخواست صفحه شمرده می‌شود، با روش تشریح شده در لینک فوق قابل کش‌شدن نیست.
البته لازم نیست که کش مربوط به کل یک صفحه باشد بلکه می‌توان مثلا همه صفحه را بجز یک ستونش کش کرد یا می‌توان فوتر یا هدر خالی را کش کرد و ...
همچنین در صورتی که بخش متغیر صفحه، ارزش سئو ندارد (مثل رای به کاربران و تعداد رای هر مطلب/نظر) در اینصورت، می‌توان بخش متغیر را به صورت یک js بدون کش لود کرد و بقیه صفحه را کش کرد که این کار سرعت بارگذاری صفحه را تا حد محسوسی بالا می‌برد.
یادداشت‌های مرتبط
  1. سرویس های آنلاین رایگان برای نوشتن، تست و بهینه سازی کدهای برنامه نویسی
  2. همه چیز درباره داده ها و تصاویر Inline درون برنامه ای
  3. نکاتی برای افزایش سرعت و کارآمدی سایت
  4. حذف درخواست اضافه تصویر انیمیشن لودینگ
  5. کلید خارجی (Foreign Key) ، محاسن و معایب آن
  6. روش کار با mod_rewrite
  7. هنر css نویسی (نکاتی برای بهتر نوشتن استایل صفحات وب)
  8. www در ابتدای آدرس سایت، خوب است یا بد؟

مدیریت

نام وسیله

اعتبار ورود

نام کاربری

رمز عبور

رمز یکبارمصرف

... لیست تمام آموزش‌ها

تبلیغات

ربات‌های تلگرامی:
مجموعه ربات‌های تلگرامی ما برای ساده‌تر کردن کار با تلگرام و مدیریت کانال
دامنه‌های فروشی:
دامنه‌های زیر مربوط به ما یا مشتریان ماست که قابل واگذاری هستند. در صورت تمایل به داشتن یکی از آنها، با این اکانت تلگرامی مکاتبه نمایید.

دامنه‌هایی که می‌تواند مصرف تخصصی داشته باشد:
AnyDesk.ir, Firebase.ir, Angularjs.ir, 9px.ir alAdmin.ir, iQore.ir notion.ir, 3dn.ir,

دامنه‌هایی که می‌تواند مصرف فرهنگی/مذهبی داشته باشد:
mavaez.ir, 2aha.ir, babolelm.ir, mahjoor.ir

دامنه‌هایی که می‌تواند مصرف شخصی/عمومی داشته باشد:
azizami.ir, 90blog.ir