国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman http協(xié)議問題

huazai

問題描述

前提
workerman 使用http協(xié)議開發(fā),當(dāng)使用Connection: keep-alive設(shè)置頭

問題
1.這個(gè)keep-alive的時(shí)間是多長,在哪設(shè)置和可以看到
2.時(shí)間到了,是服務(wù)器主動斷開還是客戶端斷開
3.這個(gè)斷開是如何檢測的(即如何判斷時(shí)間到了,我需要斷開),我看workerman 沒有檢測的代碼,也沒有心跳
4.我網(wǎng)頁訪問,把網(wǎng)頁關(guān)閉了,前面保持的連接還在嗎?什么時(shí)候銷毀,服務(wù)器如何感知并觸發(fā)onClose事件,是基于四次握手嗎?但是我是突然把網(wǎng)頁進(jìn)程給關(guān)閉了啊

553 1 0
1個(gè)回答

walkor 打賞

workerman作為底層只實(shí)現(xiàn)了http協(xié)議,沒有實(shí)現(xiàn)完整的webserver邏輯。
協(xié)議本身并不會檢測Connection頭,也不會根據(jù)Connection頭主動做出關(guān)閉連接操作。
服務(wù)端如果不關(guān)閉連接,瀏覽器會主動關(guān)閉,時(shí)間多久不同瀏覽器可能行為不一樣,估計(jì)30-60秒
斷開連接一般用定時(shí)器,連接關(guān)閉服務(wù)端會受到fin包表示連接關(guān)閉
瀏覽器關(guān)閉后連接就不存在了,服務(wù)端會立刻受到fin包,onclose會立刻觸發(fā)。

  • huazai 2024-06-20

    收到,謝謝大佬,剛才通過自己做實(shí)驗(yàn)和查閱相關(guān)知識,大概明白了,我的思路和理解是

    1.通過在onClose 執(zhí)行debug_backtrace()方法,打印調(diào)用棧,定位到了和onClose有關(guān)系的Event.php的loop方法和TcpConnection.php的baseRead方法
    2.通過查詢文檔,socket的讀寫事件是交給libevent進(jìn)行l(wèi)oop循環(huán)的,當(dāng)有事件觸發(fā)會激發(fā)先前自己注冊的方法
    3.瀏覽器進(jìn)程突然kill掉,會由內(nèi)核和服務(wù)器交互斷開鏈接.正常情況下,會由瀏覽器進(jìn)程自己處理超時(shí),和服務(wù)器斷開鏈接(我自己電腦好幾分鐘才觸發(fā)斷開,我想這就是為什么需要心跳包原因了,容易資源浪費(fèi))
    4.鏈接斷開回觸發(fā)四次握手,客戶端發(fā)送fin包。libevent收到fin包,觸發(fā)可讀事件,激發(fā)了baseRead方法,在baseRead執(zhí)行到
    try {
    $buffer = @\fread($socket, self::READ_BUFFER_SIZE);
    } catch (\Exception $e) {} catch (\Error $e) {}

        // Check connection closed.
        if ($buffer === '' || $buffer === false) {
            if ($check_eof && (\feof($socket) || !\is_resource($socket) || $buffer === false)) {
                $this->destroy();
                return;
            }
        } 

    由于需要斷開鏈接了,讀不到內(nèi)容,觸發(fā)了$this->destroy(),從而在觸發(fā)onClose里面的東西。

??