در وردپرس، Heartbeat API یک مکانیزم Polling است که به‌صورت پیش‌فرض هر ۱۵ تا ۶۰ ثانیه درخواست‌های AJAX به سرور ارسال می‌کند و برای هماهنگی بین چند کاربر، ذخیره خودکار و به‌روزرسانی لحظه‌ای طراحی شده است. در فروشگاه‌های پربازدید و پنل‌های شلوغ، همین مکانیزم به یکی از بزرگ‌ترین عوامل مصرف CPU و افزایش بار سرور تبدیل می‌شود و بدون محدودسازی، هزینه هاست را چند برابر می‌کند. تفاوت تنظیم فرکانس و محدودسازی شرطی، تصمیم‌های معماری را به تصمیم‌های عملکردی گره می‌زند و انتخاب اشتباه هر پارامتر، هزینه پنهان ایجاد می‌کند. مدیریت Heartbeat در WooCommerce، در چند کاربر همزمان و در محیط‌های اشتراکی، حساسیت بالاتری دارد و باید با دقت طراحی شود. تست Heartbeat در سه سطح فرکانس، بار سرور و تجربه کاربر انجام می‌شود و بدون آن، انتشار به تولید ریسک بالایی دارد. در این راهنما از اصول پایه تا استقرار تولیدی مدیریت Heartbeat را با نگاه مهندسی و کد عملی پوشش می‌دهیم.

در پروژه‌های واقعی، وقتی مصرف CPU هاست اشتراکی به سقف می‌رسد، معمولاً اولین چیزی که بررسی می‌کنم Heartbeat است. صرف چند دقیقه برای تنظیم فرکانس، معمولاً مصرف CPU را به نصف کاهش می‌دهد. این راهنما از همان نقطه‌ای شروع می‌کند که تجربه می‌گوید بیشترین ارزش را دارد.

Heartbeat API چیست و چرا وجود دارد؟

Heartbeat API از وردپرس ۳.۶ اضافه شد و هدف آن، هماهنگی لحظه‌ای بین چند کاربر، ذخیره خودکار محتوا و به‌روزرسانی اعلان‌ها است. این مکانیزم با ارسال درخواست‌های AJAX دوره‌ای به admin-ajax.php کار می‌کند.

پیش از ادامه، راهنمای Object Cache و کش آبجکت حرفه‌ای را مطالعه کنید. اگر با ساختار admin-ajax آشنایی ندارید، راهنمای بهینه‌سازی admin-ajax.php در وردپرس نقطه شروع مناسبی است.

نشانه‌هایی که Heartbeat مشکل‌ساز است

اگر مصرف CPU هاست بالا است، اگر تعداد درخواست‌های admin-ajax.php زیاد است، اگر سرور در ساعات کاری کند می‌شود، یا اگر سایت روی هاست اشتراکی ضعیف اجرا می‌شود، Heartbeat را بررسی کنید.

آناتومی Heartbeat و درخواست‌های AJAX

Heartbeat به‌صورت پیش‌فرض از فرکانس‌های زیر استفاده می‌کند:

  1. ۱۵ ثانیه: در ادیتور نوشته.
  2. ۶۰ ثانیه: در پیشخوان و سایر صفحات.
POST /wp-admin/admin-ajax.php
action=heartbeat
interval=15
screen_id=post
_ajax_nonce=xxx

هر درخواست، یک بار PHP را بیدار می‌کند، دیتابیس را می‌خواند و پاسخ JSON برمی‌گرداند. همین چرخه، در مقیاس بزرگ هزینه‌بر است.

محاسبه بار واقعی

در یک پنل با 5 کاربر همزمان:
هر کاربر در هر دقیقه: 1 درخواست (60s interval)
5 کاربر × 1 = 5 درخواست در دقیقه
= 300 درخواست در ساعت
= 7200 درخواست در روز

در ادیتور نوشته با interval=15:
هر کاربر در دقیقه: 4 درخواست
= 5760 درخواست در روز به ازای هر کاربر

اثر Heartbeat بر بار سرور

هر درخواست Heartbeat شامل مراحل زیر است:

  1. بارگذاری کامل وردپرس (bootstrap).
  2. بارگذاری Pluginها و Theme.
  3. اجرای چند کوئری دیتابیس.
  4. تولید پاسخ JSON.

