آموزشآموزش‌های تکی

آموزش تکی، حدود ۳۰ دقیقه خواندن

آبجکت کش چیه

جواب کوتاه

آبجکت کش (Object Cache) یعنی نگه داشتن جواب سوال‌های تکراری دیتابیس توی رم، تا دفعه‌ی بعد که همون سوال پرسیده شد، به‌جای رفتن سراغ دیتابیس، جواب آماده از رم برداشته بشه. توی وردپرس، اگه این کش «ماندگار» باشه، یعنی با ابزاری مثل ردیس بین درخواست‌ها بمونه، سایت‌های پرسوال مثل فروشگاه‌ها خیلی سریع‌تر می‌شن.

اسم

اگه با وردپرس کار کرده باشید، احتمالا یه جا دیدید «آبجکت کش ماندگار پیشنهاد می‌شه»، یا افزونه‌ای که می‌گه «Object Cache رو روشن کنید». Object یعنی «شیء» و Cache یعنی «انبار دم دست»؛ جایی که چیزی رو نگه می‌دارید تا دفعه‌ی بعد سریع‌تر بهش برسید.

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

چرا لازمه

هر بار که یه صفحه‌ی وردپرس ساخته می‌شه، وردپرس ده‌ها و گاهی صدها سوال از دیتابیس می‌پرسه. «تنظیمات سایت چیه؟»، «این نوشته چیه؟»، «نویسنده‌ش کیه؟»، «توی چه دسته‌هاییه؟»، «منو چه آیتم‌هایی داره؟»، «این محصول چند تا موجودی داره؟». هر سوال یه کم وقت و یه کم کار پردازنده می‌خواد.

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

دفترچه‌ی کنار تلفن

مثلا فرض کنید توی یه دفتر کار می‌کنید و تلفن زیاد زنگ می‌زنه. مردم سوال‌هایی می‌پرسن که جوابش توی بایگانی ته راهروئه. بار اول بلند می‌شید، می‌رید بایگانی، پرونده رو پیدا می‌کنید و جواب می‌دید. ولی آدم باهوش، جواب رو توی یه دفترچه‌ی کنار تلفن هم یادداشت می‌کنه.

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

شیء یعنی چی

توی برنامه‌نویسی، «شیء» یعنی یه بسته‌ی آماده از داده. مثلا یه نوشته‌ی وبلاگ، توی دیتابیس چند تا ردیف پراکنده‌ست؛ عنوان یه جا، متن یه جا، تاریخ یه جا، دسته‌ها توی یه جدول دیگه. وردپرس این‌ها رو جمع می‌کنه و یه بسته‌ی مرتب می‌سازه به اسم «شیء نوشته».

آبجکت کش همین بسته‌ی آماده رو نگه می‌داره. یعنی نه‌تنها سوال دیتابیس رو دوباره نمی‌پرسه، بلکه کار جمع کردن و مرتب کردن رو هم دوباره انجام نمی‌ده. به‌جز نوشته‌ها، کاربرها، تنظیمات، دسته‌ها، منوها و نتیجه‌ی خیلی از سوال‌های افزونه‌ها هم شیء‌ان و می‌تونن توی این کش بمونن.

بود یا نبود

هر بار که وردپرس یه چیزی رو از کش می‌خواد، دو حالت پیش میاد:

برخورد (hit): جواب همون لحظه.
از دست رفتن (miss): یه بار زحمت، بعد یادداشت.

اگه جواب توی دفترچه باشه، بهش می‌گن hit، یعنی «برخورد»؛ جواب همون لحظه داده می‌شه. اگه نباشه، بهش می‌گن miss، یعنی «از دست رفتن»؛ وردپرس می‌ره سراغ دیتابیس، جواب رو می‌گیره، و همون جواب رو توی کش هم می‌ذاره تا دفعه‌ی بعد hit بشه.

به این روش می‌گن cache-aside، یعنی «کش کنار دست»: برنامه اول کش رو نگاه می‌کنه، اگه نبود از منبع اصلی می‌گیره و توی کش می‌ذاره. عددی که می‌گه کش چقدر خوب کار می‌کنه، «نرخ برخورد»‌ئه (hit ratio)؛ از هر صد بار پرسیدن، چند بار جواب توی کش بوده. روی یه سایت وردپرس با کش ماندگار خوب، این عدد معمولا بالای ۹۰ درصده.

موقت یا ماندگار

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

کش موقت: فقط تا آخر همون درخواست.
کش ماندگار: با ردیس یا Memcached، بین درخواست‌ها.

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

