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

關于http協議下,restart -g時造成的進程每處理一條請求就退出的問題

www

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

2273 2 1
2個回答

six

restart為啥要加-g ?,-g是平滑退出進程用的。

  • 暫無評論
phpcreeper

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

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

  • www 2020-07-22

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

  • phpcreeper 2020-07-22

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

  • www 2020-07-22

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

  • phpcreeper 2020-07-22

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

  • www 2020-07-23

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

  • phpcreeper 2020-07-23

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

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

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