سیستم های مدیریت محتوا (content management system) یا به اختصار CMS مشکلات منحصر به فرد خود را دارند. باید به عنوان یک توسعه دهنده وب یا صاحب کسب و کار، CMS ها را عیب یابی کرده و نسبت به رفع مشکلات آنها اقدام نمود. وردپرس پرکاربردترین سیستم مدیریت محتوای تحت وب است. این CMS با دارای بودن صدها هزار افزونه و تم در مخزن خود، میتواند یکی از پیچیدهترین پلتفرم ها جهت بهینهسازی صحیح می باشد. اگر تا به حال تست سرعت را در سایت وردپرسی خود انجام داده باشید، احتمالاً با ارجاعاتی به admin-ajax.php در نتایج خود مواجه شده اید. تشخیص دلیل اجرای admin-ajax می تواند به بهینه سازی هرچه بهتر سایت ختم شود.
کاربرد فایل admin-ajax.php در وردپرس
در وردپرس نسخه 3.6 بخشی به نام heartbeat API معرفی شد تا به وردپرس اجازه دهد بین مرورگر کاربر و سرور ارتباط برقرار نماید. در واقع heartbeat API از طریق اجرای فایل admin-ajax.php که در پوشه wp-admin قرار دارد، درخواست های AJAX را در مرورگر کاربر انجام داده و می تواند آنچه در داشبورد رخ می دهد را پیگیری و ثبت کند. به عنوان مثال، اگر وارد سایت وردپرسی خود شوید، بلافاصله درخواست admin-ajax.php را در لاگ های خود مشاهده خواهید کرد.
تصویر(1)
فایل admin-ajax.php به وردپرس امکان می دهد برخی از عملیات ها را بدون بروز سازی صفحه انجام دهد. مزایای این فایل عبارتند از:
- کاهش زمان بارگذاری صفحات
- افزودن قابلیت های پویا و جذاب به سایت
- سازگاری با استانداردهای وب و مرورگرها
یک نقل قول از توسعه دهندگان هسته وردپرس پیرامون admin-ajax به این شرح است:
"admin-ajax در ابتدا برای ذخیره خودکار، قفل کردن پست و هشدار منقضی شدن ورود هنگام نوشتن یا ویرایش استفاده می شود. ایده این است که یک API نسبتا ساده داشته باشیم که درخواست های XHR را هر 15 ثانیه به سرور می فرستد و در هنگام دریافت داده ها، رویدادها (یا تابع های بازگشتی) را راه اندازی می کند. سایر اجزا می توانند در جریان فعالیت همزمان دیگر کاربران قرار گیرند. این می تواند برای جلوگیری از ویرایش همزمان ویجت ها و منوها یا هر کار دیگری که نیاز به بروزرسانی های منظم از سمت سرور دارد، استفاده شود."
تشخیص مشکل admin-ajax در بک اند
حجم اجرای admin-ajax.php فقط حدود 98 بایت است که بسیار کوچک می باشد. اما با گذشت زمان این حجم افزایش پیدا می کند. اگر سرویس مورد استفاده شما دارای محدودیت در اختصاص CPU باشد، این احتمال وجود دارد که با مشکلاتی در Backend سایت مواجه شوید. در برخی موارد، تغییر و ارتقا هاست از سوی مدیران وب سایت ها به عنوان راه حل نهایی، برگزیده میشود. اما گاهی نیاز به هزینه بیشتر و تهیه هاست با CPU بیشتر نمی باشد.
می توانید به عنوان مدیر سایت وارد داشبورد وردپرس شده و سپس جزئیات access log را بررسی نمایید. مشاهده خواهید کرد که درخواست های admin-ajax هر 60 ثانیه به صورت خودکار اجرا می شوند. اگر داشبورد باز گذاشته شود، این درخواستها بسیار زیاد خواهند بود.
تصویر(2)
هر درخواست POST باعث اجرای اسکریپت PHP می شود و به همین دلیل هر بار درصدی از CPU درگیر خواهد شد.
تصویر(3)
توجه داشته باشید که این فقط اثر ورود و فعالیت صرفا یک کاربر بوده است. اگر چندین نفر به محیط داشبورد وردپرس وارد شوند، تعداد درخواستهای API نیز به طور همزمان افزایش مییابد.
کاهش مصرف منابع admin-ajax توسط افزونه Heartbeat Control
تصویر(4)
جف ماتسون، یک توسعه دهنده وردپرس، افزونه ای رایگان به نام Heartbeat Control برای مدیریت فرکانس اجرای Heartbeat API ایجاد کرده است. در صورت تمایل می توان Heartbeat API را به طور کامل غیرفعال کرد، اما انجام این کار توصیه نمیشود. پس از نصب Heartbeat Control از طریق مخزن وردپرس، می توان آن را در قسمت «تنظیمات» داشبورد وردپرس مشاهده نمود. در صفحه پیکربندی Heartbeat Control، گزینه های زیر را برای کنترل اجرای Heartbeat در بخش های مختلف وردپرس وجود دارد:
-
Allow Heartbeat-- اجازه اجرا را دارد
-
Disable Heartbeat-- غیرفعال کردن اجرای admin-ajax
-
Modify Heartbeat-- تنظیم بازه زمانی اجرای آن
همچنین میتوانید بخشی را که میخواهید تنظیمات ضربان قلب بالا اعمال شود، تغییر دهید، مانند:
-
داشبورد وردپرس
-
Frontend
-
ویرایشگر پست
در قسمت Modify Heartbeat می توان بازه زمانی اجرای admin-ajax را از 15 ثانیه تا 300 ثانیه تغییر داد. با تغییر فاصله به 300 ثانیه احتمال کمتری دارد که با مشکلات عملکرد سرور مواجه شوید.
تصویر(5)
کندی در اجرای admin-ajax.php از سوی افزونه های ثالث
دومین مشکلی که معمولا مدیران سایت ها با آن مواجه می شوند، افزونه های شخص ثالث هستند. این افزونه ها از admin-ajax.php برای انجام برخی عملکردهای AJAX مانند راه اندازی پنجره های pop-up یا شمارنده ها استفاده می کنند. برخی از افزونهها درخواستهای POST زیادی را به این فایل ارسال مینمایند. چگونه می توان تشخیص داد که کدام افزونه ها از admin-ajax.php استفاده می کنند؟ یکی از راههای سریع، اجرای ابزار توسعه مرورگر و بررسی درخواستهای اجرا شده در بخش network است. در ادامه روند تشخیص مشکل سه افزونه شرح داده می شود.
نمونه اول: مشکل افزونه WP Notification Bar
وجود درخواست های admin-ajax خود به تنهایی نمی تواند دلیل کندی یک سایت باشد. زیرا برخی از موارد می توانند به صورت ناهمزمان بارگیری شوند و AJAX نیز پس از بارگیری صفحه اجرا می شود. البته زمانی که از AJAX استفاده میکنید، همچنان باید مراقب بود که تعداد درخواستهای AJAX زیاد نشود. در تصویر (6) میتوان مشاهده نمود که پس از DOMContentLoaded مقداری زمان انتظار وجود دارد.
تصویر(6)
با بررسی بخش "post form action" در هدر پاسخ HTTP مشخص می شود که افزونه تقریباً همیشه خود را در قسمت action نشان می دهد. به عنوان مثال، در تصویر(7) بخش action دارای مقدار mtsnb_add_impression است.
تصویر(7)
اگر یک جستجو در کد منبع صفحه مورد نظر انجام شود، میتوان کلاس با نام mtsnb را مشاهده نمود. مشخص می گردد پلاگین نوار اعلان سایت در بالای صفحه نظرسنجی است که admin-ajax.php را اجرا می نماید.
تصویر(8)
همچنین، میتوان مشاهده نمود که همین پلاگین، یک متغیر کوکی را نیز تنظیم میکند.
تصویر(9)
جهت تست می توان افزونه را برای دقایقی غیر فعال نموده و اثر آن بر مصرف منابع و سرعت سایت را بررسی نمود. در نظر داشته باشید که افزونههای کش معمولاً admin-ajax.php را کش نمیکنند زیرا در دایرکتوری wp-admin قرار دارد.
نمونه دوم: مشکل افزونه Monarch Social Sharing
در این مثال از نتیجه تست GTmetrix استفاده می شود. در تصویر(10) مشخص می باشد که 5 درخواست جداگانه برای admin-ajax.php، پس از DOMContentLoaded انجام شده اند.
تصویر(10)
اگر در تب "Post" بررسی صورت پذیرد، میتوان در بخش "action" نام "get_shares_count" را مشاهده نمود. که مستقیماً به پلاگین اشتراکگذاری رسانههای اجتماعی Monarch اشاره میکند.
تصویر(11)
می توان چند بار این تست و بررسی را انجام داد تا از مرتبط بودن افزونه مورد نظر با اجرای طولانی و تکراری admin-ajax.php اطمینان حاصل نمود. گاهی اوقات هدر پاسخ نیز می تواند در تشخیص دلیل اجرای admin-ajax کمک فراوانی نماید.
در برخی موارد جهت رفع مشکل، باید با توسعه دهنده آن افزونه ارتباط برقرار نمود و با اعلام مشکل، منتظر رفع آن از سوی توسعه دهنده ماند. توسعه دهنده می تواند با اصلاح فرایند های درخواست AJAX آن را بهینه نموده و در نسخه های بعدی افزونه خود، مشکل را رفع کند. افزونه هایی هستند که یک عمل مشخص را با 6 تا 7 درخواست AJAX انجام می دهند، در حالی که همان عمل را افزونه ای دیگر می تواند فقط با یک درخواست AJAX انجام دهد. بنابراین میزان استفاده از admin-ajax به نحوه توسعه پلاگینها برمیگردد و حتماً باید چندین پلاگین را قبل از راه اندازی آن در سایت، مورد آزمایش و مقایسه قرار داد.
نمونه سوم: افزونه Counter Visitor for Woocommerce
افزونه Counter Visitor for Woocommerce یک ابزار ساده است که به شما امکان می دهد تعداد بازدیدکنندگان در محصولات ووکامرس خود را در بازه زمانی خاصی پایش کنید. این افزونه می تواند تعداد کاربرانی که در حال مشاهده محصولی هستند را در همان صفحه محصول به نمایش گذارد. می توان از منوی Woocommerce بخش Visitor Counter در پنل وردپرس تنظیمات افزونه را مشاهده و تغییر داد. همچنین اگر از Elementor یا سایر صفحه ساز های وردپرس استفاده می کنید، می توانید از کد کوتاه [wcvisitor] برای نمایش شمارشگر در صفحات دلخواه خود استفاده نمایید.
همچنین، این افزونه یک بخش به نام "Fake Mode" دارد که اگر فعال باشد، تعداد غیر حقیقی از بازدیدکنندگان آن محصول را در صفحه آن به نمایش می گذارد. در تنظیمات افزونه امکان نمایش زنده آمار وجود داشته و حتی می توان زمان بروزرسانی اطلاعات را نیز تا 5 ثانیه یک بار کاهش داد. افزونه Counter Visitor for Woocommerce از admin-ajax.php جهت بروزرسانی اطلاعات استفاده می نماید. یک تنظیم اشتباه می تواند مانند تصویر(12) منجر به اجرای متعدد admin-ajax شده و مصرف منابع بالایی را رقم بزند.
تصویر(12)
اگر نمایش زنده تعداد کاربران فعال باشد و اطلاعات غیر حقیقی هر 5 ثانیه آپدیت شود مصرف منابع بالایی رخ خواهد داد. در این حالت، مشاهده محصولی از سوی یک بازدید کننده و صرفا باز نگه داشتن آن برگه برای چند دقیقه می تواند حجم بالایی از مصرف منابع را ایجاد نماید.
تصویر(13)
همانگونه که در تصویر(13) مشاهده می شود، نام این افزونه نیز در action قابل مشاهده می باشد. کافی است تنظیمات این افزونه اصلاح شود تا مشکل برطرف گردد.
این سه افزونه صرفا مثال های جهت آشنایی با روش های تشخیص مشکل admin-ajax می باشند. با توجه به وجود هزاران افزونه و تم و راحتی در استفاده از heartbeat API همواره امکان بروز مشکل و تداخل در اجرای admin-ajax وجود دارد.
جمع بندی
فایل admin-ajax.php یک فایل جاوا اسکریپت است که برای اجرای درخواست های AJAX در وردپرس استفاده می شود. این فایل می تواند برای افزودن قابلیت های پویا و تعاملی به سایت مفید باشد، اما اگر به صورت نادرست یا بیش از حد استفاده شود، می تواند سرعت سایت را کاهش دهد. برخی از راه های بهینه سازی admin-ajax.php عبارتند از:
- استفاده از پلاگین های مناسب و بروز برای کاهش درخواست های غیرضروری
- استفاده از REST API به جای admin-ajax.php برای درخواست های ساده و سریع
- استفاده از Heartbeat Control برای کنترل فرکانس و محدوده درخواست های AJAX
- استفاده از کش و CDN برای کاهش زمان پاسخ دهی به درخواست های AJAX
با این حال، در برخی موارد ارتقاء به سروری با منابع بالاتر تنها راه حل مناسب است. اگر چنین سایتی را مدیریت می کنید، نیاز است سرویس خود را به یک هاست و سرور با منابع بیشتر ارتقا دهید.