افزایش سرعت سایت

کش چیست و انواع آن

کش یعنی نگه داشتن نتیجه یک کار، تا دفعه بعد همان کار دوباره انجام نشود. روی همین سایت، همان صفحه با تقریبا همان تعداد بایت، از کش ۲۳.۵ میلی ثانیه و بدون کش ۱۵۵.۵ میلی ثانیه طول می کشد تا اولین بایتش برسد.

  • درس ۶ از ۱۰
  • مقدماتی
  • رایگان، بدون ثبت نام

یک درخواست از این لایه ها رد می شود و اولین جوابی که پیدا کند برنده است

از بالا، نزدیک ترین به بازدیدکننده. هرچه پایین تر بروید، جواب دادن گران تر می شود.

  • کش مرورگرروی دستگاه خود بازدیدکننده؛ اصلا درخواستی فرستاده نمی شود یک سال
  • لبه شبکه توزیع محتوابیرون از سرور شما؛ پاک سازی سرور به آن نمی رسد سی روز
  • کش صفحهHTML آماده روی دیسک؛ وقتی هست، پی اچ پی اجرا نمی شود یک فایل
  • کش شیجواب پرسش های داخل کد؛ تنها کشی که برای کاربر وارد شده کار می کند در حافظه
  • کد و پایگاه دادهته پشته؛ اینجا صفحه واقعا ساخته می شود و هزینه اش را می دهید بدون کش

این ترتیب برای یک بازدیدکننده مهمان است. کاربری که وارد حساب شده سه لایه بالا را رد می کند و مستقیم به دو لایه پایین می رسد.

آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.

کش دقیقا چه چیزی را ذخیره می کند؟

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

عدد این ادعا را از خود همین سایت گرفتیم. صفحه اول را ده بار از نسخه کش شده و ده بار با یک پارامتر کش شکن خواستیم، هر بار با فشرده سازی روشن، و زمان رسیدن اولین بایت را نوشتیم. از کش، میانه ۲۳.۵ میلی ثانیه شد و کمترین و بیشترین ۲۲ و ۳۷. بدون کش، میانه ۱۵۵.۵ میلی ثانیه و بازه ۱۳۴ تا ۱۸۲.

حالا حجم همان دو پاسخ: ۴۳.۸ کیلوبایت برای نسخه کش شده و ۴۳.۱ کیلوبایت برای نسخه ای که همان لحظه ساخته شد. یعنی نسخه کند تقریبا هم اندازه نسخه سریع است و در واقع کمی کوچک تر هم هست. تمام آن اختلاف شش برابری، زمان است و نه بایت.

پس وقتی می گویند کش سایت را سریع می کند، حرف درست تر این است: کش کاری را که سرور برای ساختن صفحه انجام می داد حذف می کند. آن کار یعنی اجرای کد، پرسیدن از پایگاه داده، چیدن قالب و ساختن HTML. نتیجه اش یک فایل می شود که دفعه بعد مستقیم فرستاده می شود.

همین جا مرز کش هم معلوم می شود و بعدا به دردتان می خورد: اگر صفحه شما کند است چون سه مگابایت تصویر دارد، کش هیچ کمکی نمی کند. کش زمان ساختن را می خرد، نه زمان دانلود را.

برج چهار طبقه شیشه ای با مکعب سفید در بالا، یک رد قرمز کوتاه و یک رد آبی بلند که تا پایین پیچ می خورد

همان صفحه، با کش و بی کش

میانه ده درخواست به هر حالت، از همین سرور، ۱۷ شهریور ۱۴۰۵
  1. صفحه همان لحظه ساخته شد ۱۵۵.۵ میلی ثانیه بازه ۱۳۴ تا ۱۸۲
  2. صفحه از کش خوانده شد ۲۳.۵ میلی ثانیه بازه ۲۲ تا ۳۷

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

چهار لایه ای که درخواست از آنها رد می شود

وقتی کسی آدرس سایت شما را باز می کند، درخواستش از چند کش عبور می کند و اولین کشی که جواب داشته باشد کار را تمام می کند. ترتیبش از نزدیک ترین به بازدیدکننده شروع می شود.

