前言也许这是我们最关心的环节。Web应用程序只不过是请求和响应。获取您真正需要的知识以赶上协程。但。.如果你不懂协程,不懂进程~那就把请求看成一个进程(xie)看成一个进程。如果你懂线程~那就把请求当线程当线程看(xie)流程分析RequestHandlervendor/zanphp/http-server/src/RequestHandler.phpclassRequestHandler{//...//让协程处理每个请求$requestTask=newRequestTask($request,$swooleResponse,$this->context,$this->middleWareManager);$coroutine=$requestTask->run();$this->task=newTask($coroutine,$this->context);$this->task->run();清除对象();//..}分析RequestTaskvendor/zanphp/http-server/src/RequestTask.phpclassRequestTask{publicfunctionrun(){yield$this->doRun();}publicfunctiondoRun(){//处理中间件逻辑$response=(yield$this->middleWareManager->executeFilters());if(null!==$response){$this->context->set('response',$response);/**@varResponseTrait$response*/yield$response->sendBy($this->swooleResponse);$this->context->getEvent()->fire($this->context->get('request_end_event_name'));返回;}//处理中间件释放后的逻辑$dispatcher=Di::make(Dispatcher::class);$response=(yield$dispatcher->dispatch($this->request,$this->context));if(null===$response){$code=BaseResponse::HTTP_INTERNAL_SERVER_ERROR;$response=newInternalErrorResponse("网络错误($code)",$code);}yield$this->middleWareManager->executePostFilters($response);$this->context->set('response',$response);yield$response->sendBy($this->swooleResponse);$this->context->getEvent()->fire($this->context->get('request_end_event_name'));清除对象();}}analyzeDispatchervendor/zanphp/http-server/src/Dispatcher.phpget('controller_name');$action=$context->get('action_name');$args=$context->get('action_args');如果($args==null){$args=[];}if($controllerName==="/"&&is_callable($action)){yield$action(...array_values($args));}else{$controller=$this->getControllerClass($controllerName);if(!class_exists($controller)){//这些错误常见吧thrownewPageNotFoundException("controller:{$controller}notfound");}$controller=new$controller($request,$context);if(!is_callable([$controller,$action])){//这些错误常见吧thrownewPageNotFoundException("action:{$action}isnotcallableincontroller:".get_class($controller));}yield$controller->$action(...array_values($args));}}}