کش ماندگار (persistent) یعنی دفترچه بین درخواست‌ها بمونه. برای این کار، وردپرس باید یادداشت‌ها رو جای دیگه‌ای بذاره که با تموم شدن درخواست پاک نشه؛ یه برنامه‌ی جدا که توی رم کار می‌کنه، مثل ردیس یا Memcached. وقتی کسی می‌گه «آبجکت کش رو روشن کن»، منظورش همین کش ماندگاره.

فایل object-cache.php

وردپرس یه در پشتی گذاشته برای این کار. اگه توی پوشه‌ی wp-content یه فایل به اسم object-cache.php باشه، وردپرس به‌جای کش موقت خودش، از اون فایل استفاده می‌کنه. به این جور فایل‌ها می‌گن drop-in، یعنی «چیزی که جا می‌اندازید و جای یه تیکه از خود وردپرس رو می‌گیره».

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

ابزارها

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

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

یه برگه از دفترچه

هر یادداشت توی آبجکت کش چهار تا تیکه داره:

کلید اسمیه که یادداشت باهاش پیدا می‌شه، مثلا «نوشته‌ی ۴۲». گروه مثل فصل‌های دفترچه‌ست؛ نوشته‌ها یه گروه، کاربرها یه گروه، تنظیمات یه گروه. گروه کمک می‌کنه دو تا کلید هم‌اسم با هم قاطی نشن، و بشه یه فصل کامل رو با هم کنار گذاشت. مقدار خود داده‌ست، و انقضا می‌گه این یادداشت تا کی معتبره.

وردپرس بعضی گروه‌ها رو «غیرماندگار» علامت زده؛ یعنی حتی وقتی کش ماندگار روشنه، اون‌ها فقط توی همون درخواست می‌مونن. مثلا چیزهایی که برای هر بازدید فرق دارن، یا نگه داشتنشون بین درخواست‌ها ممکنه داده‌ی اشتباه نشون بده.

انقضا

هر یادداشت می‌تونه یه زمان انقضا داشته باشه؛ TTL، کوتاه‌شده‌ی Time To Live، یعنی «زمان زنده بودن». مثلا «این جواب رو یه ساعت نگه دار». بعد از یه ساعت، یادداشت دیگه معتبر نیست و دفعه‌ی بعد دوباره از دیتابیس پرسیده می‌شه.

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

یادداشت کهنه

سخت‌ترین بخش هر کشی اینه که بدونی یادداشت کی کهنه شده. فرض کنید عنوان نوشته‌ی ۴۲ رو عوض کردید. اگه یادداشت قدیمی توی دفترچه بمونه، بازدیدکننده‌ها عنوان قدیمی رو می‌بینن. به پاک کردن یادداشت کهنه می‌گن invalidation، یعنی «باطل کردن».

وردپرس این کار رو برای چیزهای خودش انجام می‌ده؛ وقتی یه نوشته ذخیره می‌شه، یادداشت‌های مربوط به اون نوشته پاک می‌شن. مشکل از جایی شروع می‌شه که یه افزونه یا یه کد، مستقیم دیتابیس رو عوض کنه و به کش خبر نده. اون‌وقت سایت تا انقضای یادداشت، یا تا پاک شدن دستی کش، داده‌ی قدیمی نشون می‌ده. برای همین وقتی کسی می‌گه «بعد از فلان کار، سایت تغییر رو نشون نمی‌ده»، یکی از اولین کارها پاک کردن آبجکت کشه.

یه جمله‌ی معروف بین برنامه‌نویس‌ها هست که می‌گه دو تا کار توی برنامه‌نویسی سخته، و یکیش باطل کردن کشه. این شوخی نیست؛ بیشتر باگ‌های عجیب سایت‌های کش‌دار از همین‌جا میان.

transient

وردپرس یه ابزار دیگه هم داره به اسم transient، یعنی «گذرا». transient یه یادداشت با زمان انقضاست که افزونه‌ها برای نگه داشتن نتیجه‌ی کارهای سنگین ازش استفاده می‌کنن؛ مثلا نتیجه‌ی یه درخواست به یه سرویس بیرونی، یا یه حساب پیچیده.

نکته‌ی جالب اینه که transient دو تا خونه داره. اگه کش ماندگار نباشه، وردپرس transientها رو توی جدول تنظیمات دیتابیس (wp_options) می‌ذاره. یعنی برای نگه داشتن یه چیز سریع، می‌ره سراغ همون دیتابیس. ولی اگه کش ماندگار روشن باشه، transientها مستقیم توی ردیس یا Memcached می‌رن، و دیتابیس سبک‌تر می‌شه. خیلی از سایت‌های قدیمی هزاران transient منقضی‌شده توی جدول تنظیماتشون دارن که فقط جا گرفتن و همه‌چیز رو کند می‌کنن.