کش مرورگر روی دستگاه خود بازدیدکننده است. فایل هایی که عوض نمی شوند اینجا می مانند و دفعه بعد اصلا درخواستی فرستاده نمی شود. روی این سایت فونت ها و اسکریپت ها و شیت ها با Cache-Control: max-age=31536000 فرستاده می شوند، یعنی یک سال. فونت اصلی سایت ۲۵۲۷۲ بایت است و بازدیدکننده ای که هفته پیش آمده، امروز صفر بایت بابتش می دهد. این سریع ترین لایه است چون هیچ شبکه ای در کار نیست.

لبه شبکه توزیع محتوا بیرون از سرور شماست و کپی صفحه را نزدیک بازدیدکننده نگه می دارد. این لایه درس خودش را در مسیر اینترنت و شبکه دارد؛ چیزی که اینجا لازم است بدانید این است که لبه معمولا با یک هدر جداگانه راهنمایی می شود و نه با همان هدری که به مرورگر می گویید.

کش صفحه روی سرور خودتان است و نتیجه کامل HTML را در یک فایل نگه می دارد. روی این سایت این فایل ها واقعا فایل اند: صفحه «درباره ما» یک فایل فشرده ۳۶۳۳۰ بایتی است و کل کش صفحه های سایت ۱۹۸۰ فایل و ۱۱۲ مگابایت. وقتی این فایل موجود باشد وب سرور خودش می فرستدش و پی اچ پی اصلا اجرا نمی شود؛ همین است که آن ۲۳.۵ میلی ثانیه را می سازد.

کش شی ته پشته است و با بقیه فرق دارد: صفحه را نگه نمی دارد، جواب پرسش های داخل کد را نگه می دارد. روی این سایت ردیس ۷.۴.۷ این کار را می کند. اهمیتش وقتی معلوم می شود که سه لایه بالا رد شده باشند، مثلا برای یک کاربر وارد شده که هرگز صفحه کش شده نمی گیرد. برای او تنها کشی که کار می کند همین است.

پایین این چهار لایه هیچ کشی نیست: کد اجرا می شود و پایگاه داده جواب می دهد. هر بار که هیچ لایه ای جواب نداشته باشد، هزینه اش همان ۱۵۵.۵ میلی ثانیه است.

کش صفحه و کش شی، دو کار متفاوت

کش صفحه

  • کل HTML آماده را در یک فایل نگه می دارد
  • وقتی جواب بدهد، پی اچ پی اصلا اجرا نمی شود
  • برای بازدیدکننده مهمان؛ برای کاربر وارد شده معمولا خاموش است

کش شی

  • جواب پرسش های داخل کد را در حافظه نگه می دارد
  • پی اچ پی اجرا می شود ولی کمتر از پایگاه داده می پرسد
  • تنها لایه ای که برای پنل مدیریت و کاربر وارد شده باقی می ماند

هیچ کدام جای دیگری را نمی گیرد. سایتی که فقط اولی را دارد پنل کندی دارد، و سایتی که فقط دومی را دارد صفحه های عمومی کندی دارد.

چرا تغییری که دادید هنوز به بازدیدکننده نرسیده؟

این سوال روزانه ترین سوال کش است و جوابش تقریبا همیشه یکی است: لایه ای جلوتر از جایی که شما پاک کردید، هنوز نسخه قدیمی را دارد.

اولین چیزی که باید ببینید این است که یک پاسخ می تواند دو دستور کش متفاوت داشته باشد، یکی برای مرورگر و یکی برای لبه. صفحه های همین سایت با این دو هدر می آیند:

cache-control: no-cache, must-revalidate
cdn-cache-control: max-age=2592000

یعنی به مرورگر می گوییم هر بار بپرس، و به لبه می گوییم سی روز نگه دار. این عمدی است و رایج، ولی معنایش را باید فهمید: پاک کردن کش روی سرور خودتان به آن سی روز دست نمی زند. صفحه را روی سرور بازسازی می کنید، خوشحال می شوید، و بازدیدکننده همچنان نسخه ای را می بیند که لبه دارد. برای رسیدن به لبه باید از خود سرویس لبه پاک سازی بخواهید، و این کار جداست.

