thinkphp5 源码分析三 应用启动
来源:互联网 发布:绝对值用c语言怎么写 编辑:程序博客网 时间:2024/05/29 14:16
框架引导文件源代码 (/thinkphp/start.php)
// 执行应用App::run()->send();
1.应用启动(/thinkphp/library/think/App.php)
//初始化请求实例is_null($request) && $request = Request::instance();
2.添加APP命名空间(app => /application)
//添加app命名空间if (defined('APP_NAMESPACE')) { self::$namespace = APP_NAMESPACE;}Loader::addNamespace(self::$namespace, APP_PATH);
3.初始化应用
// 初始化应用 $config = self::init();
// 定位模块目录 $module = $module ? $module . DS : ''; // 加载初始化文件 if (is_file(APP_PATH . $module . 'init' . EXT)) { include APP_PATH . $module . 'init' . EXT; } elseif (is_file(RUNTIME_PATH . $module . 'init' . EXT)) { include RUNTIME_PATH . $module . 'init' . EXT; } else { $path = APP_PATH . $module; // 加载模块配置 $config = Config::load(CONF_PATH . $module . 'config' . CONF_EXT); // 读取数据库配置文件 $filename = CONF_PATH . $module . 'database' . CONF_EXT; Config::load($filename, 'database'); // 读取扩展配置文件 if (is_dir(CONF_PATH . $module . 'extra')) { $dir = CONF_PATH . $module . 'extra'; $files = scandir($dir); foreach ($files as $file) { if (strpos($file, CONF_EXT)) { $filename = $dir . DS . $file; Config::load($filename, pathinfo($file, PATHINFO_FILENAME)); } } } // 加载应用状态配置 if ($config['app_status']) { $config = Config::load(CONF_PATH . $module . $config['app_status'] . CONF_EXT); } // 加载行为扩展文件(中间件 权限控制可以配置加在这里) if (is_file(CONF_PATH . $module . 'tags' . EXT)) { Hook::import(include CONF_PATH . $module . 'tags' . EXT); } // 加载公共文件 if (is_file($path . 'common' . EXT)) { include $path . 'common' . EXT; } // 加载当前模块语言包 if ($module) { Lang::load($path . 'lang' . DS . Request::instance()->langset() . EXT); }
4.绑定模块、控制器
if (defined('BIND_MODULE')) { // 模块/控制器绑定 BIND_MODULE && Route::bind(BIND_MODULE);} elseif ($config['auto_bind_module']) { // 入口自动绑定 $name = pathinfo($request->baseFile(), PATHINFO_FILENAME); if ($name && 'index' != $name && is_dir(APP_PATH . $name)) { Route::bind($name); }}
5.加载语言
// 默认语言Lang::range($config['default_lang']);if ($config['lang_switch_on']) { // 开启多语言机制 检测当前语言 Lang::detect();}$request->langset(Lang::range());// 加载系统语言包Lang::load([ THINK_PATH . 'lang' . DS . $request->langset() . EXT, APP_PATH . 'lang' . DS . $request->langset() . EXT,]);
6.获取应用调度信息
// 获取应用调度信息$dispatch = self::$dispatch;if (empty($dispatch)) { // 进行URL路由检测 $dispatch = self::routeCheck($request, $config);}
7.记录路由和请求信息
// 记录路由和请求信息if (self::$debug) { Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info'); Log::record('[ HEADER ] ' . var_export($request->header(), true), 'info'); Log::record('[ PARAM ] ' . var_export($request->param(), true), 'info');}
8.构造页面输出 (查看thinkphp5 源码分析四 数据构造)
// 请求缓存检查 $request->cache($config['request_cache'], $config['request_cache_expire'], $config['request_cache_except']); // 查看thinkphp5 源码分析四 数据构造 $data = self::exec($dispatch, $config);
9.清空Loader类的实例化
// 清空Loader类的实例化Loader::clearInstance();
10.输出数据
// 输出数据到客户端if ($data instanceof Response) { // 是否是 response 的实例 $response = $data;} elseif (!is_null($data)) { // 默认自动识别响应输出类型 $isAjax = $request->isAjax(); $type = $isAjax ? Config::get('default_ajax_return') : Config::get('default_return_type'); $response = Response::create($data, $type);} else { $response = Response::create();}
11.发送数据到客户端
// 处理输出数据$data = $this->getContent();// Trace调试注入if (Env::get('app_trace', Config::get('app_trace'))) { Debug::inject($this, $data);}if (200 == $this->code) { $cache = Request::instance()->getCache(); if ($cache) { $this->header['Cache-Control'] = 'max-age=' . $cache[1] . ',must-revalidate'; $this->header['Last-Modified'] = gmdate('D, d M Y H:i:s') . ' GMT'; $this->header['Expires'] = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT'; Cache::set($cache[0], [$data, $this->header], $cache[1]); }}if (!headers_sent() && !empty($this->header)) { // 发送状态码 http_response_code($this->code); // 发送头部信息 foreach ($this->header as $name => $val) { if (is_null($val)) { header($name); } else { header($name . ':' . $val); } }}//输出数据echo $data;if (function_exists('fastcgi_finish_request')) { // 提高页面响应 fastcgi_finish_request();}// 监听response_endHook::listen('response_end', $this);// 清空当次请求有效的数据if (!($this instanceof RedirectResponse)) { //清空SESSION Session::flush();}
阅读全文
0 0
- thinkphp5 源码分析三 应用启动
- mongodb源码分析(三)mongo的启动
- linux 3.6 启动源码分析(三) setup_arch
- linux 3.6 启动源码分析(三) setup_arch
- kubelet启动pod源码分析(三)
- thinkphp5 源码分析一 入口文件
- thinkphp5 源码分析二 框架引导
- spring源码分析-应用启动过程
- Activity启动流程源码分析之startActivity启动(三)
- 【OpenStack源码分析之三】Nova-Compute启动流程分析
- Android 8.0系统源码分析--应用进程启动过程分析
- FBReader源码分析(三)---启动到渲染流程
- OpenStack Swift源码分析(三)proxy服务启动
- 【Java】【Flume】Flume-NG启动过程源码分析(三)
- Solr4.7源码分析-启动篇(三)
- Docker源码分析(三):Docker Daemon的启动
- docker1.9源码分析(三):daemon启动过程
- 【Java】【Flume】Flume-NG启动过程源码分析(三)
- The xxx collides with a package/type
- 第二章组织影响和项目生命周期
- STL学习笔记-sort
- 游戏开发中的人工智能(三):移动模式
- HEX文件格式详解
- thinkphp5 源码分析三 应用启动
- php表单
- 修改consul的启动端口
- loadlibrary函数失败,错误码:126
- android 改变光标的颜色及样式
- Http四种常见的 POST 提交数据方式
- Android仿外卖购物车的实现
- Java_基础—Map集合概述和特点
- HashMap遍历使用entrySet的效率真的比keyset高?