یکی از مشکلاتی که بیشتر در سایتهای وردپرسی به وجود میاد و باعث بالا رفتن مصرف بیش از حد CPU هاست در وردپرس میشه توسط فایل admin-ajax.php وردپرس هست. در صورتی که مدت زیادی هست از وردپرس استفاده میکنید و احتمالا هم از ابزار تست سرعت در وردپرس استفاده کردید حتما با این خطا مواجه شدید. یا حتی ممکنه از طرف شرکت میزبانی وب که ازش هاست خریداری کردین، اخطاری مبنی بر مصرف بالای CPU در وردپرس دریافت کرده باشید. دلیل به وجود اومدن خطای مصرف بالای CPU در وردپرس توسط فایل admin-ajax.php بیشتر از سمت افزونههای شخص ثالث یا درخواستهایی مثل ذخیره خودکار پیش نویس در وردپرس که به صورت مرتب در پیشخوان وردپرس انجام میگیره به وجود میاد. پس مهمه که به این خطاها توجه کنید و هر زمان که با خطای مصرف بالای منابع CPU در هاست توسط وردپرس مواجه شدید و دیدید که این خطا از سمت فایل admin-ajax هست اونو برطرف کنید.
در این آموزش ما قصد داریم به معرفی راهکارهای مختلفی که برای حل مشکل مصرف بالای CPU در وردپرس توسط فایل admin-ajax.php قرار داره بپردازیم که با استفاده از این راهکارها میتونید به راحتی مشکل مصرف بالای cpu را در وردپرس برطرف کنید. پیش از این هم در مقاله دیگهای تحت عنوان آموزش رفع مشکل استفاده زیاد از منابع CPU در وردپرس به راههای مختلفی برای رفع مشکل مصرف بالای منابع در هاست پرداختم.
رفع مشکل مصرف بالای CPU در وردپرس توسط فایل admin-ajax
حالا ممکنه این سوال براتون پیش بیاد که اصلا فایل admin-ajax.php چیست؟ فایل admin-ajax.php وردپرس یکی از فایلهای هسته وردپرس هست که از نسخه 3.6 وردپرس به اون اضافه شده. هدف این فایل ایجاد ارتباط بین مرورگر و سرور هست که با استفاده از ajax این ارتباط برقرار میشود. این ارتباط کاری که انجام میده اینه که قابلیتهای پیشرفته مثل بهبود ذخیره سازی خودکار کارها در وردپرس، ردیابی رونوشتها، زمان تایم اوت ورود به وردپرس، مدیریت نشستها در وردپرس و اطلاعیههای یک نوشته مثل زمانی که نوشته قفل شده و توسط فرد دیگر در حال ویرایش هست را به شما خواهد داد. هر کدوم از این ویژگی های ذکر شده برای سایتهایی که چندین کاربر در اون فعالیت دارند به امری ضروری تبدیل شده است. به عنوان نمونه اگر همین حالت نمایش کاربران هنگام ویرایش یک نوشته نباشه ممکنه همزمان دو مدیر در حال ویرایش و تغییر روی یک نوشته باشند که باعث ایجاد مشکل در محتوای سایت و محصولات در وردپرس بشه.
ایده انجام این کار به این شکل هست که از هر 15 ثانیه درخواستهای XHR به سرور ارسال میشن و در نهایت با فرستان پاسخها به صورت callbacks نتیجه نمایش داده میشه. سپس سایر اجرا با هماهنگ سازی که بینشون ایجاد میشه در مورد فعالیتهای دیگر کاربران از این طریق اطلاع داده میشه. در نهایت همونطور که در بالا هم اشاره شد این کار باعث میشه تا ضمن اطلاع از اینکه یک کاربر در حال تغییر دادن یک نوشته، ابزارک و… هست قفل گذاری روی اون انجام بگیره و باعث نشه همزمان دو کاربر در حال ایجاد تغییرات باشند.
با این اوصاف حتما فکر میکنید که این یک کار ساده است، اما چرا در ابزارهای تست سرعت در وردپرس که انجام میدین با خطاهایی مواجه میشید؟
همونطور که در تصویر بالا میبینید در ابزار تست سرعت سایت مثل pingdom معمولا دو نتیجه از این سناریو دریافت خواهیم کرد. یکی در بخش جلویی و دیگری در front-end و دیگری در back-end که مربوط به بخش مدیریت و کاربری سایت هستند.
1. مصرف بالای CPU توسط admin-ajax بخاطر افزونهها
اولین و رایج ترین خطا که باعث به وجود اومدن خطای مصرف بالای CPU در وردپرس بخاطر فایل admin-ajax میشه از سمت افزونههای شخص ثالث نشات میگیره. این موضوع بیشتر در front-end وردپرس رخ میده که مربوط به همون بخش کاربری سایت هست و در تست سرعت سایت هم میبینیمش. دلیل به وجود اومدن خطا از سمت افزونهها هم بیشتر به این خاطر هست که توسعه دهندههای وردپرس از قابلیت ajax یا توسط همین فایل برای افزونههای خودشون استفاده میکنند تا قابلیتهایی رو به کاربران ارائه کنند. اما فقط به این دلیل که شما یک درخواست رو برای admin-ajax.php میبینید لزوما به این معنی نیست که سایت شما بخاطر این موضوع کند شده است. بعد از اینکه صفحات لود شدند قابلیت Ajax وردپرس شروع به کار میکنه و درخواست های خاصی رو به صورت ناهماهنگ اجرا و دریافت میکنه. پس اگر به درستی از این قابلیت توسط توسعه دهندههای وردپرس استفاده نشه باعث به وجود اومدن کندی در وردپرس میشه که نتیجه اون بالا رفتن مصرف منابع CPU خواهد بود.
در تصویر زیر نمونهای از تشخیص مشکل admin-ajax رو مشاهده میکنید که توسط سایت Gtmetrix بررسی شده، بخاطر اینکه بررسی با این سایت اجازه میده که دادههای حقیقی و واقعی رو به صورت واکنشگرا به دست بیاریم. در صورتی که استفاده از pingdom این قابلیت رو به ما نخواهد داد. پس اگر شما هم قصد تست و بررسی مشکل admin-ajax.php در وردپرس رو دارید بهتره از سایت gtmetrix برای این کار استفاده کنید. البته محدود به این دو سایت هم نیستید و میتونید از Google Chrome Devtools یا WebPageTest هم استفاده کنید.
در اینجا نمونه تستی انجام گرفته که دلیل اون بخاطر استفاده از افزونه ویژوال کامپوزر هست و باعث به وجود اومدن خطای admin-ajax.php در وردپرس شده و همونطور که میبینید بر اساس گزارش Gtmetrix بیشتر از 8 ثانیه در لود این فایل طول میکشه که این زمان برای لود خیلی زیاد هست و باعث کند شدن سایت خواهد شد.
در اینجا اگر شما روی درخواست POST admin-ajax.php کلیک کنید، میتونید سه زبانه مختلف را مشاهده کنید که شامل Headers، Post، و Response هستند. برای این سایت، ما میتونیم سرنخ مشکل را در برگه Response بدست بیاریم. با بررسی بخشی از این درخواست توسط “vc_shortcodes-custom-css” شروع میکنیم.
با انجام یک جستجوی ساده از این خطا میتونیم بفهمیم که این مشکل مربوط به افزونه ویژوال کامپوزر هست و از اون نشات میگره. این شاخصها چقدر گوگل رو شگفت زده میکنند.
حالا که مشخص شد مشکل از کدوم افزونه است در مرحله اول باید بررسی کنید و ببینید که این افزونه به آخرین نسخه آپدیت شده یا خیر؟ در صورتی که افزونه آپدیت نباشه به احتمال زیاد با آپدیت و بروزرسانی افزونه در وردپرس مشکل برطرف خواهد شد. اما در صورتی که افزونه آپدیت بود یا اینکه بعد از آپدیت هنوز هم مشکل پا برجا بود بهتره که با ارسال گزارش به سازنده موضوع رو به اطلاعشون برسونید تا با بررسی و رفع مشکل افزونه را آپدیت کنند.
رفع مشکل admin-ajax.php بخاطر افزونه هشدار وردپرس
مورد بعدی که بیشتر باعث به وجود اومدن خطای admin-ajax در وردپرس میشه مربوط به افزونههای ارسال هشدار در وردپرس هست. همونطور که در تصویر زیر میبینید با یک جهش نسبتا بزرگ در admin-ajax وردپرس روبه رو هستیم که در هنگام تست توسط سایت GTmetrix با اون مواجه شدیم.
همونطور که در نمونه قبلی هم انجام دادیم در اینجا هم اگر روی درخواست POST admin-ajax.php کلیک کنید خواهید دید که داده های پست “action = mtsnb_add_impression & bar_id = 88 & ab_variation = none” نمایش داده خواهند شد.
این بار هم با یک جستجوی سریع در گوگل انجام میدیم و نتیجه اول که در نتایج جستجو نمایش داده میشه در واقع افزونه نوار اطلاع رسانی در وردپرس هست که در این سایت استفاده شده است.
پس همونطور که میبینید راههای خوبی برای فهمیدن اینکه مشکل admin-ajax.php وردپرس بخاطر چی هست وجود داره که در اینجا ما به استفاده از سایت GTmetrix و جستجوی خطا در گوگل بسنده کردیم. اگر شما یک توسعه دهنده هستید میتونید از راههای دیگه هم استفاده کنید.
راه مطمئن برای تعیین منبع مشکل admin-ajax.php در وردپرس
یک راه ساده و پیش پا افتاده هم وجود داره که معمولا برای یافتن خطا در وردپرس از این روش زیاد استفاده کردیم. در این روش کافیه در هر بار یکی از افزونهها را غیرفعال کرده و تست سرعت روی سایتتون رو انجام بدین، در نهایت بعد از غیرفعال کردن افزونهها در جایی با غیرفعال کردن یکی از افزونهها میبینید که خطا برطرف میشه و مشخص میشه که مشکل از این افزونه هست. این خطا معمولا به خوبی جواب میده و در 99 درصد تستهایی که با این روش صورت گرفته به نتیجه خواهید رسید. البته میتونید این کار رو به صورت برعکس هم انجام بدین. یعنی همه افزونهها رو غیرفعال کنید و این بار یکی یکی هر افزونه را فعال کرده و در هر بار فعال سازی افزونه یک بار تست سرعت هم انجام بدین، اگر دیدین که خطای admin-ajax با فعال کردن یکی از افزونهها صورت گرفت مشخص خواهد شد که مشکل از اینجاست.
2. مصرف بالای CPU در پیشخوان وردپرس توسط admin-ajax.php
دومین مسئلهای که باعث به وجود اومدن این مشکل میشه زمانی هست که Heartbeat API وردپرس برای اینکه بتونه با استفاده از Ajax توسط مرورگر دادههایی رو ارسال و دریافت بکنه با این خطا مواجه شده و باعث به وجود اومدن مصرف بیش از حد CPU در پیشخوان وردپرس خواهد شد. هر درخواست آجاکس که در این حالت در وردپرس بارگذاری میشه در حالتی هست که همه دادهها به صورت کش شده هم هستند. معمولا این نوع خطاها را در تست سرعت بخاطر اینکه در پیشخوان وردپرس به وجود میاد نمیبینید. این مشکل بیشتر در هاستهای اشتراکی که چندین وبسایت روی یک سرور قرار دارند به وجود میاد. پیشنهادی که برای کاهش این نوع خطا در پیشخوان وردپرس دارم این هست که:
- از باز کردن چندین صفحه پیشخوان وردپرس در تبهای مرورگر دوری کنید. چرا که این کار باعث میشه هر صفحه از سایت که در یک تب باز شده مدام مشغول دریافت اطلاعات آجاکس در وردپرس بشه که ضمن بالا بردن مصرف منابع هاست، باعث کند شدن مرورگر و سیستم شما هم خواهد شد.
- همچنین سعی کنید قابلیت ذخیره خودکار در وردپرس رو مدیریت کرده و بازه زمانی که یک نوشته به صورت خودکار در حالت پیش نویس ذخیره میشه را بیشتر کنید. برای این منظور میتونید از مقاله نحوه غیرفعال کردن بروزرسانی خودکار در وردپرس استفاده کنید.
همونطور که در بالا هم اشاره شد وردپرس برای بررسی درخواستها به صورت آجاکس در هر 15 ثانیه از طریق مرورگر درخواستی رو به سرور ارسال میکنه، حالا اگر تغییراتی اعمال شده باشه پاسخ ارسال میشه. این حالت رو اگر زمانی در نظر بگیرید که چندین تب باز کردید و یا اینکه تب ها همگی مربوط به صفحه ویرایش نوشته هستند، باعث به وجود اومدن فاجعه در وردپرس خواهد شد. حالا این فاجعه زمانی بدتر خواهد شد که در یک سایت بزرگ و پربازدید که چندین نویسنده در اون فعالیت دارند همزمان در حال نوشتن و تولید محتوا باشند. در این صورت به نظر شما چه اتفاقی خواهد افتاد؟ مشخص است که این درخواستها همینطور در حال تکثیر شدن و بیشتر شدن خواهند بود. طق یک بررسی که روی سایت DARTDrones انجام گرفته در حالتی که در مدت 24 ساعت از یک روز که فقط 2.000 بازدیدکننده یکتا در این سایت بود هنگام کار با سایت بیش از 4.100 درخواست ارسال و دریافت شده بود. این میزان اصلا بهینه نیست.
برای اینکه این درخواستها رو کمتر کنید میتونید از روشهایی مثل غیرفعال کردن رونوشت خودکار در وردپرس، افزایش زمان ذخیره خودکار نوشته به عنوان پیش نویس و… استفاده کنید. همچنین یک راه ساده هم برای این کار وجود داره که با استفاده از افزونه میتونید این کار را انجام بدین.
افزونه کاهش تعداد درخواستهای admin-ajax در وردپرس
افزونهای که برای کاهش میزان درخواستهای admin-ajax در وردپرس قصد دارم معرفی کنم با عنوان Heartbeat Control در مخزن وردپرس به ثبت رسیده و تاکنون هم موفق شده بیش از 80.000 نصب فعال و کسب امتیاز 4.6 را ازآن خودش بکنه که با استفاده کردن از این افزونه میتونید اقدام به مدیریت درخواستها و وظایفی در وردپرس که باعث کاهش کارهای admin-ajax در وردپرس خواهد شد بکنید.
بعد از نصب و فعال سازی این افزونه مشابه تصویر زیر منویی با نام Heartbeat در بخش تنظیمات وردپرس اضافه میشه که با مراجعه به این منو میتونید درخواستها را به صورت زیر مدیریت کنید.
control heartbeat locations: این گزینه را روی حالت Allow only on post edit pages قرار بدین تا این کار صرفا در صفحه ویرایش نوشته و برگه که بیشتر مورد استفاده قرار میگیره انجام بشه.
override heartbeat frequency: این گزینه را هم پیشنهاد میکنم روی حالت 60 ثانیه قرار بدین تا درخواستهای API ارسالی از هر 60 ثانیه انجام بگیرند. دقت کرده باشید در قسمت اول مقاله گفتم که درخواستها در حالت عادی از هر 15 ثانیه بررسی میشوند که با افزایش اون به 60 ثانیه میتونید مدت زمان رو بیشتر کرده و مصرف CPU که توسط admin-ajax.php زیاد شده رو مدیریت کرده و کاهش بدین.
در صورتی که از نسخه تجاری و پولی این افزونه هم استفاده کنید میتونید از قابلیت هایی مثل غیرفعال کردن لینکهای RSD در وردپرس، حذف لینکهای کوتاه، غیرفعال کردن فید وردپرس، حذف لینکهای فید وردپرس، غیرفعال کردن پینگ بک در وردپرس و… استفاده کنید که در تصویر بالا قابل مشاهده هستند.