کندی وردپرس در نت ملی: چرا پیشخوان معطل میماند و چطور جلوی آن را بگیریم
- سمانه جعفری
- مطالعه در 7 دقیقه
- مهر 8, 1405
- 16 دیدگاه
-
افزونه اتوماسیون انتشار محتوای وردپرس در سوشال مدیا Bit Social Pro اورجینال
امتیاز 4.77 از 5۵۹۰,۰۰۰ تومان -
قالب اورجینال چندمنظوره بی تم + دمو های فعال (انگلیسی) | BeTheme
۱,۰۲۰,۰۰۰ تومان
-
افزونه سئو وردپرس | WPMU DEV SmartCrawl Pro
۶۲۰,۰۰۰ تومان
-
افزونه امنیتی مخفی سازی وردپرس | Hide My WP
۶۵۰,۰۰۰ تومان
برای شبیهسازی نت ملی، ارتباط سرور یک فروشگاه آزمایشی را با بیرون بیجواب گذاشتیم. نخستین بارگذاری پیشخوان با کش خالی ۳۸ ثانیه طول کشید و صفحه ورود ۶ ثانیه. دو خط در 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» نوشته شده اضافه کنید:
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 دارید، این دستور را هم امتحان کنید:
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» تمام شد، پیشخوان اینقدر معطل نمیشود.

۳۸ ثانیه، جمع انتظار ۹ درخواست بیجواب است
وردپرس هر درخواست خارجی را با مهلتی میفرستد و تا پایان مهلت صبر میکند، با یک سقف: اتصالی که هرگز باز نشود، حتی با مهلت بلندتر، بعد از ۱۰ ثانیه تمام میشود (پیشفرض کتابخانه درخواستهای وردپرس). ما هر درخواستی را که از راه 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 و ۰٫۰۷ ثانیه پایگاه داده.

ستون 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 پاک کنید تا بررسی بهروزرسانی و ارتباط با سرویسهای خارجی دوباره کار کند.

