WordPress Heartbeat API 'beats' staggered หรือเกิดขึ้นพร้อมกันสำหรับผู้ใช้ทั้งหมดหรือไม่


14

WordPress Heartbeat API ใช้ admin-ajax.php เพื่อเรียกใช้ AJAX หาก User X เปิดเบราว์เซอร์ไว้การโทรจำนวนมากจะถูกส่งไปยังเซิร์ฟเวอร์โดยแต่ละการโทรจะเกิดขึ้นเมื่อมี 'จังหวะ' ตอนนี้ถ้าผู้ใช้ Y เปิดเบราว์เซอร์ไว้การโทรจำนวนมากจะถูกส่งไปยังเซิร์ฟเวอร์โดยการโทรแต่ละครั้งจะเกิดขึ้นเมื่อมีการ 'ชนะ' เป็นไปได้ว่าเว็บไซต์ขนาดใหญ่จะมีผู้ใช้ A, ผู้ใช้ B และผู้ใช้ C ทำเหมือนกันทั้งหมด

คำถามของฉัน:

เมื่อพิจารณาจากผู้ใช้จำนวนมากอาจเข้าถึงเว็บไซต์พร้อมกันคือ WordPress Heartbeat API 'beats' ที่ได้ถูกย้าย ('Beat' สำหรับ User X เกิดขึ้นสองสามวินาทีก่อนที่ 'Beat' สำหรับ User Y) หรือ 'beat' เกิดขึ้นในสิ่งเดียวกัน ถึงเวลาสำหรับผู้ใช้ทั้งหมดหรือไม่

หาก 'beats' ไม่ได้ถูกส่ายความกังวลของฉันคือการโหลดที่หนักมากบนเซิร์ฟเวอร์ ณ จุดที่เกิดการ 'beat'


ฉันไม่รู้คำตอบของเรื่องนี้มันเป็นเรื่องที่น่าสนใจ ผมคิดว่าคุณสามารถทำแบบทดสอบขั้นพื้นฐานด้วยการเข้าสู่พื้นที่ admin จากเบราว์เซอร์หลาย / คอมพิวเตอร์และกว่าการมองใกล้ที่ร้องขอการเต้นของหัวใจและตาม PHP ประหารชีวิตสคริปต์บ้างเช่นที่กล่าวถึงในนี้บทความ
นิโคไล

@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()วิธีการที่มีการโทรและการใช้อาแจ็กซ์always()

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

เพื่อกำหนดเวลาติ๊กถัดไป

ช่วงเวลาที่มีเห็บคือ 5, 15, 30 และ 60

สำหรับผู้ใช้ที่ใช้งานเป็นจำนวนมากโดยมีช่วงเวลาการทำเครื่องหมายสั้น ๆ จังหวะอาจปรากฏขึ้นพร้อมกัน

มันดีเสมอที่จะมีข้อมูลบางส่วนดังนั้นคุณสามารถบันทึกเห็บจากผู้ใช้ที่เข้าสู่ระบบด้วย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 ); 

นี่คือตัวอย่างจาก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.