تنظیمات همیشه‌بار

توی جدول تنظیمات وردپرس، بعضی تنظیم‌ها علامت autoload دارن، یعنی «همیشه بار کن». وردپرس توی هر درخواست، همه‌ی این‌ها رو با یه سوال از دیتابیس می‌گیره و توی کش می‌ذاره، به اسم alloptions.

اگه افزونه‌ها چیزهای بزرگ رو با این علامت ذخیره کنن، این بسته می‌تونه چند مگابایت بشه. اون‌وقت هر درخواست باید این چند مگابایت رو جابه‌جا کنه، چه از دیتابیس، چه از کش. با کش ماندگار، این بسته یه تیکه‌ی خیلی بزرگ توی ردیس می‌شه که مدام خونده می‌شه. برای همین یکی از کارهای مهم بهینه‌سازی، کوچیک کردن همین تنظیمات همیشه‌باره. وردپرس از نسخه‌ی ۶٫۶ وقتی یه تنظیم خیلی بزرگ باشه، خودش اون رو همیشه‌بار نمی‌کنه، ولی تنظیمات قدیمی سر جاشون می‌مونن.

انواع کش

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

  1. کش مرورگرروی گوشی خود خواننده؛ عکس و فایل‌ها
  2. CDNسرورهای نزدیک خواننده؛ فایل‌ها و گاهی صفحه
  3. کش صفحهکل صفحه‌ی آماده، روی سرور
  4. آبجکت کشجواب سوال‌های دیتابیس، توی رم
  5. OPcacheکد PHP ترجمه‌شده، توی رم

کش مرورگر یعنی خود گوشی خواننده عکس‌ها و فایل‌ها رو نگه داره. CDN، کوتاه‌شده‌ی Content Delivery Network، یعنی «شبکه‌ی رسوندن محتوا»؛ سرورهایی نزدیک خواننده که فایل‌ها رو نگه می‌دارن. کش صفحه کل صفحه‌ی آماده رو روی سرور نگه می‌داره؛ وقتی کار می‌کنه، اصلا نه PHP اجرا می‌شه، نه دیتابیس سوال می‌شه. آبجکت کش یه لایه پایین‌تره؛ صفحه ساخته می‌شه، ولی با تیکه‌های آماده. OPcache هم کد PHP ترجمه‌شده رو نگه می‌داره تا هر بار از اول خونده و ترجمه نشه.

این‌ها جای هم رو نمی‌گیرن، کنار هم کار می‌کنن. یه سایت وردپرس خوب‌تنظیم‌شده معمولا همه‌شون رو داره.

کی کمک می‌کنه

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

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

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

هشدار سلامت سایت

از وردپرس ۶٫۱، توی ابزار «سلامت سایت» یه پیشنهاد تازه اومد: «باید از کش ماندگار شیء استفاده کنید». این پیشنهاد برای همه نشون داده نمی‌شه. وردپرس چند تا عدد رو نگاه می‌کنه، مثل تعداد نوشته‌ها، کاربرها، تنظیمات و اندازه‌ی تنظیمات همیشه‌بار، و اگه سایت از یه حد بزرگ‌تر باشه، این پیشنهاد رو نشون می‌ده.

اگه این پیشنهاد رو دیدید، یعنی وردپرس فکر می‌کنه سایت شما اون‌قدر بزرگ شده که از کش ماندگار سود ببره. خود وردپرس هم می‌گه کدوم ابزار روی سرور شما در دسترسه. اگه هیچ‌کدوم نیست، یعنی هاست شما ردیس یا Memcached نداره، و این پیشنهاد رو بدون عوض کردن سرور نمی‌شه کامل انجام داد.

دفترچه‌ی پر

رم بی‌نهایت نیست. معمولا به ردیس یا Memcached یه سقف می‌دن، مثلا ۲۵۶ مگابایت. وقتی پر شد، باید یه یادداشت قدیمی بیرون بره تا یادداشت تازه جا بشه. به این کار می‌گن eviction، یعنی «بیرون انداختن».

رایج‌ترین روش LRU‌ئه، کوتاه‌شده‌ی Least Recently Used، یعنی «اونی که از همه دیرتر استفاده شده». مثل اینکه از دفترچه‌ی پر، برگه‌ای رو بکنید که مدت‌هاست بهش نگاه نکردید. برای آبجکت کش، ردیس باید طوری تنظیم بشه که بیرون انداختن رو بلد باشه؛ وگرنه وقتی پر شد، به‌جای جا باز کردن، خطا می‌ده و نوشتن رو قبول نمی‌کنه.

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

