Stay hungry, Stay foolish

0%

TP笔记2:ThinkPHP公共文件

先从THINK_PATH.’/ThinkPHP.php’这个公共文件开始吧。预览一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//记录开始运行时间
$GLOBALS['_beginTime'] = microtime(TRUE);
if(!defined('APP_PATH')) define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']));
if(!defined('RUNTIME_PATH')) define('RUNTIME_PATH',APP_PATH.'/Runtime/');
if(defined('RUNTIME_ALLINONE') && is_file(RUNTIME_PATH.'~allinone.php')) {
// ALLINONE 模式直接载入allinone缓存
$result = require RUNTIME_PATH.'~allinone.php';
C($result);
// 自动设置为运行模式
define('RUNTIME_MODEL',true);
}else{
if(version_compare(PHP_VERSION,'5.0.0','<')) die('require PHP > 5.0 !');
// ThinkPHP系统目录定义
if(!defined('THINK_PATH')) define('THINK_PATH', dirname(__FILE__));
if(!defined('APP_NAME')) define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME'])));
if(is_file(RUNTIME_PATH.'~runtime.php')) {
// 加载框架核心编译缓存
require RUNTIME_PATH.'~runtime.php';
}else{
// 加载编译函数文件
require THINK_PATH."/Common/runtime.php";
// 生成核心编译~runtime缓存
build_runtime();
}
}
// 记录加载文件时间
$GLOBALS['_loadTime'] = microtime(TRUE);

运行时间的处理

在代码的开始和结束有两个全局变量的定义,这个用来做什么呢?搜索一下就可以发现答案,在TP的视图类View里有个showTime的方法,其中有计算运行时间的,用到这两个全局变量:

1
2
3
4
5
6
if(C('SHOW_ADV_TIME')) {
// 显示详细运行时间
$_load_time = number_format(($GLOBALS['_loadTime'] -$GLOBALS['_beginTime'] ), 3);
$_init_time = number_format(($GLOBALS['_initTime'] -$GLOBALS['_loadTime'] ), 3);
……
}

而对于运行时间的显示控制在output方法里:

1
2
3
4
5
6
7
8
if(C('SHOW_RUN_TIME')){
$runtime = '<div id="think_run_time" class="think_run_time">'.$this->showTime().'</div>';
if(strpos($content,'{__RUNTIME__}'))
$content = str_replace('{__RUNTIME__}',$runtime,$content);
else
$content .= $runtime;
}
echo $content;

SHOW_RUN_TIME等配置在convention.php里,默认为false(可以在项目配置文件里添加,或项目控制器里用C动态修改)。

常量的定义

接下来是两个常量的判断:

APP_PATH这前我们在项目的统一入口文件里定义过了,从这里可以看到,其实这个我们是可以不定义的,默认是dirname($_SERVER[‘SCRIPT_FILENAME’])。

RUNTIME_PATH 默认是APP_PATH下面的Runtime目录。建议不要去修改,牵扯到的文件不少。

allinone模式

关于allinone模式,2.1完全开发手册有详细的介绍:

ALLINONE模式指的是ThinkPHP可以把核心编译缓存和项目编译缓存合并到一个文件里面去,并且过滤掉一些运行模式不需要执行的代码,并且对于用户的自定义常量全部统一定义,不再进行额外的检测。ALLINONE模式一般是在开发调试完成之后,希望进一步提高系统的整体性能的时候开启。开启ALLINONE模式只需要在入口文件中添加定义:

1
define('RUNTIME_ALLINONE'true);  // 开启ALLINONE运行模式

这里会判断是否开启以及缓存文件是否存在:

  1. 加载缓存文件~allinone.php

  2. C($result)

  3. define(‘RUNTIME_MODEL’,true) 设置为运行模式

没有开启ALLINONE或者没有缓存文件?

不管你开不开启,第一次运行项目的时候还是要走else后的分支的。

  1. 比较PHP版本,如果系统版本小于5.0.0的话,直接就die了。

  2. 判断两个常量的定义THINK_PATH和APP_NAME。THINK_PATH个人觉得没什么必要,除非在入口文件里不定义,直接用绝对路径导入ThinkPHP.php文件。算是防患于万一。

  3. 判断框架核心编译缓存文件~runtime.php是否存在,如果存在,就直接加载。否则加载runtime.php文件,执行它的函数build_runtime()。

看来玄机都在这个build_runtime()里了。欲知后事,下回分解。

据说打赏我的人,代码没有BUG