ThinkPHP3.2.3源码分析一之系统流程
整体流程
红色的时钩子,蓝色为配置文件或函数定义文件
一 初始化
主要文件加载
\thinkphp_3.2.3\index.php
\thinkphp_3.2.3\ThinkPHP\ThinkPHP.php
\thinkphp_3.2.3\ThinkPHP\Library\Think\Think.class.php
\thinkphp_3.2.3\ThinkPHP\Library\Think\Storage.class.php
\thinkphp_3.2.3\ThinkPHP\Library\Think\Storage\Driver\File.class.php
简单流程
\index.php
// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为falseW
define('APP_DEBUG',True);
// 定义应用目录
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
\ThinkPHP\ThinkPHP.php
// 记录开始运行时间
$GLOBALS['_beginTime'] = microtime(TRUE);
// 记录内存初始使用
define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();
// 系统常量定义
defined('THINK_PATH') or define('THINK_PATH', __DIR__.'/');
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
defined('APP_STATUS') or define('APP_STATUS', ''); // 应用状态 加载对应的配置文件
defined('APP_DEBUG') or define('APP_DEBUG', false); // 是否调试模式
/// 用宏定义define定义大量的系统状态和系统路径
/// 判断操作系统,php版本,运行方式(cgi,sapi)来特殊处理常量定义
// 加载核心Think类
require CORE_PATH.'Think'.EXT;
// 应用初始化
Think\Think::start();
\ThinkPHP\Library\Think\Think.class.php
static public function start() {
// 注册AUTOLOAD方法
// 主要时去系统目录找类文件,或从应用配置文件注册的命名空间路径找
// array('Think','Org','Behavior','Com','Vendor')
// C('AUTOLOAD_NAMESPACE');
// 兼容处理不开命名空间的项目
spl_autoload_register('Think\Think::autoload');
// 设定系统错误和异常处理函数注册
// 脚本正常结束或者手动或异常终结处理
// 处理: 1.内存中的日志落地到文件 2.如果是异常终止,则输出错误
register_shutdown_function('Think\Think::fatalError');
//系统致命错误处理
//级别_USER_ERROR的写日志,页面输出提示
//低级别WARN NOTICE 等输出PageTrace,不影响脚本
set_error_handler('Think\Think::appError');
//系统抛出异常处理
//写日志,页面输出
set_exception_handler('Think\Think::appException');
// 初始化文件存储方式
Storage::connect(STORAGE_TYPE);
\ThinkPHP\Library\Think\Storage.class.php
\ThinkPHP\Library\Think\Storage\Driver\File.class.php (or Sae)
//此处文件缓存类,兼容本地缓存和sae的分布式文件环境。
class Storage {
/**
* 操作句柄
* @var string
* @access protected
*/
static protected $handler ;
/**
* 连接分布式文件系统
* @access public
* @param string $type 文件类型
* @param array $options 配置数组
* @return void
*/
static public function connect($type='File',$options=array()) {
$class = 'Think\\Storage\\Driver\\'.ucwords($type);
self::$handler = new $class($options);
}
static public function __callstatic($method,$args){
/ 魔术方法 调用文件缓存驱动类的方法
//调用缓存驱动的方法
if(method_exists(self::$handler, $method)){
return call_user_func_array(array(self::$handler,$method), $args);
}
}
}
二 应用模式的编译缓存和配置文件加载
主要文件加载
\thinkphp_3.2.3\ThinkPHP\Mode\common.php
\thinkphp_3.2.3\ThinkPHP\Common\functions.php
\thinkphp_3.2.3\ThinkPHP\Library\Think\Hook.class.php
简单流程
\ThinkPHP\Library\Think\Think.class.php
$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php';
// 部署模式并且已缓存的情况下,直接load编译缓存文件,此处的load实质是include文件
if(!APP_DEBUG && Storage::has($runtimefile)){
Storage::load($runtimefile);
}else{
// debug模式或无缓存文件时
// 1.清理可能存在的过期缓存文件
// 2. 加载一堆配置文件,语言包(这里的配置加载到内寸中,一般是存在全局函数作用域的静态变量,或者在类的静态成员变量中)
// 3. 部署模式下,缓存起应用编译文件(编译过程,去掉注释空白,替换预编译的字符串, 写入导入配置的代码段)
// 4 debug模式下,导入debug对应的系统配置,应用配置
if