build_runtime()在TP里的注释是“生成核心编译缓存”,位于框架的Common目录下的runtime.php文件中。这个文件包含了四个函数:
- build_runtime
- mkdirs 批量创建目录。
- build_app_dir 创建项目目录结构:
项目目录下的Common、Conf、Lang、Lib、Runtime、Tpl这些目录 在Conf下写一配置文件(config.php) 在Lib/Action下写一测试Action(IndexAction.class.php):刚安装ThinkPHP后运行出的那个Hello World。
- check_runtime 检查项目下的缓存目录(Runtime) ,不存在将自动创建。(备用轮胎)
那么这个文件里到底包含了哪些东西呢?接下来我打开了一个存在的~runtime.php文件查看一下里面的结构:
- 系统定义文件:define一大堆东西,IS_WIN、_PHP_FILE_、LIB_DIR、CONFIG_PATH等
- Tink公共函数库:牛逼点的如C、D、M、U等快捷函数,常用的如dump、import等
- 系统基类Think
- 系统异常基类ThinkException
- 日志处理类Log
- 应用程序类App
- 控制器基类Action(抽象)
- 视图输出类View
- 导入别名定义:Model、Session等类的路径
哦,原来~runtime.php就相当于框架的“配置文件”,放的都是框架运行时所必须的一些内容。接下来再看一下build_runtime的代码,就相对来说好理解多了:
1 | // 生成核心编译缓存 |
说一下这个函数的流程吧:
导入常量定义文件(defines.php)和路径定义文件(paths.php)。为什么先导入这两个,因为这两个是“系统定义文件”,接下来所用到的CONFIG_PATH等都来自于它们。这里在加载paths.php的时候有一个PATH_DEFINE_FILE常量的判断,搜索了整个框架也只有在这个函数里用到。难道在入口文件里可以自己定义paths文件的路径,手册里也没有相关介绍。
把系统函数functions.php、兼容函数compat.php(如果PHP小于5.2.0的话)、核心基类Think.class.php这几个文件的路径写到$runtime数组里。
把核心编译文件core.php的路径放到$list变量 里。同$runtime合并,并全部载入。
检查项目目录和缓存目录。
生成~runtime.php缓存文件。这里也有一个常量NO_CACHE_RUNTIME,这个常量也是放在入口文件里定义,如果定义了,就不会生成缓存文件。
生成缓存文件用到了一个compile()的函数,位于系统函数文件里:
1 | function compile($filename,$runtime=false) { |
这个函数里也没有多大的玄机,就是读取文件内容,做一些处理:替换预编译指令、去掉开头的结尾的PHP标识。
处理完成后返回到build_runtime()的最后两步:
判断是否去掉空格:STRIP_RUNTIME_SPACE;
file_put_contents()生成~runtime.php。
到此为止。我们的项目的编译就进行了一半:框架系统文件的编译就完成了。
接下来就要进行项目文件的编译,以及启动项目了——App::run(),该你上台了。