当前位置: 首页 > 后端技术 > PHP

thinkphp源码分析(一)—opendoor

时间:2023-03-29 15:39:14 PHP

源码分析—opendoorthinkphp生命周期1.入口文件用户发起的请求都会经过应用入口文件,通常==public/index.php==file。当然,您也可以更改或添加新的条目文件。通常入口文件的代码比较简单。一个常见的入口文件代码如下://应用入口文件//定义项目路径define('APP_PATH',__DIR__.'/../application/');//加载框架引导文件require__DIR__.'/../thinkphp/start.php';通用入口文件主要定义了一些常量。支持的常量请参考后续内容或附录。一般来说,我们不建议在应用入口文件中加入过多的代码,尤其是与业务逻辑相关的代码。2.引导文件接下来是执行框架的引导文件,start.php文件是系统默认的引导文件。在boot文件中,会依次执行以下操作:1.加载系统常量定义;2.加载环境变量定义文件;3、注册自动加载机制;4.注册错误和异常处理机制;5.加载自定义配置文件;6.执行申请;start.php引导文件会首先调用base.php基本引导文件。对于一些特殊的需求,可以直接在入口文件中引入基本引导文件。如果您的应用程序入口文件中的默认引导程序文件发生更改,则上述执行流程可能会相应更改。3.注册自动加载系统会调用Loader::register()方法注册自动加载。这一步完成后,会自动加载所有符合规范的类库(包括Composer依赖加载的第三方类库)。系统自动加载由以下主要部分组成:1、注册系统自动加载方法\think\Loader::autoload2。注册系统命名空间的定义3.加载类库映射文件(如果存在)4.如果有Composer安装,则注册**Composer**自动加载5.注册extend扩展目录自动加载检测顺序一个类库是:1.是否定义了类库映射;2、PSR-4自动加载检测;3、PSR-0自动加载检测;4、可见定义类库映射的方式效率最高。4.注册错误和异常机制执行Error::register()注册错误和异常处理机制。它由三部分组成:1.应用关闭方法:think\Error::appShutdown2。错误处理方法:think\Error::appError3。异常处理方法:think\Error::appException注册应用关闭方法是为了拦截一些系统错误。在整个应用请求的生命周期中,如果抛出异常或严重错误,应用将提前结束,并输出异常和错误信息作为响应。5.应用程序初始化执行应用程序的第一步是对应用程序进行初始化,包括:1.加载应用程序(公共)配置;2.加载扩展配置文件(由extra_config_list定义);3.加载应用状态配置;4.加载Alias定义;5.加载行为定义;6.加载公共(函数)文件;7、注册应用命名空间;8.加载扩展功能文件(由extra_file_list定义);9.设置默认时区;10.加载系统语言包;6.URL访问检测应用初始化完成后,会进行URL访问检测,包括PATH_INFO检测和URL后缀检测。5.0的url访问必须是PATH_INFO模式(包括兼容模式)的url地址,例如:http://serverName/index.php/index/index/hello/val/value所以,如果你的环境只能支持normalmode对于URL参数访问,必须使用http://serverName/index.php?s=/index/index/hello&val=value。如果在命令行下访问入口文件,使用$phpindex.phpindex/index/hello/val/value...获取到正常的==$_SERVER['PATH_INFO']==参数后才能继续。7.路由检测如果启用url_route_on参数,则首先进行URL路由检测。一旦检测到匹配的路由,路由地址将根据定义注册到相应的URL调度器。5.0的路由地址支持以下几种方式:1、路由到模块/控制器/操作;2、路由到外部重定向地址;3.路由到controller方法;4.路由到闭包函数;5.路由到类方法;6、路由地址可能会受到域名绑定的影响。如果路由关闭或路由检测无效,则进行默认的模块/控制器/操作分析识别。如果在应用程序初始化期间指定了应用程序调度方法,则路由检测是可选的。您可以使用thinkApp::dispatch()进行应用程序调度,例如:App::dispatch(['type'=>'module','module'=>'index/index']);8、分发请求完成后通过URL检测和路由检测,路由器会将请求分发到对应的路由地址,这也是应用请求生命周期中最重要的环节。这一步完成了应用的业务逻辑和数据返回。推荐使用return返回数据,而不是echo输出。如非必要,请不要使用exit或die中断执行。直接echo输出的数据将无法自动转换为response输出的方便。以下是系统支持的分发请求机制,可以根据情况选择:模块/控制器/操作这是默认的分发请求机制。系统会根据URL或路由地址判断当前请求的模块、控制器和操作名称,并自动调用相应的访问控制器类,执行操作对应的方法。在这种机制下,会先判断当前模块,然后进行模块的初始化操作(类似于应用程序的初始化操作)。模块的配置参数会覆盖应用尚未生效的配置参数。支持模块映射、URL参数与方法的绑定以及操作与类的绑定等功能。controller方法和前面的方法类似,只是不需要判断module、controller和operation,直接将请求派发给指定的controller类的方法,所以没有module的初始化操作。外部重定向可以直接将请求派发到外部重定向地址,支持指定重定向码。默认是301重定向。闭包函数闭包函数可以在定义路由地址的时候直接使用,完成一些比较简单的逻辑操作和输出。类的方法除了上述方法外,还支持向类分发请求的方法,包括:静态方法:'blog/:id'=>'\org\util\Blog::r??ead'方法类:'blog/:id'=>'\app\index\controller\Blog@read'9。响应输出控制器的所有操作方法都是返回而不是直接输出。系统会调用Response::send方法将最终应用返回的数据输出到页面或客户端,并自动转换为default_return_type参数配置的格式。因此应用程序执行的数据输出只需要返回一个正常的PHP数据即可。10.应用结束实际上,应用数据响应输出后,应用并没有真正结束,系统会在应用输出或中断后保存并写入日志。系统日志包括用户调试输出和系统自动生成的日志,会在应用结束时写入。日志的写操作受日志初始化的影响。