تله دوم کوچک تر است و بیشتر وقت می گیرد، چون شبیه شکست خوردن پاک سازی به نظر می رسد. وب سرور برای اینکه هر بار سراغ دیسک نرود، نتیجه بررسی وجود فایل ها را برای مدت کوتاهی نگه می دارد؛ روی این سرور آن مدت با تنظیم open_file_cache_valid شصت ثانیه است. پس فایل کش را پاک می کنید، بلافاصله صفحه را می گیرید، و همان صفحه قدیمی می آید. هیچ چیز خراب نشده؛ یک دقیقه صبر کنید و دوباره بگیرید.

و مورد سومی که کمتر به آن فکر می شود: خود بازدیدکننده. اگر فایلی را با یک سال اعتبار فرستاده باشید و بعد محتوایش را عوض کنید، مرورگر کسی که قبلا آمده هرگز نمی فهمد. راه درست عوض کردن محتوای فایل نیست، عوض کردن اسم یا نسخه آدرس آن است تا آدرس تازه یعنی فایل تازه.

چه چیزی را نباید کش کرد؟

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

مصداق هایش همیشگی اند: سبد خرید، صفحه حساب کاربری، هر صفحه ای که نام کاربر روی آن چاپ می شود، فرم های در حال پر شدن، و صفحه های نتیجه پرداخت. بدترین شکل شکست هم همان است که همه نگرانش اند: کاربر اول سبدش را می بیند، کش می شود، و کاربر دوم سبد کاربر اول را می بیند.

به همین دلیل کش صفحه معمولا برای کاربر وارد شده اصلا کار نمی کند و این یک نقص نیست، طراحی است. ولی نتیجه اش را باید بپذیرید: پنل مدیریت شما همیشه کند تر از صفحه های عمومی سایت است، چون هر بار واقعا ساخته می شود. اینجا همان جایی است که کش شی تنها ابزار باقیمانده است.

یک مورد مرزی هم هست که تصمیمش را باید خودتان بگیرید: صفحه هایی که برای همه یکی اند ولی زود کهنه می شوند، مثل صفحه ای که موجودی انبار را نشان می دهد. اینها را می شود کش کرد، به شرطی که عمر کش کوتاه باشد و بدانید بدترین حالت چیست. اگر بدترین حالت این است که کسی چیزی را که تمام شده سفارش بدهد، عمر کش شما باید خیلی کوتاه باشد یا آن تکه باید از کش بیرون بماند.

برگه کشقبل از روشن کردن

کش کنید

  • صفحه هایی که برای همه یکی اند: مقاله، صفحه خدمات، صفحه محصول
  • فایل هایی که عوض نمی شوند: فونت، تصویر، شیت و اسکریپت نسخه دار
  • صفحه هایی که کهنه می شوند ولی برای همه یکی اند، با عمر کوتاه

هرگز کش نکنید

  • سبد خرید، تسویه حساب و صفحه نتیجه پرداخت
  • هر صفحه ای که نام یا اطلاعات کاربر روی آن چاپ می شود
  • پنل مدیریت و هر مسیری که فقط بعد از ورود دیده می شود
  • پاسخ فرم ها و هر چیزی که با یک درخواست عوض می شود

پاک کردن کش رایگان نیست

دکمه «پاک کردن همه کش» ساده ترین دکمه هر افزونه کش است و پرهزینه ترین کاری است که می شود با کش کرد. اینجا موضع می گیریم، چون بهایش را داده ایم.

وقتی کل کش را پاک می کنید، هر صفحه ای که پاک شده باید دوباره ساخته شود. اگر افزونه شما بعد از پاک سازی صفحه ها را از پیش گرم کند، آن بازسازی همان لحظه شروع می شود و نه وقتی بازدیدکننده بیاید. روی سایتی با ۱۹۸۰ صفحه کش شده، این یعنی نزدیک دو هزار بار اجرای کامل پی اچ پی پشت سر هم. با آن میانه ۱۵۵.۵ میلی ثانیه ای، عددش را خودتان ضرب کنید، و یادتان باشد که این کار روی سروری انجام می شود که همان لحظه دارد به بازدیدکننده های واقعی هم جواب می دهد.

