کندی وردپرس در نت ملی: چرا پیشخوان معطل می‌ماند و چطور جلوی آن را بگیریم

عنوان مقاله روی زمینه قرمز و کنار آن زمان‌سنجی که ۳۸ ثانیه را نشان می‌دهد، و با دو خط کد کمتر از ۰٫۴ ثانیه
محصولات زیر برای شماست...
جدیدترین مقالات
دسترسی سریع
فهرست محتوا

برای شبیه‌سازی نت ملی، ارتباط سرور یک فروشگاه آزمایشی را با بیرون بی‌جواب گذاشتیم. نخستین بارگذاری پیشخوان با کش خالی ۳۸ ثانیه طول کشید و صفحه ورود ۶ ثانیه. دو خط در wp-config.php هر دو را به کمتر از ۰٫۴ ثانیه رساند.

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

آزمایش را با داکر ساختیم: وردپرس 7.1.2 فارسی، ووکامرس 11.1.2، ووکامرس فارسی 10.0.5 و قالب وودمارت 8.6.2، همان نسخه‌ای که این فروشگاه در روز آزمایش می‌فروخت. هر بسته‌ای که از کانتینر به بیرون از شبکه آزمایش می‌رفت، حتی به سایت ایرانی مثل woocommerce.ir، دور ریخته می‌شد و نام سایت‌ها هنوز به آی‌پی تبدیل می‌شد. این با اتصال ردشده فرق دارد: اتصالی که رد شود همان لحظه تمام می‌شود (پیشخوان با اتصال ردشده حدود ۰٫۲ ثانیه بود) و اتصالی که بی‌جواب بماند تا پایان مهلتش نگه داشته می‌شود. ما حالت دوم را ساختیم؛ شبکه شما ممکن است هر دو را نشان بدهد.

دو خط در wp-config.php جلوی کندی پیشخوان در نت ملی را گرفت

پیش از ویرایش از سایت بکاپ بگیرید (آموزش بکاپ با UpdraftPlus) و خود wp-config.php را هم جداگانه کپی کنید. سپس این دو خط را بالای خطی که در آن «stop editing» نوشته شده اضافه کنید:

PHP
وردپرس نیاز
define( 'WP_HTTP_BLOCK_EXTERNAL', true );
define( 'WP_ACCESSIBLE_HOSTS', 'payment.zarinpal.com,next.zarinpal.com,api.payping.ir,gateway.zibal.ir' );

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

اگر نمی‌خواهید خودتان wp-config.php را ویرایش کنید یا نمی‌دانید کدام سرویس باید باز بماند، درخواست بررسی سرعت را ثبت کنید یا صفحه خدمات پشتیبانی فنی را ببینید.

نشانی‌ها را با ویرگول جدا کنید. فاصله بعد از ویرگول اشکالی ندارد، اما با فاصله پیش از ویرگول، api.wordpress.org , *.zibal.ir فقط زیبال را باز نگه داشت و api.wordpress.org رد شد. علامت ستاره هم فقط زیردامنه را باز می‌کند و خود دامنه را نه: اگر پیش از zarinpal.com ستاره و نقطه بگذارید، payment.zarinpal.com باز می‌شود و zarinpal.com بسته می‌ماند.

سرویسی که در فهرست نباشد رد می‌شود، حتی اگر در دسترس باشد: سرویس آزمایشی‌ای که داخل شبکه آزمایش زیر نام payment.zarinpal.com راه انداخته بودیم بدون فهرست همان لحظه رد شد و با فهرست در ۶ میلی‌ثانیه جواب داد. بعد از افزودن دو خط، یک بار با درگاه واقعی خرید آزمایشی کنید و یک بازگشت وجه هم امتحان کنید.

چطور بفهمید سایتتان همین‌جا معطل است

«ابزارها > سلامت سایت» را باز کنید: با ارتباط قطع، یکی از موارد بحرانی «عدم توانایی در دسترسی به WordPress.org» است. اگر به هاست SSH دارید، این دستور را هم امتحان کنید:

CODE
وردپرس نیاز
bash
curl -m 5 -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://api.wordpress.org/core/version-check/1.7/

اگر دستور بعد از ۵ ثانیه با «Connection timed out» تمام شد، همان حالتی است که ما ساختیم، اما اگر بلافاصله با «Failed to connect» تمام شد، پیشخوان این‌قدر معطل نمی‌شود.

صفحه سلامت سایت در پیشخوان فارسی با مورد بحرانی «عدم توانایی در دسترسی به Wordpress.org» و خطای اتمام‌زمان Curl
سلامت سایت فروشگاه آزمایشی وقتی بسته‌ها دور ریخته می‌شد

۳۸ ثانیه، جمع انتظار ۹ درخواست بی‌جواب است

وردپرس هر درخواست خارجی را با مهلتی می‌فرستد و تا پایان مهلت صبر می‌کند، با یک سقف: اتصالی که هرگز باز نشود، حتی با مهلت بلندتر، بعد از ۱۰ ثانیه تمام می‌شود (پیش‌فرض کتابخانه درخواست‌های وردپرس). ما هر درخواستی را که از راه API وردپرس رفت ثبت کردیم. نخستین بارگذاری پیشخوان با کش خالی این ۹ درخواست را داشت:

درخواستفرستندهمهلت (ثانیه)انتظار (ثانیه)
public-api.wordpress.com، پیشنهادهای پرداختووکامرس 11.1.2۵۵
xtemos.com، فهرست وصله‌هاوودمارت 8.6.2۵۵
api.wordpress.org، نگارش وردپرسهسته وردپرس۳، دو بار۶
api.wordpress.org، به‌روزرسانی افزونه‌هاهسته وردپرس۳، دو بار۶
api.wordpress.org، به‌روزرسانی قالب‌هاهسته وردپرس۳، دو بار۶
woocommerce.ir، خبرهای پیشخوان (سایتی ایرانی که آزمایش ما آن را هم می‌بست)ووکامرس فارسی 10.0.5۱۰۱۰
جمع۳۸

هسته وردپرس هر درخواست را اول با https می‌فرستد و اگر جواب نیامد، یک بار دیگر با http؛ برای همین هر ردیف هسته وردپرس دو بار ۳ ثانیه است. مهلت بررسی افزونه‌ها با هر ۱۰ افزونه نصب‌شده یک ثانیه بیشتر می‌شود (کد وردپرس 7.1.2)، پس با ۴۰ افزونه همین یک بررسی دو بار ۷ ثانیه، یعنی ۱۴ ثانیه، معطل می‌کند.

چون woocommerce.ir ایرانی است، در قطعی واقعی شاید جواب بدهد. خانه ووکامرس، تنظیمات ووکامرس، سلامت سایت و نوشته تازه، که این خبرها را ندارند، در همان آزمایش ۲۸ ثانیه بودند. ووکامرس فارسی هم خودش ۱۸ نشانی را با پاسخ خالی بی‌درنگ جواب می‌دهد (تنظیم «سوپر ادمین»، پیش‌فرض روشن)، از جمله ده نشانی woocommerce.com.

افزونه Query Monitor برای بارگذاری دیگری از همین پیشخوان با کش خالی ۳۸٫۴ ثانیه ثبت کرد: ۳۸٫۱ ثانیه انتظار برای درخواست‌های HTTP و ۰٫۰۷ ثانیه پایگاه داده.

تب Overview افزونه Query Monitor: زمان کل بارگذاری ۳۸٫۴ ثانیه، درخواست‌های Http ۳۸٫۱ ثانیه و پایگاه داده ۰٫۰۷ ثانیه
تب Overview افزونه Query Monitor

ستون Component در تب HTTP API Calls آن نشان می‌دهد هر انتظار از کدام افزونه، قالب یا هسته وردپرس آمده. آن را پیش از قطع ارتباط بین‌الملل نصب کنید، چون دانلودش به آن ارتباط نیاز دارد.

هر صفحه این‌قدر کند نیست. وردپرس زمان آخرین بررسی را پیش از فرستادن درخواست ثبت می‌کند و در صفحه‌های معمولی تا ۱۲ ساعت سراغ بررسی به‌روزرسانی نمی‌رود؛ ووکامرس بعد از خطا در پیشنهادهای پرداخت ۶ ساعت صبر می‌کند و وودمارت و ابزارک ووکامرس فارسی یک روز. در آزمایش، بارگذاری دوم تا چهارم پیشخوان ۰٫۱۷ تا ۰٫۲۲ ثانیه بود و هیچ درخواستی نداشت. برای سایتی که پیش از قطع بررسی موفق داشته، یک روز گذشتن را شبیه‌سازی کردیم: نخستین بارگذاری پیشخوان باز هم ۳۸ ثانیه بود و بعدی ۰٫۱۷ ثانیه.

چند صفحه اما نتیجه ناموفقشان را کش نمی‌کنند و در همان شبیه‌سازی هر بار می‌ایستادند:

  • صفحه ورود: ۶ ثانیه، برای فهرست ترجمه‌ها؛ وردپرس آن را فقط وقتی جواب بیاید ۳ ساعت نگه می‌دارد.
  • تنظیمات > عمومی: ۱۲ ثانیه، برای همان فهرست.
  • افزودن افزونه: ۲۰ ثانیه، دو درخواست ۱۰ ثانیه‌ای.
  • به‌روزرسانی‌ها: ۱۸ ثانیه، وقتی بیش از یک دقیقه از بررسی قبلی گذشته باشد؛ هسته، افزونه‌ها و قالب‌ها هر کدام ۶ ثانیه.

در سایتی که هیچ بررسی موفقی در سابقه‌اش نیست، مثلاً وقتی همه داده‌های موقت وردپرس پاک شده باشد، صفحه‌های افزونه‌ها و به‌روزرسانی‌ها از بار دوم به بعد هم هر بار می‌ایستند (۶ و ۱۲ تا ۱۸ ثانیه) و افزودن افزونه ۴۰ ثانیه می‌شود. بررسی ناموفق نگارش افزونه‌ها را ثبت نمی‌کند، پس وردپرس دفعه بعد آن‌ها را تغییرکرده حساب می‌کند و دوباره می‌پرسد. منطق این کار در تابع wp_update_plugins است.

