اگه متوجه شدید که حجم دیتابیس انجمنتون یهو و بدون دلیل مشخصی زیاد شده، و بعد از چک کردن دیدید که جدول xf_search مقصر اصلیه (گاهی حتی چند صد مگابایت تا چند گیگابایت!)، این راهنما براتون کاربردیه.
هر بار کسی توی انجمن سرچ میزنه، نتیجهی اون سرچ بهصورت یک ردیف (شامل دادهی سریالایزشده از نتایج) توی این جدول ذخیره میشه تا صفحهبندی نتایج سریعتر انجام بشه. چند تا دلیل رایج برای حجیم شدن غیرعادی این جدول:
ACP > Tools > Rebuild Search Index
و همچنین دستور OPTIMIZE TABLE xf_search; معمولاً کمکی نمیکنن، چون اینها روی جدول xf_search_index اثر میذارن، نه روی جدول کش (xf_search) که مشکل واقعی اونجاست.
بعد از اجرا، حجم جدول فوراً به حالت قبل برمیگرده و دیتابیس به حجم واقعی خودش میرسه. تنها اثرش اینه که کاربرا باید دوباره سرچ کنن، همین.
اگه پنل هاستتون حجم دیتابیس رو با تأخیر نشون میده (مثلاً phpMyAdmin درست شده ولی آمار هاست هنوز عدد قدیمی رو داره)، نگران نباشید این معمولاً بهخاطر کش آمار مصرف دیسک هاستینگه و خودش تا ۲۴ ساعت آپدیت میشه.
برای جلوگیری از تکرار مشکل، برید به:
ACP > Tools > عملیات برنامهریزیشده (Cron Entries)
دنبال گزینهی «Rebuild expired search forum caches» بگردید و مطمئن بشید:
این کار رو فقط در صورتی انجام بدید که واقعاً به حمله یا ترافیک غیرعادی مشکوکید، چون غیرفعال کردن سرچ برای مهمانها روی تجربهی کاربری و حتی سئوی انجمن (در بعضی موارد) اثر میذاره. اگه صرفاً یه انباشتگی عادی و طبیعی بوده (که با کرون فعال دیگه تکرار نمیشه)، نیازی به این کار نیست.
علائم مشکل
- حجم کلی دیتابیس انجمن بدون افزایش محتوای متناسب، بهشدت بالا رفته
- با چک کردن جداول از طریق phpMyAdmin، جدول xf_search حجم غیرعادی و بزرگی داره (حتی اگه تعداد ردیفهاش خیلی زیاد نباشه، چون حجم بالا)
- xf_search_index → ایندکس اصلی محتوای انجمن برای جستجو
- xf_search → کش نتایج جستجوهای انجامشده توسط کاربران و مهمانها
چرا این جدول حجیم میشه؟
هر بار کسی توی انجمن سرچ میزنه، نتیجهی اون سرچ بهصورت یک ردیف (شامل دادهی سریالایزشده از نتایج) توی این جدول ذخیره میشه تا صفحهبندی نتایج سریعتر انجام بشه. چند تا دلیل رایج برای حجیم شدن غیرعادی این جدول:
- سرچهای عمومی یا خیلی پرنتیجه - اگه کسی کلمهای بسیار رایج یا حتی سرچ خالی زده باشه که خروجیش تقریباً کل محتوای انجمنه، همون یک ردیف میتونه چندین مگابایت تا حتی چند صد مگابایت فضا بگیره.
- ترافیک بالای سرچ توسط مهمانها (Guest) - اگه امکان جستجو برای کاربران مهمان فعال باشه، هر بازدیدکننده (از جمله رباتها و اسکرپرها) میتونه ردیف جدید توی این جدول ایجاد کنه.
- حمله یا اسکرپینگ خودکار - رباتهایی که مدام صفحهی سرچ رو با کوئریهای تصادفی یا متفاوت هدف میگیرن، میتونن در مدت کوتاه این جدول رو غولپیکر کنن.
- کرونجاب پاکسازی که بهدرستی اجرا نمیشه - زنفورو یه وظیفهی زمانبندیشده به اسم «Rebuild expired search forum caches» داره که باید این جدول رو بهصورت دورهای پاکسازی کنه. اگه به هر دلیلی (مشکل کرون سرور هاست و...) این کرون درست اجرا نشه، جدول بدون کنترل رشد میکنه.
راهحل
نکته مهم قبل از شروع
- حتماً قبل از هر تغییری از دیتابیس بکآپ بگیرید.
- عملیات زیر کاملاً امنه و هیچ پست/تاپیک/محتوایی حذف نمیشه، چون xf_search فقط یک جدول کش موقته.
مرحله ۱ - چیزی که معمولاً جواب نمیده
گزینه «بازسازی ایندکس جستجو» از مسیر:ACP > Tools > Rebuild Search Index
و همچنین دستور OPTIMIZE TABLE xf_search; معمولاً کمکی نمیکنن، چون اینها روی جدول xf_search_index اثر میذارن، نه روی جدول کش (xf_search) که مشکل واقعی اونجاست.
مرحله ۲ - راهحل قطعی: خالی کردن جدول کش
از طریق phpMyAdmin:- دیتابیس انجمنتون رو انتخاب کنید
- برید به تب SQL
- این کوئری رو اجرا کنید:
کد:
TRUNCATE TABLE xf_search;
بعد از اجرا، حجم جدول فوراً به حالت قبل برمیگرده و دیتابیس به حجم واقعی خودش میرسه. تنها اثرش اینه که کاربرا باید دوباره سرچ کنن، همین.
مرحله ۳ - چک کردن کرونجاب مربوطه
برای جلوگیری از تکرار مشکل، برید به:
ACP > Tools > عملیات برنامهریزیشده (Cron Entries)
دنبال گزینهی «Rebuild expired search forum caches» بگردید و مطمئن بشید:
- فعاله
- زمان «اجرای بعدی» بعد از گذشت زمانش، واقعاً جلو میره (یعنی کرون سرور هاست هم داره درست فایل cron.php زنفورو رو صدا میزنه)