در هاست‌های اشتراکی، همین چرخه می‌تواند باعث رسیدن به محدودیت Entry Processes شود.

مقایسه بار در هاست‌های مختلف

هاستEntry LimitHeartbeat 15sHeartbeat 120s
اشتراکی ضعیف20مشکل‌سازقابل قبول
اشتراکی معمولی40قابل قبولخوب
VPSبالابی‌اثربی‌اثر

تنظیم فرکانس حرفه‌ای

ساده‌ترین راه بهینه‌سازی، افزایش فرکانس Heartbeat است. این کار با فیلتر heartbeat_settings انجام می‌شود.

<?php
add_filter( "heartbeat_settings", function( $settings ) {
    $settings["interval"] = 120; // 120 ثانیه
    return $settings;
} );

مقدار پیشنهادی برای سایت‌های پربازدید: ۶۰ تا ۱۲۰ ثانیه.

تنظیم فرکانس بر اساس نقش کاربر

<?php
add_filter( "heartbeat_settings", function( $settings ) {
    if ( ! current_user_can( "manage_options" ) ) {
        $settings["interval"] = 180;
    }
    return $settings;
} );

مدیران کل به‌روزرسانی سریع‌تر و سایر کاربران به‌روزرسانی کندتر نیاز دارند.

محدودسازی شرطی بر اساس صفحه

بهترین رویکرد، محدودسازی Heartbeat بر اساس نوع صفحه است.

<?php
add_action( "admin_enqueue_scripts", function() {
    global $pagenow;

    // در همه صفحات، به‌جز ادیتور، غیرفعال کن
    if ( "post.php" !== $pagenow && "post-new.php" !== $pagenow ) {
        wp_deregister_script( "heartbeat" );
    }
} );

غیرفعال‌سازی در Frontend

Heartbeat در Frontend به‌طور پیش‌فرض فعال نیست، اما برخی Pluginها آن را فعال می‌کنند. بررسی کنید.

add_action( "init", function() {
    if ( ! is_admin() ) {
        wp_deregister_script( "heartbeat" );
    }
} );

غیرفعال‌سازی در صفحات غیرمرتبط

<?php
add_action( "admin_enqueue_scripts", function() {
    global $pagenow;
    $allowed = array( "post.php", "post-new.php", "edit.php", "index.php" );
    if ( ! in_array( $pagenow, $allowed, true ) ) {
        wp_deregister_script( "heartbeat" );
    }
} );

غیرفعال‌سازی کامل و خطرات آن

غیرفعال‌سازی کامل Heartbeat، عواقب زیر را دارد:

  1. ذخیره خودکار در ادیتور از کار می‌افتد.
  2. قفل ویرایش چند کاربره غیرفعال می‌شود.
  3. اعلان‌های لحظه‌ای ارسال نمی‌شوند.
  4. پیش‌نمایش زنده (Auto Refresh) از کار می‌افتد.
// غیرفعال‌سازی کامل (توصیه نمی‌شود)
add_action( "init", function() {
    wp_deregister_script( "heartbeat" );
} );

توصیه می‌کنم به‌جای غیرفعال‌سازی کامل، فرکانس را افزایش دهید.

خطرات در WordPress Multisite

در Multisite، غیرفعال‌سازی Heartbeat می‌تواند بر هماهنگی بین سایت‌ها اثر بگذارد. راهنمای راهنمای Multisite وردپرس را ببینید.

Heartbeat در WooCommerce

WooCommerce از Heartbeat برای به‌روزرسانی موجودی، قیمت و اعلان سفارش جدید استفاده می‌کند. در فروشگاه‌های پربازدید، همین مکانیزم بار سنگینی ایجاد می‌کند.

<?php
add_filter( "heartbeat_settings", function( $settings ) {
    if ( function_exists( "is_woocommerce" ) && is_woocommerce() ) {
        $settings["interval"] = 60;
    }
    return $settings;
} );

تنظیم Heartbeat در پنل سفارشات WooCommerce

<?php
add_filter( "heartbeat_settings", function( $settings ) {
    global $pagenow, $typenow;
    if ( "edit.php" === $pagenow && "shop_order" === $typenow ) {
        $settings["interval"] = 120;
    }
    return $settings;
} );

راهنمای ساخت افزونه ووکامرس حرفه‌ای نقطه شروع مناسبی است.

Heartbeat با چند کاربر همزمان

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

