워드 프레스 하트 비트 API '비트'가 엇갈 리거나 모든 사용자에게 동시에 발생합니까?


14

WordPress Heartbeat API는 admin-ajax.php를 사용하여 AJAX 호출을 실행합니다. 사용자 X가 브라우저를 열린 상태로두면 서버에 대한 많은 호출이 이루어지며 '비트'가있을 때 각 호출이 발생합니다. 이제 사용자 Y가 브라우저를 열린 상태로두면 서버에 대해 더 많은 호출이 이루어지며 '비트'가있을 때 이러한 각 호출이 발생합니다. 대규모 웹 사이트에서도 사용자 A, 사용자 B 및 사용자 C가 모두 동일한 작업을 수행 할 수 있습니다.

내 질문:

많은 사용자가 동시에 웹 사이트에 액세스 할 수 있다는 점을 고려하면 WordPress Heartbeat API '비트'가 비틀 거리거나 (사용자 X의 '비트'가 사용자 Y의 '비트'몇 초 전에 발생 함) '비트'가 정확히 동일하게 발생합니까 모든 사용자를위한 시간?

'beats'가 비틀 거리지 않으면 내 문제는 'beat'가 발생할 때 서버에 매우 많은 부하가 걸린다는 것입니다.


나는 이것에 대한 답을 모른다. 흥미 롭다. 여러 브라우저 / 컴퓨터에서 관리자 영역에 로그인 하고이 기사 에서 언급 한 것처럼 하트 비트 요청과 그에 따른 PHP 스크립트 실행을 자세히 살펴 보는 것보다 기본 테스트를 수행 할 수 있다고 생각합니다 .
— Nicolai

@ialocin 나는이 체크 아웃하기 며칠 전 틱 로거를 활성화,하지만 난 오늘을 체크 아웃 할 때 그때, 진드기의 양이 ;-) 아주 무서운 그래서 그것을 해제하는 것을 잊었다
— birgire

나는 그들이 빠르게 축적되는 것을 상상할 수 있습니다. 당신이 대답 한 예는 내가 생각하는 좋은 아이디어를 제공합니다. @birgire
— Nicolai

답변:


7

나는 비트가 생각 시차를 다음 변경할 수 없기, 자연 틱이 브라우저 시간에 의해 결정된다 time()내 scheduleNextTick()의 방법 /wp-includes/js/heartbeat.js파일 :

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

setTimeout함수로 다음 틱을 예약하는 데 사용되는 위치 :

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

브라우저 시간은 다음과 같이 정의됩니다.

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

이 connect()메소드는 ajax 호출을 포함하고always()

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

다음 틱을 예약합니다.

사용 가능한 틱 간격은 5 초, 15 초, 30 초 및 60 초입니다.

짧은 틱 간격을 가진 다수의 매우 활동적인 사용자의 경우 비트가 동시에 발생하는 것처럼 보일 수 있습니다.

항상 데이터를 보유하는 것이 좋습니다. 따라서 로그인 한 사용자의 틱을 heartbeat_tick후크로 기록 할 수 있습니다 .

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 ); 

ticks.log파일 의 예는 다음과 같습니다 .

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

자세한 답변을 주셔서 감사합니다. 내 이해는 사이클에 두 가지 비트 가 있다는 것입니다 . 브라우저에 의해 결정된 초기 비트와 리턴 비트 . 당신의 대답에서 초기 비트가 비틀 거리는 것은 분명합니다. 리턴 비트 (서버에서 브라우저로 데이터를 다시 보내는)도 지체되어 있습니까?
— henrywright
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.