API WordPress Heartbeat 'nhịp đập' được đặt so le hay chúng xảy ra đồng thời cho tất cả người dùng?


14

API Heartbeat của WordPress sử dụng admin-ajax.php để chạy các cuộc gọi AJAX. Nếu Người dùng X để trình duyệt của họ mở, nhiều cuộc gọi sẽ được thực hiện với máy chủ, với mỗi cuộc gọi xảy ra khi có 'nhịp'. Bây giờ nếu Người dùng Y để trình duyệt của họ mở, nhiều cuộc gọi khác sẽ được thực hiện với máy chủ, với mỗi cuộc gọi này sẽ xảy ra khi có 'nhịp'. Có thể một trang web lớn cũng sẽ có Người dùng A, Người dùng B và Người dùng C đều làm như vậy.

Câu hỏi của tôi:

Xem xét nhiều người dùng có thể truy cập vào một trang web cùng một lúc, đó là 'nhịp đập' của WordPress Heartbeat (nhịp 'cho Người dùng X xảy ra vài giây trước khi' nhịp 'cho Người dùng Y) hoặc' nhịp 'xảy ra hoàn toàn giống nhau Thời gian cho tất cả người dùng?

Nếu 'nhịp đập' không được đặt so le, mối quan tâm của tôi là tải rất nặng trên máy chủ tại thời điểm 'nhịp' xảy ra.


Tôi không biết câu trả lời cho điều này, mặc dù nó rất thú vị. Tôi tưởng tượng bạn có thể thực hiện một bài kiểm tra cơ bản bằng cách đăng nhập vào khu vực quản trị từ nhiều trình duyệt / máy tính và hơn là xem xét kỹ hơn các yêu cầu nhịp tim và thực thi tập lệnh PHP, giống như được đề cập trong bài viết này .
Nicolai

@ialocin Tôi đã kích hoạt một trình ghi nhật ký tick vài ngày trước để kiểm tra điều này, nhưng sau đó tôi đã quên tắt nó đi nên khi tôi kiểm tra nó hôm nay, số lượng bọ ve khá đáng sợ ;-)
birgire

Tôi có thể tưởng tượng rằng họ tích lũy nhanh chóng. Ví dụ từ câu trả lời của bạn cho một ý tưởng hay tôi đoán .. @birgire
Nicolai

Câu trả lời:


7

Tôi nghĩ rằng nhịp đập được tự nhiên so le , vì dấu tích tiếp theo được xác định bởi thời gian trình duyệt time()trong scheduleNextTick()phương thức trong /wp-includes/js/heartbeat.jstệp:

 var delta = time() - settings.lastTick,
     interval = settings.mainInterval;

nơi nó được sử dụng để lên lịch đánh dấu tiếp theo với setTimeoutchức năng:

if ( delta < interval ) {
    settings.beatTimer = window.setTimeout(
        function() {
            connect();
        },
        interval - delta
     );
} else {
    connect();
}

Thời gian trình duyệt được xác định là:

function time() {
   return (new Date()).getTime();
}

Các connect()phương pháp bao gồm các cuộc gọi ajax và cách sử dụngalways()

.always( function() {
    settings.connecting = false;
    scheduleNextTick();
})

để lên lịch đánh dấu tiếp theo.

Các khoảng thời gian đánh dấu có sẵn là 5s, 15, 30 và 60.

Đối với một số lượng lớn người dùng rất tích cực, với khoảng thời gian đánh dấu ngắn, nhịp đập dường như xảy ra đồng thời.

Luôn có một số dữ liệu tốt, vì vậy bạn có thể đăng nhập các dấu tick từ người dùng đã đăng nhập, bằng heartbeat_tickhook:

add_action( 'heartbeat_tick', 
    function(  $response, $screen_id  )
    {
        $file =  WP_CONTENT_DIR . '/ticks.log'; // Edit this filepath to your needs.

        if( file_exists( $file ) && is_writeable( $file ) ) 
        {
            file_put_contents( 
                $file, 
                sprintf( "%s - Tick from user_id : %d - from screen_id : %s" . PHP_EOL,
                    date( 'c' ),
                    get_current_user_id(),
                    $screen_id
                ), 
                FILE_APPEND | LOCK_EX 
            );
        }
    }
, 11, 2 ); 

Đây là một ví dụ từ ticks.logtệp:

2014-09-01T12:41:04+00:00 - Tick from user_id : 1 - from screen_id : edit-post
2014-09-01T12:41:19+00:00 - Tick from user_id : 1 - from screen_id : edit-post
2014-09-01T12:41:34+00:00 - Tick from user_id : 1 - from screen_id : edit-post
2014-09-01T12:41:56+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:42:11+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:42:20+00:00 - Tick from user_id : 3 - from screen_id : upload
2014-09-01T12:42:38+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:43:05+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:43:08+00:00 - Tick from user_id : 3 - from screen_id : attachment
2014-09-01T12:43:20+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:43:36+00:00 - Tick from user_id : 1 - from screen_id : post
2014-09-01T12:44:17+00:00 - Tick from user_id : 3 - from screen_id : profile

Cảm ơn cho một câu trả lời chi tiết. Hiểu biết của tôi là có hai nhịp cho một chu kỳ. Nhịp ban đầu được xác định bởi trình duyệt và sau đó là nhịp trở lại . Rõ ràng từ câu trả lời của bạn rằng nhịp ban đầu được đặt so le. Có phải nhịp trả về (gửi dữ liệu từ máy chủ trở lại trình duyệt) cũng được đặt so le không?
henrywright
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.