thinkPHP5.0 프레임워크 애플리케이션 요청 라이프사이클 분석

不言
풀어 주다: 2023-03-25 13:08:01
원래의
1516명이 탐색했습니다.

이 글은 thinkPHP5.0 프레임워크 애플리케이션 요청 라이프사이클을 주로 소개하고, thinkPHP5.0 프레임워크 애플리케이션 요청 라이프사이클과 관련된 다양한 실행 프로세스를 자세히 분석합니다. . 0 프레임워크 애플리케이션 요청 수명 주기. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

이 기사에서는 개발자가 전체 실행 프로세스를 이해할 수 있도록 ThinkPHP5.0의 애플리케이션 요청 라이프사이클에 대한 일반적인 소개를 제공합니다.

1. 항목 파일

사용자가 시작한 요청은 일반적으로 public/index.php 파일인 애플리케이션의 항목 파일을 통과합니다. 물론 새 항목 파일을 변경하거나 추가할 수도 있습니다.

보통 엔트리 파일의 코드는 비교적 간단합니다. 일반적인 엔트리 파일 코드는 다음과 같습니다.

// 应用入口文件
// 定义项目路径
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
로그인 후 복사

일반 엔트리 파일에서는 주로 일부 상수를 정의했으며, 지원되는 상수는 다음 내용이나 부록을 참조하세요. .

일반적으로 애플리케이션 항목 파일에 너무 많은 코드, 특히 비즈니스 로직과 관련된 코드를 추가하지 않는 것이 좋습니다.

2. 부팅 파일

다음 단계는 실행 프레임워크의 부팅 파일입니다. start.php 파일은 시스템의 기본 부팅 파일입니다. 부팅 파일에서는 다음 작업이 순서대로 수행됩니다.

① 시스템 상수 정의 로드

② 환경 변수 정의 파일 로드 ③ 자동 로딩 메커니즘 등록
4 오류 및 예외 처리 메커니즘 등록; 기존 구성 파일 ;
⑥ 애플리케이션 실행;


애플리케이션 항목 파일에서 기본 부팅 파일이 변경되면 위의 실행 프로세스가 이에 따라 변경될 수 있습니다.

3. 자동 로딩 등록

시스템은 Loader::register() 메서드를 호출하여 자동 로딩을 등록합니다. 이 단계가 완료되면 사양을 준수하는 모든 클래스 라이브러리(타사 클래스 포함) Composer가 로딩에 의존하는 라이브러리)는 자동으로 로드됩니다.

시스템의 자동 로딩은 두 부분으로 구성됩니다:

① 시스템의 자동 로딩 방법 등록 thinkLoader::autoload

② 시스템 네임스페이스 정의 등록

③ 클래스 라이브러리 매핑 파일 로드(존재하는 경우) ④ 존재하는 경우 Composer 설치 후 자동 로딩을 위해 Composer 등록
⑤ 확장 확장 디렉토리 등록


클래스 라이브러리의 자동 로딩 감지 순서는 다음과 같습니다.

① 클래스 라이브러리 매핑 정의 여부

② PSR-4 자동 로딩 감지; ;

3 PSR-0 자동 로딩 로딩 감지

클래스 라이브러리 매핑을 정의하는 방법이 가장 효율적이라는 것을 알 수 있습니다.

4. 오류 및 예외 메커니즘 등록

Error::register()를 실행하여 오류 및 예외 처리 메커니즘을 등록합니다.

는 세 부분으로 구성됩니다.

① 애플리케이션 종료 방법: thinkError::appShutdown<p> ② 오류 처리 방법: thinkError::appError</p> ③ 예외 처리 방법: thinkError::appException

thinkError::appShutdown<br/>② 错误处理方法:thinkError::appError<br/>③ 异常处理方法:thinkError::appException

注册应用关闭方法是为了便于拦截一些系统错误。

在整个应用请求的生命周期过程中,如果抛出了异常或者严重错误,均会导致应用提前结束,并响应输出异常和错误信息。

5、应用初始化

执行应用的第一步操作就是对应用进行初始化,包括:

加载应用(公共)配置;
加载应用状态配置;
加载别名定义;
加载行为定义;
加载公共(函数)文件;
加载扩展配置文件(由extra_config_list定义);
加载扩展函数文件(由extra_file_list定义);
设置默认时区;
加载系统语言包;

6、URL访问检测

应用初始化完成后,就会进行URL的访问检测,包括PATH_INFO检测和URL后缀检测。

5.0的URL访问必须是PATH_INFO方式(包括兼容方式)的URL地址,例如:

http://serverName/index.php/index/index/hello/val/value

所以,如果你的环境只能支持普通方式的URL参数访问,那么必须使用

http://serverName/index.php?s=/index/index/hello&val=value

如果是命令行下面访问入口文件的话,则通过

$php index.php index/index/hello/val/value...