قاعده ای که خودمان با آن کار می کنیم ساده است: فقط صفحه هایی را پاک کنید که واقعا عوض شده اند. اگر متن یک صفحه را ویرایش کردید، همان یک آدرس. اگر سایت چندزبانه است، هر زبان یک آدرس جداست و جدا حساب می شود. پاک سازی سراسری فقط وقتی توجیه دارد که چیزی عوض شده باشد که واقعا در همه صفحه ها هست، مثل هدر یا شیت سراسری، و آن هم بهتر است در ساعت کم ترافیک انجام شود.

و ترتیب کار، که ساده به نظر می رسد و اغلب برعکس انجام می شود: اول تغییر را روی نسخه بدون کش بررسی کنید و مطمئن شوید درست است، بعد پاک کنید. اگر برعکس عمل کنید، هر بار ذخیره کردن یک پاک سازی جدید است و همان صفحه پنج بار بازسازی می شود.

مسیر سریع با هوش مصنوعی

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

  1. هدرهای هر دو حالت را بگیرید: یک بار آدرس خودش، یک بار همان آدرس با یک پارامتر تصادفی مثل ?cb=12345 که هیچ کشی آن را ندیده است.
  2. هر دو را با هم به مدل بدهید و بخواهید بگوید کدام لایه جواب داده و کدام هدر آن را نشان می دهد. ندادن حالت دوم، همان اشتباهی است که جواب را بی فایده می کند.
  3. بخواهید فقط همان لایه ای را که مقصر است نام ببرد و کوچک ترین کار لازم را پیشنهاد بدهد، و صریح بگویید پاک سازی سراسری پیشنهاد ندهد.
  4. کار پیشنهادی را انجام بدهید، یک دقیقه صبر کنید و دوباره هدرها را بگیرید. صبر کردن اختیاری نیست: پنجره شصت ثانیه ای وب سرور همان چیزی است که باعث می شود کار درست، شکست خورده به نظر برسد.

نسخه آماده کپی

این هدرهای پاسخ یک صفحه از سایت من است، در دو حالت.

حالت A، آدرس عادی:
{هدرهای کامل را اینجا بچسبانید}

حالت B، همان آدرس با یک پارامتر تصادفی که هیچ کشی ندیده:
{هدرهای کامل را اینجا بچسبانید}

می خواهم بدانم چرا تغییری که روی سرور دادم هنوز دیده نمی شود.

قاعده ها:
۱. فقط از روی همین هدرها نتیجه بگیر. اگر هدری که لازم داری در متن نیست، بگو کدام هدر لازم است، حدس نزن.
۲. بگو در حالت A کدام لایه جواب داده: مرورگر، لبه، کش صفحه، یا کد. و بگو کدام خط این را نشان می دهد.
۳. اگر حالت A و حالت B محتوای متفاوتی دارند، این یعنی چه.
۴. یک لایه مقصر نام ببر، نه چند تا.
۵. کوچک ترین کار لازم را پیشنهاد بده. پاک سازی سراسری یا پاک کردن همه کش پیشنهاد نده.
۶. اسم هیچ تنظیمی را که در این هدرها نیست ننویس.

جواب را در چهار خط بده: لایه ای که جواب داد، دلیل، کار پیشنهادی، چیزی که بعد از آن باید عوض شده باشد.

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

هوش مصنوعی در این کار

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

ابزارهایی که واقعا کمک می کنند

  • Claude برای همان کار تشخیصی بالا مناسب است: یک متن ساختاریافته را می خواند و بین چند خط ربط پیدا می کند، و اگر قاعده بگذارید قاعده ها را نگه می دارد. ایران در فهرست کشورهای پشتیبانی شده انتروپیک نیست، پس نه ثبت نام رسمی انجام می شود و نه کارت ایرانی پذیرفته می شود.
  • Gemini برای وقتی خوب است که می خواهید یک اصطلاح یا یک دستور را سریع بفهمید، مثلا فرق no-cache و no-store. صفحه خود گوگل می گوید اپ وب جمنای در بیش از ۲۳۰ کشور و قلمرو کار می کند و ایران در آن فهرست نیست.
  • ChatGPT برای همان خواندن هدر و توضیح دادن کافی است. درباره دسترسی از ایران ادعایی نمی کنیم، چون صفحه کشورهای پشتیبانی شده اوپن ای آی مثل بقیه آن دامنه به این سرور پاسخ ۴۰۳ می دهد.

