1.測試兩個請求,第一個請求協(xié)程掛起5秒后輸出所有請求參數(shù);第二個請求直接輸出所有請求參數(shù)。如果\Workerman\Protocols\Http\Request沒存儲上下文的話,第一個請求返回的應(yīng)該已經(jīng)被第二個請求污染了啊
2.如果\Workerman\Protocols\Http\Request做了協(xié)程上下文處理,那是否意味著在webman控制器中可以不用考慮自己處理請求上下文,可以直接用$request對象?
通過代碼得知,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
你上面的代碼,每個swTest($request)都是已經(jīng)實例化的Request,當(dāng)然不會覆蓋,$request->all()又不是Lazy Evaluation
你之前那個已解決的問題,也跟協(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
每個onMessage事件都會創(chuàng)建一個新的協(xié)程(也可能是復(fù)用尚未銷毀的空閑協(xié)程),即使是同一個TCP連接,每個請求(onMessage)也會創(chuàng)建新的協(xié)程,每個協(xié)程都有獨立的調(diào)用棧,不存在互相污染的情況,串上下文更是無稽之談,你能在函數(shù)外訪問函數(shù)的局部變量嗎?而所謂的Request/Response就是這個協(xié)程的局部變量。
你的問題在文檔和源碼里都有,不主動去探究將會有無窮無盡的問題。
感謝,主要是我沒搞清$request是局部變量還是全局變量,我做了測試如果是全局變量協(xié)程中是互相干擾的,那隨后的開發(fā)中,只要注意協(xié)程中使用全局變量的時候需要上下文就可以了
【每個onMessage事件都會創(chuàng)建一個新的協(xié)程。】這個代碼內(nèi)沒有找到,版本為workerman ^5.0.0-beta.7、webman 1.5.13
有的,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