WordPress Heartbeat API 'atımları' kademeli mi yoksa tüm kullanıcılar için aynı anda mı gerçekleşiyor?


14

WordPress Heartbeat API, AJAX çağrılarını çalıştırmak için admin-ajax.php kullanır. Kullanıcı X tarayıcılarını açık bırakırsa, sunucuya birçok çağrı yapılır ve her çağrı bir 'vuruş' olduğunda gerçekleşir. Şimdi Y Kullanıcısı tarayıcılarını açık bırakırsa, sunucuya çok daha fazla çağrı yapılır ve bu çağrıların her biri bir 'vuruş' olduğunda gerçekleşir. Büyük bir web sitesinin A Kullanıcısı, B Kullanıcısı ve C Kullanıcısı'nın da aynı şeyi yapması mümkündür.

Benim sorum:

Birçok kullanıcının bir web sitesine aynı anda erişebileceği düşünüldüğünde, WordPress Heartbeat API 'atımları' kademeli mi (X Kullanıcısı için 'vuruş', Y Kullanıcısı için 'vuruştan birkaç saniye önce gerçekleşir) veya tamamen aynı anda bir' vuruş 'gerçekleşir mi? tüm kullanıcılar için zaman?

Eğer 'atımlar' sendelemediyse, endişem sunucuda 'beat' olduğunda çok ağır bir yük.


Bunun cevabını bilmiyorum, yine de ilginç. Birden fazla tarayıcı / bilgisayardan yönetici alanına giriş yaparak ve bu makalede bahsedildiği gibi kalp atışı isteklerine ve ilgili PHP komut dosyası uygulamalarına daha yakından bakarak temel bir test yapabileceğinizi düşünüyorum .
Nicolai

@ialocin Bunu kontrol etmek için birkaç gün önce bir kene logger'ı etkinleştirdim, ancak daha sonra bugün kontrol ettiğimde, kenelerin miktarı oldukça korkutucuydu ;-)
birgire

Hızla biriktiklerini hayal edebiliyorum. Cevabınızdaki örnek sanırım iyi bir fikir veriyor .. @birgire
Nicolai

Yanıtlar:


7

Ben atımlardır düşünürdüm Staggered sonraki yapmamı, doğası gereği kene tarayıcı süresi ile belirlenir time()içinde scheduleNextTick()de yöntemin /wp-includes/js/heartbeat.jsdosyası:

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

burada setTimeoutişlev ile bir sonraki onay işaretini planlamak için kullanılır :

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

Tarayıcı süresi şu şekilde tanımlanır:

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

connect()Yöntem ajax arama ve kullanımları içeriralways()

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

sonraki onaylamayı planlamak için.

Kullanılabilir tik aralıkları 5s, 15s, 30s ve 60s'dir.

Kısa bir kene aralığı olan çok sayıda aktif kullanıcı için, ritimler aynı anda gerçekleşebilir.

Bazı verilere sahip olmak her zaman iyidir, böylece giriş yapmış kullanıcılardan gelen keneleri heartbeat_tickkanca ile kaydedebilirsiniz :

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

İşte ticks.logdosyadan bir örnek :

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

Bu kadar ayrıntılı bir cevap için teşekkürler. Anladığım kadarıyla, bir döngü için iki vuruş var . Tarayıcı tarafından belirlenen ilk vuruş ve sonra bir dönüş atışı . Cevabınızdan, ilk vuruşun kademeli olduğu açıktır. Geri dönüş (sunucudan tarayıcıya veri gönderen) de kademeli mi?
henrywright
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.