워드 프레스 하트 비트 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.