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

關(guān)于http協(xié)議下,restart -g時(shí)造成的進(jìn)程每處理一條請求就退出的問題

www

workerman版本4.0.6
現(xiàn)象:使用restart -g重啟服務(wù),進(jìn)程每處理一個請求后就退出.客戶端使用php curl,使用瀏覽器訪問,當(dāng)瀏覽器關(guān)閉時(shí)也會出現(xiàn)這個現(xiàn)象.而服務(wù)正常start時(shí)無此問題.
經(jīng)實(shí)驗(yàn)發(fā)現(xiàn),curl每次請求完后會關(guān)閉連接,此時(shí)TcpConnection類會destroy當(dāng)前連接,進(jìn)入__destruct,由于-g參數(shù)為true會走到Worker::stopAll,造成進(jìn)程退出.
截圖
代碼是TcpConnection.php的截圖,998行由于-g參數(shù)的存在,條件為真,當(dāng)連接數(shù)為0時(shí),進(jìn)程退出.
請問998行到1010行的代碼的作用是什么?如果刪除掉會有什么影響?

2143 2 1
2個回答

six

restart為啥要加-g ?,-g是平滑退出進(jìn)程用的。

  • 暫無評論
phpcreeper

我還是從個人的理解嚴(yán)謹(jǐn)下相關(guān)的概念:
1、workerman的平滑指的的是reload指令干的事情,并不是 -g 參數(shù)所起的作用,而且也不是一回事,關(guān)于什么是平滑重啟,手冊說的很清楚:
http://doc.workerman.net/faq/reload-principle.html
2、-g 參數(shù)正如單詞gracefully含義一樣,代表“優(yōu)雅”行為,所以restart -g 即代表優(yōu)雅重啟進(jìn)程,當(dāng)然還有 stop -g 即代表優(yōu)雅的退出進(jìn)程;這里也能看出很大的區(qū)別了;

概念明確了,那我們還得從“優(yōu)雅”行為背后的業(yè)務(wù)概念理解說起:
1、首先刪了肯定是不行的有影響的,刪了題示的那幾行代碼則workerman所體現(xiàn)的“優(yōu)雅”功能蕩然無存了;
2、restart -g 體現(xiàn)在: 如果重啟之前仍有存活的TCP連接,甚至連接上還有數(shù)據(jù)的來往交互,如果沒有-g, 那就相當(dāng)于強(qiáng)硬重啟進(jìn)程,即原子進(jìn)程立即退出,新的子進(jìn)程立即補(bǔ)上來,原連接強(qiáng)制被中斷,數(shù)據(jù)因此可能丟失;相反,原子進(jìn)程則不會立即退出,直至該進(jìn)程內(nèi)的所有連接都已妥善斷開才會補(bǔ)充一個新的子進(jìn)程上來繼續(xù)服務(wù),所謂的“優(yōu)雅”重啟說的這個。

  • www 2020-07-22

    感謝解答!我能否理解為-g參數(shù)只能跟reload一起用,restart不能使用-g參數(shù)?

  • phpcreeper 2020-07-22

    不是你理解的這樣的, stop、restart、reload指令均可以配合 -g 參數(shù)。

  • www 2020-07-22

    那我有點(diǎn)不明白了,restart -g會產(chǎn)生上面說的問題,還是可以用?

  • phpcreeper 2020-07-22

    首先你客戶端的行為無非就是什么時(shí)刻切斷tcp連接的問題;其次服務(wù)端這邊執(zhí)行了restart 不論有沒有-g參數(shù)都會導(dǎo)致原進(jìn)程退出并重新補(bǔ)充一個新的上來,只不過這個行為受到-g參數(shù)的影響【這個時(shí)候和客戶端的TCP連接是有關(guān)系的】,具體的影響上面那大段話說的很明白了,自己再捋一捋吧;

  • www 2020-07-23

    @614:非常感謝你能抽出時(shí)間來解答我的問題,但是說實(shí)話,我還是有點(diǎn)不明白,可能是我基礎(chǔ)比較弱.我補(bǔ)充下提出問題的原因.我需要的是業(yè)務(wù)可以熱重啟,就是說重啟時(shí)不能丟失當(dāng)前的業(yè)務(wù)數(shù)據(jù).reload -g可以做到,但是,當(dāng)服務(wù)器配置更改,比如增加了進(jìn)程數(shù),或者修改了啟動腳本,reload就不行了(這種情況很少見,但是我必須要考慮當(dāng)它發(fā)生時(shí)可能帶來的后果).restart重啟時(shí),如果有業(yè)務(wù)執(zhí)行時(shí)間較長,會被強(qiáng)制kill掉,業(yè)務(wù)數(shù)據(jù)會丟失.stop -g后再start在低訪問量時(shí)是可以的,但是訪問量高時(shí)會有閃斷.我原以為restart -g可以實(shí)現(xiàn)我的需求(也可能有閃斷問題,暫且不論),但是卻有進(jìn)程退出的問題.基于上面的原因我提出了前面的問題,其實(shí)我不是想糾結(jié)什么時(shí)候用-g什么時(shí)候不用,我只是想解決問題.目前我的解決方案是用shell先啟動一個新的服務(wù),啟動完成后再關(guān)閉老的服務(wù),暫時(shí)沒有更好的辦法了.感謝回復(fù)!

  • phpcreeper 2020-07-23

    @5923:
    1、增加了進(jìn)程或者修改啟動腳本,這兩個沒轍,勢必會牽扯到進(jìn)程的重啟,也沒有什么熱啟一說,熱啟就是針對reload指令以及常見的更新業(yè)務(wù)代碼常見而言的;另外多說一句restart是父子進(jìn)程全部退出重來,reload僅僅只是子進(jìn)程退出重來,但也支持設(shè)置不退出,看你場景。
    2、根據(jù)workerman自身的信號實(shí)現(xiàn)的工作機(jī)制,無論是restart亦或是stop或者是reload,都會涉及到進(jìn)程的退出的問題,但是進(jìn)程退出前會有兩種情況發(fā)生:一個是業(yè)務(wù)代碼會正常執(zhí)行完畢后進(jìn)程正常退出;另外一個是設(shè)定在指定的時(shí)間內(nèi)【參考常量Worker::KILL_WORKER_TIMER_TIME】業(yè)務(wù)必須執(zhí)行完畢,否則到期后進(jìn)程強(qiáng)制退出【當(dāng)然針對是非優(yōu)雅手段操作進(jìn)程】。

    所以不難發(fā)現(xiàn),不管哪種情況都有可能造成業(yè)務(wù)數(shù)據(jù)的丟失,所以官方手冊里也有提到不要在進(jìn)程里保存業(yè)務(wù)數(shù)據(jù);至于提及的新舊服務(wù),這個我理解的就是如何不影響用戶持續(xù)不間斷的提供服務(wù),一般就是上集群了。

年代過于久遠(yuǎn),無法發(fā)表回答
??