thinkphp5.0框架运行机制分享小结
2024-10-19 13:20:24
1 访问index.php 入口文件,定义应用目录,加载框架引导文件
<?php
// [ 应用入口文件 ]
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
2 加载base基础文件,定义目录常量环境常量,加载loader类,注册自动加载,注册错误和异常处理机制,加载惯例配置文件
2.1 注册自动加载机制
public static function register($autoload = '')
{
// 注册系统自动加载
spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
// 注册命名空间定义
self::addNamespace([
'think' => LIB_PATH . 'think' . DS,
'behavior' => LIB_PATH . 'behavior' . DS,
'traits' => LIB_PATH . 'traits' . DS,
]);
// 加载类库映射文件
if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
} // Composer自动加载支持
if (is_dir(VENDOR_PATH . 'composer')) {
self::registerComposerLoader();
} // 自动加载extend目录
self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);
}
备注:spl_autoload_register
2.2 注册错误和异常处理机制
/**
* 注册异常处理
* @return void
*/
public static function register()
{
error_reporting(E_ALL); // 设置函数允许错误报告的等级 error_reporting 0 关闭 E_ERROR | E_WARNING | E_PARSE 分别为错误 警告 解析错误 E_ALL 报告所有错误
set_error_handler([__CLASS__, 'appError']); //设置用户自定义的错误处理函数
set_exception_handler([__CLASS__, 'appException']); //设置用户自定义的异常处理函数
register_shutdown_function([__CLASS__, 'appShutdown']); //注册一个会在php中止时执行的函数
}
2.3 加载惯例配置文件
将convention文件中的的配置保存在已数组的形式$config常量中
// 加载惯例配置文件
\think\Config::set(include THINK_PATH . 'convention' . EXT);
2.4执行应用
// 执行应用
App::run()->send();
/**
* 发送数据到客户端
* @access public
* @return mixed
* @throws \InvalidArgumentException
*/
public function send()
{
// 监听response_send
Hook::listen('response_send', $this); // 处理输出数据
$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::tag($cache[2])->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_end
Hook::listen('response_end', $this); // 清空当次请求有效的数据
if (!($this instanceof RedirectResponse)) {
Session::flush();
}
}
最新文章
- sql server 创建只读帐号
- Linux常用指令---grep(搜索过滤)
- C语言绘制余弦函数图象
- Java的线程模型
- ACE的 日志
- AfxMessageBox(";这里为提示框的内容";);程序弹出一个提示窗口,可以做调试提示信息
- InputStream中read()与read(byte[] b)(转)
- (三)ajax请求不同源之jsonp跨域
- SKU : Stock Keeping Unit
- JAVA实训第二次作业
- 1111. Online Map (30)
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
- multipartUpload上传图片到阿里云
- Tomcat之Windows环境下配置多个服务器
- 2018.07.22 bzoj3613: [Heoi2014]南园满地堆轻絮(逆序对结论题)
- C# 数据上传(自用笔记)
- N 秒打开一个新窗口
- phpstorm failed to create jvm:error code -6 解决办法 解决方法
- mysql转ElasticSearch的分析 及JAVA API 初探
- github 上中国互联网公司的开源项目