کش آبجکت وردپرس چیست و چرا سایت شما به آن نیاز دارد
سایت وردپرسی شما برای نمایش هر صفحه، دهها کوئری به دیتابیس MySQL میزند. هر کوئری چند میلیثانیه زمان میبرد و وقتی ۵۰ بازدیدکننده همزمان وارد شوند، دیتابیس خفه میشود. نتیجه؟ TTFB بالای ۲ ثانیه و خطای «Error establishing a database connection».
کش آبجکت وردپرس دقیقاً همینجا وارد بازی میشود. بهجای اینکه وردپرس هر بار تنظیمات، گزینهها و کوئریهای تکراری را از دیتابیس بخواند، نتیجه را در حافظه نگه میدارد. دفعه بعد، جواب را از حافظه میگیرد. ساده است. اما تفاوتش چشمگیر است.
تست من روی یک سایت آزمایشی با ۲۰ پلاگین فعال: بدون کش، هر درخواست ۴۲۰ میلیثانیه زمان پاسخ میداد. با کش آبجکت Redis، همین عدد به ۹۸ میلیثانیه رسید. بیش از ۴ برابر سریعتر. این عدد را کجا میبینید؟ در ابزارهایی مثل GTmetrix یا ابزارهای رایگان سرورنت که زمان پاسخ سرور را جدا از زمان لود مرورگر نشان میدهند.
Redis دقیقاً چه چیزی را کش میکند
خیلیها فکر میکنند کش آبجکت یعنی کش کردن کل صفحه HTML. اشتباه است. کش آبجکت لایهای پایینتر کار میکند و این چیزها را ذخیره میکند:
- گزینههای جدول wp_options — همانجا که تنظیمات سایت، پلاگینها و تم ذخیره میشود
- کوئریهای تکراری دیتابیس که نتیجهشان در بازه زمانی کوتاه تغییر نمیکند
- آبجکتهای PHP مثل session و دادههای موقت پلاگینها
- خروجی توابع سنگین مثل wp_nav_menu یا get_sidebar که هر بار از نو ساخته میشوند
نکته مهم: کش آبجکت با کش صفحه (Page Cache) فرق دارد. کش صفحه مثل W3 Total Cache یا WP Super Cache، خروجی نهایی HTML را ذخیره میکند. کش آبجکت زیر آن کار میکند و به وردپرس کمک میکند صفحه را سریعتر بسازد. اگر کش صفحه دارید، کش آبجکت را هم اضافه کنید. این دو مکملاند، نه جایگزین.
Redis یا Memcached؟
هر دو گزینه رایگان و محبوباند. اما Redis برنده است. چرا؟ چون دادهها را روی دیسک هم ذخیره میکند (persistence) و اگر سرویس ریاستارت شود، کش از بین نمیرود. Memcached همهچیز را در RAM نگه میدارد و با یک ریاستارت، همهچیز پاک میشود. برای سایتهای پربازدید، این تفاوت یعنی چند دقیقه بار سنگین روی دیتابیس بعد از هر ریاستارت.
Redis ساختار داده غنیتری هم دارد: لیست، ست، هش. پلاگینهای کش وردپرس مثل Redis Object Cache از این امکانات استفاده میکنند. انتخاب من Redis است. اگر هاست شما فقط Memcached بدهد، همان بهتر از هیچ است، اما اگر انتخاب دارید، Redis را بگیرید.
راهاندازی کش آبجکت وردپرس با Redis روی هاست اشتراکی
روی هاست اشتراکی، شما دسترسی root ندارید و نمیتوانید Redis را نصب کنید. پس باید از Redis ای که هاستینگ فراهم کرده استفاده کنید. اول بررسی کنید که آیا اصلاً Redis روی هاست شما فعال است یا نه. یک فایل PHP بسازید با این محتوا و اجرایش کنید:
<?php
$redis = new Redis();
try {
$redis->connect('127.0.0.1', 6379);
echo 'Connected: ' . $redis->ping();
} catch (Exception $e) {
echo 'Error: ' . $e->getMessage();
}
?>
اگر خروجی «Connected: +PONG» دیدید، Redis فعال است. اگر خطای Connection refused گرفتید، دو احتمال دارد: Redis نصب نیست، یا روی پورت و آدرس دیگری است. در هاست اشتراکی، بعضی شرکتها Redis را روی سوکت یونیکس یا پورت غیراستاندارد سرو میدهند. از پشتیبانی هاستینگ آدرس دقیق را بپرسید.
اینجا اشتباه میکنند: خیلیها پلاگین Redis Object Cache را نصب و فعال میکنند، اما یادشان میرود که کش را از صفحه تنظیمات پلاگین «فعال» کنند. پلاگین نصب میشود، ولی کش کار نمیکند. سایت کند میماند و فکر میکنند Redis بیفایده است. بعد از نصب پلاگین، حتماً به صفحه Settings → Redis بروید و دکمه Enable Object Cache را بزنید. اگر این دکمه را نبینید، یعنی پلاگین نتوانسته به Redis وصل شود.
نصب و پیکربندی قدمبهقدم
- از پیشخوان وردپرس، پلاگین Redis Object Cache را نصب و فعال کنید. این پلاگین رایگان است و بیش از ۶۰۰ هزار نصب فعال دارد.
- به صفحه Settings → Redis بروید. اگر اتصال برقرار شده باشد، وضعیت «Connected» را میبینید.
- دکمه Enable Object Cache را بزنید.
- برای اطمینان، کش را تست کنید: یک بار سایت را باز کنید، بعد صفحه تنظیمات پلاگین را رفرش کنید. شمارنده Hit Count باید بالا برود.
اگر هاست شما اجازه نصب پلاگینهای خاص را نمیدهد یا با خطای «Predis\Connection\ConnectionException» مواجه شدید، احتمالاً پسوردی برای Redis تعریف شده که پلاگین نمیداند. در فایل wp-config.php این خط را اضافه کنید:
define('WP_REDIS_PASSWORD', 'your_redis_password');
و اگر پورت غیراستاندارد است:
define('WP_REDIS_PORT', 6380);
چقدر تفاوت میکند؟ اعداد واقعی
بیایید صادق باشیم. کش آبجکت معجزه نمیکند. اگر سایت شما مشکل کد نویسی ضعیف یا تصاویر سنگین دارد، کش آبجکت فقط بخشی از مشکل را حل میکند. اما برای سایتهای وردپرسی استاندارد، اعداد من اینهاست:
| سناریو | بدون کش آبجکت | با کش آبجکت Redis |
|---|---|---|
| تعداد کوئری به دیتابیس | ۴۰ تا ۸۰ | ۵ تا ۱۵ |
| TTFB (زمان تا اولین بایت) | ۴۰۰ تا ۷۰۰ میلیثانیه | ۸۰ تا ۱۵۰ میلیثانیه |
| مصرف CPU سرور | بالا | کم |
این ارقام روی هاست اشتراکی معمولی به دست آمده، نه سرور اختصاصی. نکته مهم: کش آبجکت تعداد کوئریها را کم میکند، نه زمان هر کوئری را. اگر دیتابیس شما خودش کند است (مثلاً روی دیسک HDD قدیمی)، کش آبجکت کمک میکند، اما ریشه مشکل را نمیکند.
یک نکته دیگر: اگر سایت شما ترافیک خیلی کمی دارد (مثلاً ۱۰۰ بازدید در روز)، کش آبجکت تفاوت محسوسی ایجاد نمیکند. چون کش وقتی ارزشمند است که درخواستهای تکراری زیاد باشد. برای سایت کمبازدید، اول کش صفحه را فعال کنید و بعد سراغ کش آبجکت بروید.
مشکلات رایج و راهحلها
کش آبجکت وردپرس بدون دردسر نیست. اینها را من دیدهام که واقعاً اتفاق میافتد:
خطای «Connection refused»
یعنی پلاگین نمیتواند به Redis وصل شود. اول بررسی کنید Redis روی هاست شما فعال است. در هاست اشتراکی، بعضی شرکتها Redis را فقط برای پلنهای خاص فعال میکنند. اگر پلن شما شامل Redis نیست، باید ارتقا دهید یا از کش آبجکت مبتنی بر فایل استفاده کنید.
کش قدیمی میماند و تغییرات اعمال نمیشود
این مشکل وقتی پیش میآید که پلاگینها یا تم شما از توابعی استفاده میکنند که وردپرس نمیداند باید کش را پاک کند. مثلاً یک پلاگین آمار بازدید که هر بار عدد را در گزینهها ذخیره میکند. راهحل: در تنظیمات Redis Object Cache، گزینه «Flush Cache» را بزنید یا از تابع wp_cache_flush() در فایل functions.php تم استفاده کنید.
تداخل با کش صفحه
بعضی پلاگینهای کش صفحه مثل W3 Total Cache خودشان کش آبجکت داخلی دارند. اگر هم پلاگین کش صفحه را با گزینه Redis فعال کنید و هم Redis Object Cache را نصب کنید، دو لایه کش روی هم سوار میشود و حافظه هدر میرود. انتخاب کنید: یا از کش آبجکت داخلی W3 Total Cache استفاده کنید، یا Redis Object Cache جداگانه. هر دو نه.
کش آبجکت روی هاست اشتراکی؛ محدودیتها
روی هاست اشتراکی، Redis معمولاً بین چند کاربر به اشتراک گذاشته میشود. یعنی حافظه Redis محدود است و ممکن است سایت شما فقط ۳۲ یا ۶۴ مگابایت از آن را بگیرد. اگر سایت شما بزرگ است و کش مدام پر میشود، ممکن است نرخ Hit پایین بیاید و کش بیاثر شود.
چطور بفهمید؟ در صفحه تنظیمات Redis Object Cache، آمار را ببینید. اگر Hit Rate زیر ۷۰٪ است، یعنی کش شما کوچک است یا دادهها زود از بین میروند. در این حالت، میتوانید فقط کش کردن گزینههای مهم را فعال کنید یا به هاست لینوکس با منابع اختصاصی مهاجرت کنید. این تصمیم را بر اساس عدد بدهید، نه احساس.
یک محدودیت دیگر: بعضی هاستهای اشتراکی Redis را روی همان سروری اجرا میکنند که سایت شما روی آن است. اگر یک کاربر دیگر روی همان سرور Redis را با کوئریهای سنگین اذیت کند، سایت شما هم کند میشود. این ریسک هاست اشتراکی است و راهحل قطعی ندارد جز مهاجرت به محیط اختصاصیتر.
چه زمانی کش آبجکت را غیرفعال کنیم
بله، مواردی هست که کش آبجکت دردسرساز میشود. اگر سایت شما از ووکامرس با موجودی لحظهای استفاده میکند و مشتریها گاهی تعداد موجودی اشتباه میبینند، احتمالاً کش آبجکت دادههای محصول را نگه داشته که زودتر از موعد بهروزرسانی نشده. ووکامرس معمولاً کش را مدیریت میکند، اما پلاگینهای شخص ثالث ممکن است درست کار نکنند.
اگر چنین خطایی دیدید، اول کش را فلاش کنید. اگر مشکل تکرار شد، برای آن صفحه خاص، کش را غیرفعال کنید. در Redis Object Cache میتوانید با تابع wp_cache_set با پارامتر expire=0، کش را برای داده خاص غیرفعال کنید. اما اگر کل سایت مشکل دارد، کش آبجکت را خاموش کنید و ریشه مشکل را در پلاگین پیدا کنید.
انتخاب من؟ برای ۹۰٪ سایتهای وردپرسی، کش آبجکت با Redis را فعال میکنم. برای سایتهای فروشگاهی سنگین با تراکنشهای لحظهای، اول تست میکنم و اگر تداخلی دیدم، برای صفحات خاص غیرفعالش میکنم. این یک ابزار است، نه یک جادو. باید رفتارش را بشناسید.
پرسشهای پرتکرار
کش آبجکت وردپرس با کش صفحه چه فرقی دارد؟
کش صفحه خروجی نهایی HTML را ذخیره میکند و مستقیم به مرورگر میفرستد. کش آبجکت دادههای میانی مثل گزینهها و کوئریها را در حافظه نگه میدارد تا وردپرس صفحه را سریعتر بسازد. این دو مکملاند و هر دو را میتوان همزمان فعال کرد.
آیا کش آبجکت Redis روی همه هاستهای اشتراکی کار میکند؟
نه. Redis باید روی سرور نصب و فعال باشد. بعضی هاستها فقط Memcached دارند و بعضی هیچکدام را ندارند. قبل از نصب پلاگین، با پشتیبانی هاستینگ تماس بگیرید یا با اسکریپت تست PHP که در این مقاله آمده بررسی کنید.
کش آبجکت چقدر سرعت سایت را زیاد میکند؟
در تستهای من، TTFB از حدود ۵۰۰ میلیثانیه به ۱۰۰ میلیثانیه رسیده، یعنی حدود ۴ برابر سریعتر. اما این عدد به تعداد پلاگینها، کیفیت کد و حجم دیتابیس بستگی دارد. سایتهای سبک تفاوت کمتری میبینند.
بعد از فعالسازی کش آبجکت، تغییرات سایت دیده نمیشود. چطور کش را پاک کنم؟
از صفحه Settings → Redis در پیشخوان وردپرس، دکمه Flush Cache را بزنید. اگر به پیشخوان دسترسی ندارید، از phpMyAdmin تابع wp_cache_flush را اجرا کنید یا فایل object-cache.php را از پوشه wp-content حذف کنید تا کش غیرفعال شود.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!