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

[已解決]webman+swoole,協(xié)程環(huán)境中HttpRequest已經(jīng)做了協(xié)程上下文處理了嗎

xiaopi

問題描述

1.測試兩個請求,第一個請求協(xié)程掛起5秒后輸出所有請求參數(shù);第二個請求直接輸出所有請求參數(shù)。如果\Workerman\Protocols\Http\Request沒存儲上下文的話,第一個請求返回的應(yīng)該已經(jīng)被第二個請求污染了啊

2.如果\Workerman\Protocols\Http\Request做了協(xié)程上下文處理,那是否意味著在webman控制器中可以不用考慮自己處理請求上下文,可以直接用$request對象?

截圖

截圖
截圖
截圖
截圖

結(jié)論

通過代碼得知,Request確實針對swoole、swow、Fiber的協(xié)程做了上下文處理
1.通過Webman\App::onMessage()方法可知,當(dāng)請求進來時,會使用webman\Context設(shè)置上下文,發(fā)送完畢后會清理上下文
截圖
截圖

2.通過Webman\Context::getKey()方法得知,會針對不同的協(xié)程環(huán)境獲取協(xié)程id作為key保存起來,即區(qū)分了不同協(xié)程下的request
截圖

1786 2 1
2個回答

nitron

你上面的代碼,每個swTest($request)都是已經(jīng)實例化的Request,當(dāng)然不會覆蓋,$request->all()又不是Lazy Evaluation

  • xiaopi 2024-01-13

    可否這樣理解,$request是協(xié)程內(nèi)的局部變量,所以協(xié)程掛起/恢復(fù)的時候也還是存在的

  • nitron 2024-01-13

    可以,但其實這個不是協(xié)程的局部變量,這是函數(shù)內(nèi)變量,跟協(xié)程沒關(guān)系

  • nitron 2024-01-13

    你之前那個已解決的問題,也跟協(xié)程沒關(guān)系,應(yīng)該是關(guān)掉控制器復(fù)用了,每個請求的controller都是一個新實例,所以也不會出現(xiàn)你說的覆蓋掉的情況

    具體看文檔吧,跟協(xié)程沒關(guān)系,是生命周期的問題
    http://m.wtbis.cn/doc/webman/others/lifecycle.html
    http://m.wtbis.cn/doc/webman/controller.html#%E6%8E%A7%E5%88%B6%E5%99%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F

  • xiaopi 2024-01-13

    感謝,我再看看文檔。我之前那個問題,控制器復(fù)用開啟關(guān)閉都沒影響結(jié)果,所以應(yīng)該就是進程隔離的問題,我開成單進程就可以了

  • xiaopi 2024-01-13

    因為我是用靜態(tài)的變量存的啊,所以跟實例化控制器應(yīng)該沒關(guān)

胡桃

每個onMessage事件都會創(chuàng)建一個新的協(xié)程(也可能是復(fù)用尚未銷毀的空閑協(xié)程),即使是同一個TCP連接,每個請求(onMessage)也會創(chuàng)建新的協(xié)程,每個協(xié)程都有獨立的調(diào)用棧,不存在互相污染的情況,串上下文更是無稽之談,你能在函數(shù)外訪問函數(shù)的局部變量嗎?而所謂的Request/Response就是這個協(xié)程的局部變量。
你的問題在文檔和源碼里都有,不主動去探究將會有無窮無盡的問題。

  • xiaopi 2024-01-13

    感謝,主要是我沒搞清$request是局部變量還是全局變量,我做了測試如果是全局變量協(xié)程中是互相干擾的,那隨后的開發(fā)中,只要注意協(xié)程中使用全局變量的時候需要上下文就可以了

  • efnic 2024-01-17

    【每個onMessage事件都會創(chuàng)建一個新的協(xié)程。】這個代碼內(nèi)沒有找到,版本為workerman ^5.0.0-beta.7、webman 1.5.13

  • xiaopi 2024-01-18

    這個協(xié)程指的是swoole的協(xié)程,不是php8.1的fiber

  • efnic 2024-01-18

    我的意思是,在原版的webman內(nèi)沒看到創(chuàng)建swoole協(xié)程的代碼。

  • xiaopi 2024-01-18

    有的,workerman內(nèi)置了swoole event,可以把event-loop改為\Workerman\Events\Swoole::class ,onMessage就是協(xié)程了,webman中的config/server.php中的event_loop設(shè)置成\Workerman\Events\Swoole::class就行了
    http://m.wtbis.cn/q/3529

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