// کاهش فرکانس بر اساس تعداد کاربران آنلاین
add_filter( "heartbeat_settings", function( $settings ) {
    $online = get_transient( "wpk_online_users" );
    if ( $online && $online > 10 ) {
        $settings["interval"] = 180;
    }
    return $settings;
} );

پایش تعداد کاربران آنلاین

<?php
add_action( "init", function() {
    if ( ! is_user_logged_in() ) {
        return;
    }
    $user_id = get_current_user_id();
    set_transient( "wpk_user_online_" . $user_id, 1, 5 * MINUTE_IN_SECONDS );
} );

پایش و اندازه‌گیری بار

برای اندازه‌گیری اثر Heartbeat بر سرور، از لاگ admin-ajax.php استفاده کنید.

grep "action=heartbeat" /var/log/nginx/access.log | wc -l

اگر تعداد درخواست‌ها بیش از ۱۰٪ کل درخواست‌ها باشد، تنظیم مجدد ضروری است.

پایش با ابزارهای مدیریتی

ابزارهایی مثل New Relic و Blackfire می‌توانند زمان پاسخ admin-ajax.php را نشان دهند. راهنمای پیکربندی New Relic برای وردپرس نقطه شروع مناسبی است.

مقایسه قبل و بعد از تنظیم

معیارقبلبعد
درخواست Heartbeat در دقیقه123
مصرف CPU (ادیتور)25%8%
زمان پاسخ سرور800ms400ms

تست و دیباگ

تست Heartbeat در سه سطح انجام می‌شود: سطح فرکانس، سطح بار سرور و سطح تجربه کاربر.

<?php
add_action( "wp_footer", function() {
    if ( is_admin() && defined( "WP_DEBUG" ) && WP_DEBUG ) {
        error_log( "Heartbeat interval: " . apply_filters( "heartbeat_settings", array() )["interval"] );
    }
} );

اشتباهات رایج در تست

اشتباه اول، نبود تست با چند کاربر. اشتباه دوم، نبود تست با Pluginهای فعال. اشتباه سوم، نبود تست در ادیتور. اشتباه چهارم، نبود تست در فروشگاه. اشتباه پنجم، نبود تست با کش فعال.

پرسش‌های پرتکرار درباره Heartbeat API

Heartbeat API چیست؟

یک مکانیزم Polling که برای هماهنگی چند کاربر و ذخیره خودکار استفاده می‌شود.

آیا غیرفعال کردن Heartbeat خطرناک است؟

بله، ذخیره خودکار و قفل ویرایش از کار می‌افتد. توصیه می‌کنم فقط فرکانس را افزایش دهید.

فرکانس مطلوب Heartbeat چقدر است؟

۶۰ تا ۱۲۰ ثانیه برای سایت‌های پربازدید.

آیا Heartbeat روی Frontend اجرا می‌شود؟

به‌طور پیش‌فرض خیر، اما برخی Pluginها آن را فعال می‌کنند.

چرا مصرف CPU هاست من بالا است؟

احتمالاً Heartbeat با فرکانس کوتاه و چند کاربر همزمان اجرا می‌شود. لاگ admin-ajax.php را بررسی کنید.

آیا Heartbeat روی سرعت Frontend اثر دارد؟

خیر، مگر اینکه Plugin خاصی آن را در Frontend فعال کند.

نتیجه و مسیر ادامه

Heartbeat API یکی از منابع پنهان بار سرور در وردپرس است. کلید موفقیت، تنظیم فرکانس مناسب، محدودسازی شرطی، مدیریت در WooCommerce و پایش مداوم است. اگر این لایه‌ها با دقت طراحی شوند، پنل و فروشگاه در طول سال‌ها سریع باقی می‌مانند.

پیشنهاد می‌کنم مسیر یادگیری را با Object Cache و کش آبجکت حرفه‌ای ادامه دهید و سپس Transient vs Option و انتخاب صحیح را به‌عنوان مکمل مطالعه کنید. همچنین مفهوم Comet را در ویکی‌پدیا مرور کنید.

اگر روی پروژه واقعی خود Heartbeat را بهینه کرده‌اید، برایم جالب است بدانید کدام بخش — تنظیم فرکانس یا محدودسازی شرطی — بیشترین تأثیر را داشته است. تجربه خودتان را در دیدگاه‌ها بنویسید.