پاک کردن همه و گرم کردن

خیلی از افزونه‌ها یه دکمه دارن که کل آبجکت کش رو پاک می‌کنه. گاهی لازمه، مثلا بعد از جابه‌جا کردن سایت یا وقتی داده‌ی کهنه گیر کرده. ولی بدونید که بعدش دفترچه خالیه و همه‌ی سوال‌ها دوباره miss می‌شن. به کشی که تازه خالی شده می‌گن «کش سرد».

روی یه فروشگاه شلوغ، چند دقیقه‌ی بعد از پاک کردن کل کش، دیتابیس یهو کار زیادی می‌گیره، تا کش دوباره پر بشه. به این پر شدن می‌گن «گرم شدن کش». بعضی‌ها بعد از پاک کردن، با یه برنامه‌ی کوچیک صفحه‌های اصلی رو یه دور باز می‌کنن تا کش پیش از اومدن آدم‌ها گرم بشه. برای همین بهتره کل کش رو وسط شلوغ‌ترین ساعت پاک نکنید.

وردپرس از نسخه‌ی ۶٫۱ می‌تونه به‌جای کل کش، فقط یه گروه رو پاک کنه، البته اگه ابزار کش ماندگار این رو بلد باشه. این خیلی دقیق‌تره؛ مثل اینکه به‌جای دور انداختن کل دفترچه، فقط یه فصلش رو بکنید.

بسته‌بندی و راه ارتباط

ردیس و Memcached فقط متن و عدد می‌فهمن، نه شیء‌های PHP. پس وردپرس پیش از گذاشتن هر شیء توی کش، اون رو به یه رشته‌ی متن تبدیل می‌کنه، و موقع برداشتن، دوباره به شیء برمی‌گردونه. به این کار می‌گن serialization، یعنی «پشت سر هم چیدن». شیء بزرگ‌تر، بسته‌بندی سنگین‌تر.

برای همین بعضی سرورها یه روش بسته‌بندی فشرده‌تر برای PHP نصب می‌کنن، که بسته‌ها رو کوچیک‌تر و باز کردنشون رو سریع‌تر می‌کنه. بعضی‌ها هم یادداشت‌ها رو پیش از فرستادن فشرده می‌کنن، که رم کمتری بخوره.

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

هجوم یه‌باره

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

به این می‌گن cache stampede، یعنی «هجوم به کش». دیتابیس یهو صد برابر کار می‌گیره و ممکنه بخوابه. راه حل‌هاش اینه که فقط اولین نفر حساب کنه و بقیه چند لحظه صبر کنن، یا یادداشت کمی پیش از انقضا پشت صحنه تازه بشه، یا انقضاها یه کم تصادفی باشن تا همه با هم تموم نشن. افزونه‌ها و کدهای خوب این رو در نظر می‌گیرن؛ برای همین گاهی یه سایت با کش هم سر ساعت‌های مشخص کند می‌شه.

روی هاست اشتراکی

بعضی هاست‌های اشتراکی می‌گن «ردیس داریم». ولی وقتی صدها سایت روی یه سرورن، دو تا مشکل پیش میاد. اول اینکه رم ردیس بین همه شریکه؛ سایت‌های پرکار یادداشت‌های بقیه رو بیرون می‌اندازن و نرخ برخورد شما پایین میاد. دوم امنیت؛ اگه همه به یه ردیس وصل باشن و هر سایت فقط با یه پیشوند اسم از بقیه جدا بشه، هر سایتی که هک بشه، می‌تونه یادداشت‌های سایت‌های دیگه رو بخونه یا عوض کنه.

توی وردپرس، برای جدا کردن کلیدهای سایت‌ها از هم، یه تنظیم هست به اسم WP_CACHE_KEY_SALT که یه پیشوند به همه‌ی کلیدها اضافه می‌کنه. این جلوی قاطی شدن یادداشت‌ها رو می‌گیره، ولی دیوار امنیتی نیست. جدا کردن واقعی یعنی هر سایت ردیس خودش رو داشته باشه، با رمز خودش، یا دست‌کم پایگاه داده‌ی جدا با دسترسی جدا. روی سرور خودتون، این کار ساده‌ست و ردیس فقط مال سایت شماست.

چند سرور، یه دفترچه

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

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

بیرون از وردپرس

آبجکت کش فقط مال وردپرس نیست. تقریبا هر چارچوب برنامه‌نویسی وب، یه لایه‌ی کش داره که همین کار رو می‌کنه؛ جواب سوال‌های سنگین رو با یه کلید توی ردیس یا Memcached نگه می‌داره. روش هم همون cache-aside‌ئه که بالاتر دیدید.