16 دیدگاه در “کندی وردپرس در نت ملی: چرا پیشخوان معطل میماند و چطور جلوی آن را بگیریم”
سلام و وقت بخیر؛ تست داکر ۳۸ ثانیهای شما روی قالب وودمارت شگفتانگیز بود. ما در سرور با لایتاسپید متوجه شدیم که آیا اضافه کردن WP_HTTP_BLOCK_EXTERNAL تاثیری روی وبهوکهای داخلی بین دو کانتینر در یک شبکه محلی (Local Docker Bridge) میگذارد یا خیر؟
سلام جناب رحیمی عزیز؛ خیر، ثابت WP_HTTP_BLOCK_EXTERNAL فقط درخواستهایی را مسدود میکند که از طریق توابع استاندارد HTTP API وردپرس (مانند wp_remote_get و wp_remote_post) به دامنهها و هاستهای خارجی ارسال میشوند. اگر ارتباط کانتینرهای شما از طریق localhost یا آیپی محلی (نظیر رنج 172.18.0.0/16) برقرار شود، هسته وردپرس آن را ترافیک خارجی محاسبه نمیکند. با این حال توصیه میکنم برای تضمین بیدرنگ ارتباط وبهوکها، نام دامنهها یا آیپیهای سرور مقصد را صراحتاً در لیست WP_ACCESSIBLE_HOSTS قرار دهید.
سلام و خدا قوت؛ در بخش درگاهها اشاره کردید که زرینپال و زیبال باید در لیست هاستهای مجاز قرار بگیرند. ما از درگاه پرداخت مستقیم سامانکیش و پاسارگاد استفاده میکنیم؛ آیا باید آدرس شاپرک و درگاه را هم در لیست بنویسیم؟
سلام سرکار خانم کمالیفر گرامی؛ بله، دقیقاً. در درگاههای مستقیم بانکی (IPG شاپرک)، افزونه پرداخت شما در لحظه ایجاد توکن و همچنین هنگام بازگشت مشتری برای تایید تراکنش (Verify Transaction)، به سرور بانک درخواست وبسرویس cURL یا SOAP ارسال میکند. بنابراین باید دامنههای وبسرویس بانک پاسارگاد (pep. shaparak. ir) و سامانکیش (sep. shaparak. ir) و همچنین *. shaparak. ir را حتماً در WP_ACCESSIBLE_HOSTS با ویرگول اضافه کنید تا پرداختها با خطای اتمامزمان (Timeout) لغو نشوند.
خسته نباشید؛ نکته بسیار باریکی در مورد فاصله قبل و بعد از ویرگول در WP_ACCESSIBLE_HOSTS مطرح کردید. آیا امکان استفاده از وایلدکارد سهسطحی وجود دارد؟ مثلاً اگر دامنهای مثل sub. domain. example. com داشته باشیم، آیا *. example. com آن را پوشش میدهد؟
درود بر شما پیمان عزیز؛ بر اساس منطق پیادهسازیشده در کلاس WP_Http وردپرس، الگوی علامت ستاره (*) به یک عبارت منظم تبدیل میشود که تنها یک سطح از سابدامین را مچ میکند. بنابراین اگر زیردامنه شما چندسطحی باشد، باید عین عبارت سابدامین یا *. domain. example. com را صراحتاً در لیست قید کنید تا توسط فیلتر امنیتی هسته رد نشود.
وقت بخیر؛ آیا وقتی WP_HTTP_BLOCK_EXTERNAL فعال است، کرونجابهای زمانبندیشده افزونهها مثل ارسال پیامکهای وبهوک فراز اساماس یا کاوهنگار از کار میافتند؟
سلام جناب رستگار عزیز؛ در صورتی که دامنههای وبسرویس پیامکی را در لیست مجاز قرار ندهید، بله مسدود خواهند شد. افزونههای پیامکی معمولاً به دامنههایی مانند ippanel. com، api. kavenegar. com یا rest. payamak-panel. com ریکوئست میزنند. کافیست دامنه سرویس پیامکی مدنظرتان را به مقدار ثابت WP_ACCESSIBLE_HOSTS بیفزایید تا صف کرونجاب بدون معطلی و در کسری از ثانیه پیامکها را شلیک کند.
سلام؛ من تست سلامت سایت را زدم و دقیقاً خطای قرمز «عدم توانایی در دسترسی به WordPress. org» را نشان داد و پیشخوان سایت من دقیقاً نیم دقیقه طول میکشید تا باز شود! آیا بعد از اینکه اینترنت بینالملل نرمال شد، حتماً باید این کدها را از فایل کانفیگ پاک کنیم؟
سلام سرکار خانم سعادتی؛ بله، حتماً. با پاک کردن یا کامنت کردن این دو خط پس از برقراری کامل شبکه بینالملل، وردپرس مجدداً میتواند وضعیت بهروزرسانیهای امنیتی هسته، قالبها و افزونهها را بررسی کند و پچهای امنیتی جدید را به شما اعلام نماید. این دو خط را بهعنوان یک کلید اضطراری برای شرایط اختلال اینترنت ملی در نظر بگیرید.
با سلام؛ در مقاله اشاره کردید که ثابت AUTOMATIC_UPDATER_DISABLED برخلاف باور عمومی کمکی به حل مشکل لود پیشخوان نمیکند. آیا افزونههایی که از سرویس Gravatar برای نمایش آواتار کاربران در نظرات استفاده میکنند هم در پیشخوان ایجاد تاخیر میکنند؟
سلام جناب ناصری گرامی؛ نکته بسیار هوشمندانهای مطرح کردید. تصاویر گراواتار سمت سرور وردپرس دانلود نمیشوند بلکه آدرس تصویر در کد HTML درج میشود و توسط مرورگر کاربر فراخوانی میگردد. با این حال، اگر مرورگر کلاینت نتواند به سرور گراواتار متصل شود، آیکون تصویر شکسته میشود و مرورگر تا زمان تایماوت معطل میماند. برای رفع کامل این مورد پیشنهاد میکنیم در بخش «تنظیمات > گفتگوها»، گزینه «نمایش نیمرخها» را موقتاً غیرفعال کنید یا افزونه کش محلی آواتار را به کار بگیرید.
وقت بخیر؛ ما از قالب وودمارت استفاده میکنیم و در زمان ملی شدن اینترنت پنل تنظیمات قالب اصلاً لود نمیشد! آیا این دو خط مشکل پنل تنظیمات قالبهای سنگین را هم برطرف میکند؟
درود بر شما سرکار خانم ارجمند؛ بله دقیقاً. قالب وودمارت برای بررسی پچها و وصلههای جدید به سرور xtemos. com ریکوئست میزند و بدون این تنظیم، در هر بار لود تا ۵ الی ۱۰ ثانیه منتظر پاسخ سرور خارجی میماند. با تعریف WP_HTTP_BLOCK_EXTERNAL، درخواست به سرور سازنده قالب بلافاصله با پاسخ خالی لغو میشود و پنل تنظیمات وودمارت زیر نیم ثانیه بارگذاری خواهد شد.
سلام و خدا قوت به تیم حرفهای وردپرس نیاز؛ تحلیل دیتای Query Monitor در مقاله فوقالعاده مستند و دقیق بود. آیا افزونه یا ابزاری وجود دارد که این مسدودسازی را بهصورت هوشمند بر اساس زمان پاسخ سرور انجام دهد نه مسدودسازی سراسری؟
سلام و درود بهزاد عزیز؛ در لایه اپلیکیشن وردپرس، بهترین مکانیزم فیلتر http_request_args است که با آن میتوان پارامتر timeout درخواستهای خروجی را از مقدار پیشفرض ۵ یا ۱۰ ثانیه به ۱ یا ۲ ثانیه کاهش داد. با این کار، اگر سروری پاسخگو نباشد، پیشخوان بهجای ۳۸ ثانیه ظرف ۳ ثانیه بالا میآید بدون آنکه نیاز باشد کل ترافیک را مسدود کنید. با این وجود، دو خط ثابت کانفیگ سادهترین و بیدردسرترین راهکار قطعی در پیک بحران است.