کجا نتیجه معکوس می دهد

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

منبع ها: MDN: Cache-Control Anthropic: supported countries Google: where Gemini Apps are available

حد این توصیه

این درس درباره کش کردن صفحه های یک سایت معمولی است و سه مرز دارد که باید بدانید. اول اینکه کش داخل خود کد، یعنی جایی که برنامه نویس نتیجه یک محاسبه سنگین را در حافظه نگه می دارد، موضوع دیگری است و اینجا به آن نپرداختیم. دوم اینکه عددهای این صفحه از یک سرور در اروپا با دیسک گرم گرفته شده اند؛ نسبت ها را می شود به سایت شما تعمیم داد ولی خود اعداد را نه، و تنها عدد قابل اعتماد آن است که خودتان روی سایت خودتان گرفته اید. سوم و مهم تر از هر دو: اگر سایت شما واقعا برای هر بازدیدکننده صفحه متفاوتی می سازد، مثل یک داشبورد یا یک شبکه اجتماعی، کش صفحه ابزار درستی برای شما نیست و راه حل شما پایین تر در پشته است.

از تجربه خود ما

گران ترین ساعتی که ما بابت کش داده ایم، خرج تعقیب یک باگ شد که اصلا باگ نبود. فایل کش یک صفحه را پاک کردیم، بلافاصله صفحه را گرفتیم، و همان نسخه قدیمی آمد. دوباره پاک کردیم، دوباره همان. رفتیم دنبال اینکه چه چیزی دارد فایل را برمی گرداند. جواب این بود که وب سرور برای اینکه هر بار سراغ دیسک نرود، نتیجه بررسی وجود فایل ها را شصت ثانیه نگه می دارد، و ما هر بار داخل همان پنجره شصت ثانیه ای دوباره تست می کردیم. هیچ چیز خراب نبود؛ صبر نکرده بودیم. حالا قاعده ثابت ماست: بعد از پاک کردن یک صفحه، یک دقیقه صبر می کنیم و بعد بررسی می کنیم، و اگر بلافاصله بعد از پاک سازی چیزی درست به نظر نرسید، اول به ساعت نگاه می کنیم و بعد به کد.

سوال هایی که واقعا پرسیده می شوند

چند تا افزونه کش لازم دارم؟

یکی. دو افزونه کش صفحه روی یک سایت با هم دعوا می کنند و نتیجه اش صفحه هایی است که گاهی به روز می شوند و گاهی نه، و پیدا کردن مقصر تقریبا غیرممکن است. کش شی افزونه جداگانه ای است و با کش صفحه تداخل ندارد؛ آن یکی را می شود همزمان داشت.

اگر سی دی ان دارم، باز هم کش صفحه لازم است؟

بله، چون هر دو یک جای خالی را پر می کنند. لبه فقط صفحه هایی را دارد که قبلا کسی خواسته و عمرشان تمام نشده؛ برای هر آدرسی که تازه است یا از لبه افتاده، درخواست به سرور شما می رسد و آنجا کش صفحه تصمیم می گیرد که پی اچ پی اجرا شود یا نه. سایتی که فقط لبه دارد، هر بار که لبه خالی باشد کندی کامل را می چشد.

عمر کش را روی چه عددی بگذارم؟

با یک سوال تصمیم بگیرید نه با یک عدد پیش فرض: اگر این صفحه یک ساعت قدیمی باشد، چه اتفاق بدی می افتد؟ برای یک مقاله جواب هیچ است، پس عمر طولانی بگذارید. برای صفحه ای که قیمت یا موجودی نشان می دهد جواب یک شکایت مشتری است، پس یا عمر را خیلی کوتاه کنید یا همان تکه را از کش بیرون بگذارید. فایل هایی که نامشان نسخه دارد استثنا هستند و می توانند یک سال بمانند، چون تغییرشان یعنی نام تازه.