نمودار میله‌ای انتظار شش صفحه پیشخوان به ثانیه: نخستین بارگذاری با کش خالی ۳۸، ۶، ۳۴، ۴۰، ۴۰ و ۶۸، بارگذاری بعدی در سایتی که پیش از قطع بررسی موفق داشت ۰٫۲، ۶، ۰٫۲، ۰٫۲ تا ۱۸، ۱۲ و ۲۰، و با دو خط همه کمتر از ۰٫۴
انتظار هر صفحه در فروشگاه آزمایشی، وقتی بسته‌ها دور ریخته می‌شد

دو توصیه رایج که آزمایش تأیید نکرد

دو راهنمای فارسی (یکی منتشرشده و دیگری به‌روزشده در ۱۴۰۵) می‌نویسند AUTOMATIC_UPDATER_DISABLED بررسی به‌روزرسانی را متوقف یا کمتر می‌کند. با این ثابت هم نخستین بارگذاری پیشخوان ۳۸ ثانیه بود و هر سه بررسی api.wordpress.org فرستاده شد. مستندات وردپرس این ثابت را برای خاموش‌کردن به‌روزرسانی خودکار معرفی می‌کند، نه بررسی.

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

چه چیزهایی را این دو خط نمی‌بندد

این دو خط فقط درخواست‌هایی را می‌شناسند که از API وردپرس بروند. درگاه زیبالِ داخلی افزونه ووکامرس فارسی 10.0.5 مستقیم با curl_init درخواست می‌فرستد و از فهرست بی‌نیاز است. افزونه‌های زرین‌پال 5.1.1، پی‌پینگ 4.6.5 و زیبال 2.1 برای ووکامرس از API وردپرس استفاده می‌کنند و نشانی‌شان باید در فهرست باشد. در آزمایش، cURL مستقیم به همان سرویس آزمایشی با دو خط هم جواب داد، اما cURL مستقیم به api.wordpress.org تا پایان مهلتی که گذاشتیم (۵ ثانیه) ماند.

آنچه را مرورگر بازدیدکننده از بیرون می‌خواهد نسنجیدیم. صفحه‌های بازدیدکننده (خانه، فروشگاه، محصول، سبد خرید و حساب من) در آزمایش هیچ درخواست خارجی از سرور نداشتند و ۰٫۱۵ تا ۰٫۱۹ ثانیه بودند. فونت یا تصویری را که خود صفحه از بیرون بخواهد، در تب Network مرورگر (Chrome DevTools) پیدا کنید.

زمان‌بند وردپرس همین انتظار را در پس‌زمینه می‌سازد

زمان‌بند وردپرس (WP-Cron) همین بررسی‌ها را اجرا می‌کند. سه رویداد بررسی به‌روزرسانی را با WP-CLI اجرا کردیم: هر کدام ۲۰ ثانیه طول کشید، چون هر درخواستش ۱۰ ثانیه بی‌جواب ماند، یک بار با https و یک بار با http. با دو خط حدود ۰٫۰۱ ثانیه شد. DISABLE_WP_CRON زمان‌بند را خاموش می‌کند و کرون سرور باید جایش را بگیرد، پس برای این کندی لازم نیست (مستندات). اگر بعد از رفع این انتظارها پیشخوان هنوز کند است، علت‌های معمول را در رفع کندی وردپرس بررسی کنید.

وقتی ارتباط بین‌الملل برگشت، دو خط را بردارید

وقتی ارتباط بین‌الملل برگشت، هر دو خط را از wp-config.php پاک کنید تا وردپرس و افزونه‌ها دوباره به سرورهای خودشان برسند.

پرسش‌های متداول

چرا پیشخوان وردپرس در نت ملی کند می‌شود؟

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

آیا WP_HTTP_BLOCK_EXTERNAL درگاه پرداخت را از کار می‌اندازد؟

فقط اگر نشانی درگاه در WP_ACCESSIBLE_HOSTS نباشد و افزونه درگاه از API وردپرس استفاده کند. در آزمایش، سرویسی که خودمان داخل شبکه آزمایش راه انداخته بودیم بدون فهرست همان لحظه رد شد و با فهرست جواب داد.

آیا AUTOMATIC_UPDATER_DISABLED جلوی بررسی به‌روزرسانی را می‌گیرد؟

نه. در آزمایش ما با این ثابت هم پیشخوان ۳۸ ثانیه معطل ماند و سه بررسی api.wordpress.org فرستاده شد.

بعد از برگشتن ارتباط بین‌الملل با دو خط WP_HTTP_BLOCK_EXTERNAL و WP_ACCESSIBLE_HOSTS چه باید کرد؟

هر دو را از wp-config.php پاک کنید تا بررسی به‌روزرسانی و ارتباط با سرویس‌های خارجی دوباره کار کند.

تصویر سمانه جعفری
سمانه جعفری
پیشنهاد میکنیم این مقالات را هم بخوانید

دیدگاه یا پرسش خود را بنویسید