在使用webman做項(xiàng)目時(shí)發(fā)現(xiàn)一個(gè)關(guān)于中間件向控制器傳參數(shù)的問(wèn)題,根據(jù)文檔的提示(通過(guò)給$request對(duì)象添加屬性的方式向控制器傳參),在中間件中我設(shè)置了一個(gè)請(qǐng)求id(request_id)(為了可以對(duì)比,我使用了Context儲(chǔ)存了request_id),然后在控制器中讀取它,我特意在中間件穿越前輸出到日志,并在控制器上使用Context讀取其值,與$request->request_id作比較并寫(xiě)入日志。
備注:我開(kāi)啟協(xié)程Workerman\Events\Swoole::class、1進(jìn)程下
我通過(guò)linux的ab命令來(lái)并發(fā)10次請(qǐng)求,并在在下面日志中我發(fā)現(xiàn)個(gè)別現(xiàn)象:
格式:Context的值【控制器讀取數(shù)據(jù)】:$request->request_id的值
1、[2025-04-01 15:21:21] log2.INFO: 0GNY-68VM190J-9LBQIC2C-6F26控制器讀取數(shù)據(jù):0GNY-68VM190J-9LBQIC2C-6F26 [] []
2、[2025-04-01 15:21:21] log2.INFO: UUO1-LPHP5MEX-YXWUYKLB-CVBQ控制器讀取數(shù)據(jù):YDD1-O83MEIWR-V7O4NYKJ-7S38 [] []
3、[2025-04-01 15:21:21] log2.INFO: 4LB9-UQRMO1BE-0NWGQZ6R-IPJ1控制器讀取數(shù)據(jù): [] []
其中【1】就是我想要的結(jié)果,$request->request_id跟Context的request_id一致
其中【2、3】就是我想不到為何會(huì)出現(xiàn)這樣結(jié)果,【2】$request->request_id跟Context的request_id不一致,【3】$request->request_id為空
<?php
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
use support\Context;
use support\Log;
class GolbalRequest implements MiddlewareInterface{
public function process(Request $request, callable $handler) : Response
{
$request_id = generateRequestId();
$request->request_id=$request_id;
Context::set('request_id',$request_id);
$log=Log::Channel('log2');
$log->useLoggingLoopDetection(false);
$log->info('請(qǐng)求開(kāi)始,獲取request_id:'.$request_id);
$response = $handler($request); // 繼續(xù)向洋蔥芯穿越,直至執(zhí)行控制器得到響應(yīng)
return $response;
}
}
?>
<?php
namespace app\bot\controller;
use support\Request;
class IndexController
{
public function index(Request $request)
{
$request_id=Context::get('request_id');
$log=Log::Channel('log2');
$log->info($request_id.'控制器讀取數(shù)據(jù):'.$request->request_id);
}
}
[2025-04-01 15:21:20] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:0GNY-68VM190J-9LBQIC2C-6F26 [] []
[2025-04-01 15:21:21] log2.INFO: 0GNY-68VM190J-9LBQIC2C-6F26控制器讀取數(shù)據(jù):0GNY-68VM190J-9LBQIC2C-6F26 [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:UUO1-LPHP5MEX-YXWUYKLB-CVBQ [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:UIX9-JG2U37UN-WPAJ86VD-X3SO [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:4LB9-UQRMO1BE-0NWGQZ 6R-IPJ1 [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:YDD1-O83MEIWR-V7O4NYKJ-7S38 [] []
[2025-04-01 15:21:21] log2.INFO: UUO1-LPHP5MEX-YXWUYKLB-CVBQ控制器讀取數(shù)據(jù):YDD1-O83MEIWR-V7O4NYKJ-7S38 [] []
[2025-04-01 15:21:21] log2.INFO: UIX9-JG2U37UN-WPAJ86VD-X3SO控制器讀取數(shù)據(jù):YDD1-O83MEIWR-V7O4NYKJ-7S38 [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:35GW-YOAICD9R-7MVSV6EK-E7WN [] []
[2025-04-01 15:21:21] log2.INFO: 4LB9-UQRMO1BE-0NWGQZ6R-IPJ1控制器讀取數(shù)據(jù): [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:7U3D-TT0Q1GKC-9K31DU9X-SPDO [] []
[2025-04-01 15:21:21] log2.INFO: YDD1-O83MEIWR-V7O4NYKJ-7S38控制器讀取數(shù)據(jù): [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:K64C-U12411DA-JX4SXOEH-X7M5 [] []
[2025-04-01 15:21:21] log2.INFO: 35GW-YOAICD9R-7MVSV6EK-E7WN控制器讀取數(shù)據(jù): [] []
[2025-04-01 15:21:21] log2.INFO: 7U3D-TT0Q1GKC-9K31DU9X-SPDO控制器讀取數(shù)據(jù):7U3D-TT0Q1GKC-9K31DU9X-SPDO [] []
[2025-04-01 15:21:21] log2.INFO: K64C-U12411DA-JX4SXOEH-X7M5控制器讀取數(shù)據(jù):K64C-U12411DA-JX4SXOEH-X7M5 [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:79K2-1JG1EG36-0J0YOMZ1-VYJ9 [] []
[2025-04-01 15:21:21] log2.INFO: 79K2-1JG1EG36-0J0YOMZ1-VYJ9控制器讀取數(shù)據(jù):79K2-1JG1EG36-0J0YOMZ1-VYJ9 [] []
[2025-04-01 15:21:21] log2.INFO: 請(qǐng)求開(kāi)始,獲取request_id:9IO7-FT6CVZXQ-0Z3PRCGX-N9JM [] []
[2025-04-01 15:21:21] log2.INFO: 9IO7-FT6CVZXQ-0Z3PRCGX-N9JM控制器讀取數(shù)據(jù):9IO7-FT6CVZXQ-0Z3PRCGX-N9JM [] []
linux系統(tǒng)
composer.json參數(shù):
"php": ">=8.1",
"workerman/webman-framework": "^2.1",
"monolog/monolog": "^2.0",
除了上面問(wèn)題,關(guān)于Request類我最近有一個(gè)疑問(wèn),就是開(kāi)啟協(xié)程后,此時(shí)的Request類是是不是本次請(qǐng)求的局部變量,還是在一個(gè)進(jìn)程中的全局變量?并發(fā)的時(shí)候,Request類的屬性會(huì)不會(huì)被其他(同進(jìn)程)請(qǐng)求所覆蓋?文檔好似沒(méi)有關(guān)于這方面的描述,有沒(méi)有大佬解釋一下?
1.約等于全局
2.只要不是直接修改$request就不會(huì)覆蓋,協(xié)程內(nèi)上下文傳遞請(qǐng)用Context
中間件保留參數(shù),應(yīng)該在request對(duì)象中設(shè)置。這樣可以保證你處理數(shù)據(jù)的時(shí)候,確認(rèn)你依舊在request所在的協(xié)程當(dāng)中。