获取到正常的$_SERVER[&#39;PATH_INFO&#39;]애플리케이션 종료 방법을 등록하는 것은 일부 시스템 오류를 쉽게 차단하기 위한 것입니다.

전체 애플리케이션 요청 수명 주기 동안 예외 또는 심각한 오류가 발생하면 애플리케이션이 조기 종료되고 그에 대한 응답으로 예외 및 오류 정보가 출력됩니다.

5. 애플리케이션 초기화

다음을 포함하여 애플리케이션을 초기화합니다.

애플리케이션 상태 구성 로드

로드 동작 정의; ;

공용(함수) 파일 로드;

확장 구성 파일 로드(extra_config_list로 정의);확장 함수 파일 로드(extra_file_list로 정의);
기본 시간대 설정;
시스템 언어 팩 로드;

6. URL 액세스 감지

애플리케이션 초기화가 완료되면 PATH_INFO 감지 및 URL 접미사 감지를 포함한 URL 액세스 감지가 수행됩니다.

🎜5.0 URL 액세스는 PATH_INFO 모드(호환 모드 포함)의 URL 주소여야 합니다. 예: 🎜🎜http://serverName/index.php/index/index/hello / val/value🎜🎜🎜따라서 귀하의 환경이 일반 URL 매개변수 액세스만 지원할 수 있는 경우 🎜🎜http://serverName/index.php?s= /index를 사용해야 합니다. /index/hello&val=value🎜🎜🎜명령줄에서 항목 파일에 액세스하는 경우 🎜🎜$php index.php index/index/hello/val/value...🎜 🎜Only를 사용하세요. 일반 $_SERVER['PATH_INFO'] 매개변수를 얻은 후 계속하세요. 🎜🎜🎜7. 경로 감지🎜🎜🎜url_route_on 매개변수가 활성화되면 URL 경로 감지가 먼저 수행됩니다. 🎜🎜일치하는 경로가 감지되면 정의된 경로 주소에 따라 해당 URL 일정이 등록됩니다. 🎜🎜5.0의 라우팅 주소는 다음 방법을 지원합니다: 🎜🎜🎜모듈/컨트롤러/작업으로 라우팅; 🎜외부 리디렉션 주소로 라우팅; 🎜클로저 함수로 라우팅;🎜🎜 🎜라우팅 주소는 도메인 이름 바인딩에 의해 영향을 받을 수 있습니다. 🎜🎜라우팅이 꺼져 있거나 라우팅 감지가 유효하지 않은 경우 기본 모듈/컨트롤러/작업이 분석되고 식별됩니다. 🎜

如果在应用初始化的时候指定了应用调度方式,那么路由检测是可选的。

可以使用 \think\App::dispatch() 进行应用调度。

8、分发请求

在完成了URL检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要的一个环节。

在这一步骤中,完成应用的业务逻辑及数据返回。

建议统一使用return返回数据,而不是echo输出,如非必要,请不要执行exit中断。

直接echo输出的数据将无法进行自动转换响应输出的便利。

下面是系统支持的分发请求机制,可以根据情况选择:

模块/控制器/操作

这是默认的分发请求机制,系统会根据URL或者路由地址来判断当前请求的模块、控制器和操作名,并自动调用相应的访问控制器类,执行操作对应的方法。

该机制下面,首先会判断当前模块,并进行模块的初始化操作(和应用的初始化操作类似),模块的配置参数会覆盖应用的尚未生效的配置参数。

支持模块映射、URL参数绑定到方法,以及操作绑定到类等一些功能。

控制器方法

和前一种方式类似,只是无需判断模块、控制器和操作,直接分发请求到一个指定的控制器类的方法,因此没有进行模块的初始化操作。

外部重定向

可以直接分发请求到一个外部的重定向地址,支持指定重定向代码,默认为301重定向。

闭包函数

路由地址定义的时候可以直接采用闭包函数,完成一些相对简单的逻辑操作和输出。

类的方法

除了以上方式外,还支持分发请求到类的方法,包括:
静态方法:

&#39;blog/:id&#39;=>&#39;\org\util\Blog::read&#39;
로그인 후 복사


类的方法:

&#39;blog/:id&#39;=>&#39;\app\index\controller\Blog@read&#39;
로그인 후 복사

9、响应输出

控制器的所有操作方法都是return返回而不是直接输出,系统会调用Response::send方法将最终的应用返回的数据输出到页面或者客户端,并自动转换成default_return_type参数配置的格式。所以,应用执行的数据输出只需要返回一个正常的PHP数据即可。

10、应用结束

事实上,在应用的数据响应输出之后,应用并没真正的结束,系统会在应用输出或者中断后进行日志保存写入操作。

系统的日志包括用户调试输出的和系统自动生成的日志,统一会在应用结束的时候进行写入操作。

而日志的写入操作受日志初始化的影响。

相关推荐:

ThinkPHP框架中使用Memcached缓存数据的方法

thinkphp框架里用linux的crontab写php的定时脚本

위 내용은 thinkPHP5.0 프레임워크 애플리케이션 요청 라이프사이클 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!