فرقش اینه که توی پروژه‌ی اختصاصی، خود برنامه‌نویس تصمیم می‌گیره چی کش بشه و کی باطل بشه. این هم قدرت بیشتری می‌ده، هم مسئولیت بیشتری؛ چون اشتباه توی باطل کردن، داده‌ی کهنه نشون می‌ده. توی وردپرس، بیشتر این تصمیم‌ها رو خود وردپرس و افزونه‌ها گرفتن، و شما فقط کش ماندگار رو روشن می‌کنید.

سنجیدن

از کجا بفهمید آبجکت کش واقعا کار می‌کنه؟ چند راه هست. افزونه‌ای که فایل object-cache.php رو گذاشته، معمولا یه صفحه‌ی وضعیت داره که می‌گه وصله یا نه، و نرخ برخورد چنده. ابزارهای اشکال‌یابی وردپرس هم می‌تونن تعداد سوال‌های دیتابیس هر صفحه رو نشون بدن؛ یه بار با کش خاموش ببینید، یه بار با کش روشن.

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

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

روشن کردن

روی سرور خودتون، روشن کردن آبجکت کش برای وردپرس این قدم‌ها رو داره:

  1. اول ردیس رو روی سرور نصب کنید، با یه سقف رم و روش بیرون انداختن، و فقط روی خود سرور گوش بده، نه روی اینترنت.
  2. بعد افزونه‌ی PHP مربوط به ردیس رو نصب کنید تا PHP بتونه باهاش حرف بزنه.
  3. بعد یه افزونه‌ی کش ردیس وردپرس نصب کنید و از تنظیماتش کش رو روشن کنید؛ این کار فایل object-cache.php رو می‌سازه.
  4. بعد توی wp-config.php یه پیشوند کلید بذارید، مخصوصا اگه چند سایت روی یه سرور هستن.
  5. و آخر، صفحه‌ی وضعیت افزونه و سلامت سایت رو نگاه کنید که بگه وصله.

روی هاست اشتراکی، معمولا فقط قدم سوم دست شماست، و اینکه بقیه چطور تنظیم شدن رو نمی‌دونید.

کمی تاریخ

Memcached سال ۲۰۰۳ برای یه سایت شبکه‌ی اجتماعی خیلی شلوغ ساخته شد، که دیتابیسش زیر بار سوال‌های تکراری کم آورده بود. ایده‌ش ساده بود: چند تا سرور با رم زیاد، که جواب‌ها رو نگه دارن. خیلی زود سایت‌های بزرگ دیگه هم ازش استفاده کردن.

وردپرس از نسخه‌ی ۲٫۰ در سال ۲۰۰۵ آبجکت کش داشت، که اول یادداشت‌ها رو توی فایل روی دیسک نگه می‌داشت. این روش روی خیلی از هاست‌ها مشکل می‌ساخت، و در نسخه‌ی ۲٫۵ (۲۰۰۸) برداشته شد. از اون به بعد، کش داخلی وردپرس فقط موقت شد و کش ماندگار به فایل drop-in سپرده شد. ردیس هم سال ۲۰۰۹ اومد و کم‌کم انتخاب اصلی کش ماندگار شد. هشدار سلامت سایت هم که گفتیم، سال ۲۰۲۲ با وردپرس ۶٫۱ اضافه شد.

تمرین

  1. توی پیشخوان وردپرس، ابزارها، سلامت سایت رو باز کنید و ببینید پیشنهاد کش ماندگار رو داره یا نه.
  2. ببینید توی پوشه‌ی wp-content فایل object-cache.php هست یا نه.
  3. اگه فروشگاه دارید، زمان باز شدن سبد خرید رو یه بار پیش و یه بار بعد از روشن کردن کش ماندگار اندازه بگیرید.

اشتباه‌های رایج

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

جمع‌بندی. آنچه از این درس با خودتان می‌برید.

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

خودتون رو بسنجید

۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو می‌بینید: چند تا درست، چند تا نادرست.

خودتون رو بسنجید

۱۵ پرسش

  • هر بار پرسش‌ها و ترتیب گزینه‌ها عوض می‌شه.
  • تا آخر نمی‌گیم کدوم جواب درست بوده؛ می‌تونید برگردید و جوابتون رو عوض کنید.
  • آخرش کارنامه می‌گیرید: چند تا درست، چند تا نادرست.
  • اگه وسطش بستید، دوباره که باز کنید از همون‌جا ادامه می‌دید.

فصل‌های این درس