项目初始化Init

项目预编译

URL剖析Dispather

php209ThinkPHP履行流程 Node.js

获取模块和操作名

项目实行exec

实行掌握器的操作

调用模块获取数据

输出视图

入口文件的定义

<?php

define('THINK_PATH', '../ThinkPHP');

//定义项目名称,如果不定义,默认为入口文件名称

define('APP_NAME', 'web');

define('APP_PATH', './web');

//加载ThinkPHP框架公共入口文件

require(THINK_PATH.'/ThinkPHP.php');

//实例化一个网站运用实例

$App = new App();

//实行运用程序

$App->run();

?>

ThinkPHP.php里面的干了些啥

记录开始实行韶光 $GLOBALS[‘_beginTime’](19行)

检测 THINK_PATH、 APP_NAME、 APP_PATH、 RUNTIME_PATH 定义,如果没有则创建(20-26行)

//不知道你创造没有,以index.php这基准,通过APP_PATH,可以组装出任意路径

检讨开启ALLINONE模式 (22行)

把核心编译缓存和项目编译缓存合并到一个文件里面去,并且过滤掉一些运行模式不须要实行的代码,并且对付用户的自定义常量全部统一定义,不再进行额外的检测。

检讨是否有核心缓存~runtime.php(33行)

if(file_exists(RUNTIME_PATH.'~runtime.php')) {

// 加载框架核心缓存文件

require RUNTIME_PATH.'~runtime.php';

}else{

//1.加载define.php和functions.php

//2.如果项目编译缓存目录不存在,则自动创建项目目录构造

//3.加载系统核心类库(包括ThinkPHP\LIB\THINK下级各子目录下的 Base、App、Action、Model、View、ThinkException、Log)

//4.如果 PHP 版本低于 5.2.0 则加载兼容函数库

//天生核心编译~runtime缓存

}

记录加载文件韶光 $GLOBALS['_loadTime'];

进入ThinkPHP\Lib\Think\Core\App

入口文件中调用的$App->run()

public function run() {

$this->init();

$this->exec();

return ;

}

$App->run()返回的时候,对一个要求的处理就算完成了

App.class.php的init函数(1)

1.设定缺点和非常处理机制(39-40行)

(set_error_handler和set_exception_handler)

2.项目预编译并载入(44-52行)

// 在支配模式下会自动在第一次实行的时候编译项目

if(defined('RUNTIME_MODEL')){

// 运行模式无需载入项目编译缓存

}elseif(is_file(RUNTIME_PATH.'~app.php') && (!is_file(CONFIG_PATH.'config.php') || filemtime(RUNTIME_PATH.'~app.php')>filemtime(CONFIG_PATH.'config.php'))) {

// 直接读取编译后的项目文件

C(include RUNTIME_PATH.'~app.php');

}else{

// 预编译项目

App::build();

}

3.设置时区支持(59-60行)

4.许可注册AUTOLOAD方法、 session初始化(62-66行)

5. URL剖析和调度(71行)

实行Dispatcher类的静态方法 dispatch() 。
这段代码很不错。

6.加载项目分组公共文件(82-90行)

if(!defined('GROUP_NAME')) define('GROUP_NAME', App::getGroup());

7.取得模块和操作名称(92-93行)

if(!defined('MODULE_NAME')) define('MODULE_NAME', App::getModule());

if(!defined('ACTION_NAME')) define('ACTION_NAME', App::getAction());

8.加载模块配置文件(95-97行)

9.系统检讨(99-104行)

App::checkLanguage(); //措辞检讨

App::checkTemplate(); //模板检讨

if(C('HTML_CACHE_ON')) // 开启静态缓存

10.项目初始化标签

初始化完成,init返回

App.class.php的getGroup

App.class.php 228行

1. 检讨 VAR_MODULE 变量(231行)

(包括 GET 和 POST), 如果未定义,则获取默认分组名

分组名称解析完毕,也便是http://server/project/index.php/Model/Action/的project部分,回到init

App.class.php 186行

1. 检讨 VAR_MODULE 变量(189行)

(包括 GET 和 POST), 如果未定义,则获取默认模块名

2. 判断URL地址是否区分大小写

不区分,小写模块名

智能识别办法 index.php/user_type/index/ 识别到 UserTypeAction 模块

模块名称解析完毕,也便是http://server/project/index.php/Model/Action/的Model部分,回到init

App.class.php 209行

1. 检讨 VAR_MODULE 变量(211行)

(包括 GET 和 POST), 如果未定义,则获取默认模块名

操作名称解析完毕,也便是http://server/project/index.php/Model/Action/的Action部分,回到init

App.class.php的exec函数(1)

1.创建Action掌握器实例(379行)

A()函数

2.获取当前操作名(400行)

$action = ACTION_NAME;

3.实行操作(401-418行)

// 实行操作链 最多只能有一个输出

1.实行前置操作 '_before_'.$action

2.实行当前操作 $action

3.实行后缀操作 '_after_'.$action

exec实行完毕,一个要求处理完成了

小结

Thinkphp一次网页要求,便是实例化一个网站运用实例 ,并实行运用程序的过程。
实行过程$App->run()分为init和exec两部分。

这中间还省略了一部分剖析,比如RBAC,比如Model干系的代码,VIEW操作解析等,将不才次分享中谈论。