php源码哪些文件是主程序,ThinkPHP源码分析之核心类文件的加载
研究了下TP的加载机制,以下是我的一些总结:
1.首先由应用入口文件index.php引入TP入口文件ThinkPHP.php
2.ThinkPHP.php里主要是定义一些系统常量,URL模式定义,系统信息等,然后加载核心类文件Think.class.php,这个类里定义了start方法,这个方法是系统加载的核心,ThinkPHP的核心函数和类文件加载,配置文件加载,字段映射加载,行为扩展加载,运行时日志等的生成,模块目录的生成等都在这个方法里有调用
3.start方法一开始定义注册了自动加载方法,错误和异常处理的方法// 注册AUTOLOAD方法
spl_autoload_register('Think\Think::autoload');
// 设定错误和异常处理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
然后是初始化文件的存储方式
// 初始化文件存储方式Storage::connect(STORAGE_TYPE);这里TP里定义了本地存储和sae环境下的存储类
接着是核心类文件等的加载,TP里根据APP_MODEL判断php的应用模式,根据不同的模式加载对应的核心文件,默认是common模式,如果是api或sae模式,则加载Library/Model下对应的核心文件,比如common.php,这里定义了系统要加载的核心配置文件,核心函数,核心类,map映射,行为扩展方法等。也就是说TP通过在对应的模式文件下提前定义好要加载的核心配置文件等的路径信息,然后循环进行加载。// 读取应用模式
$mode = include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';//这里判断应用模式,$model是一个数组,定义了配置文件,核心类文件等的路径
// 加载核心文件
foreach ($mode['core'] as $file){
if(is_file($file)) {
include $file;
if(!APP_DEBUG) $content .= compile($file);//这里表示运行模式下将引入的核心类文件内容保存到~runtime.php文件里,这样后面直接引入~runtime.php文件
}
}
// 加载应用模式配置文件
foreach ($mode['config'] as $key=>$file){
is_numeric($key)?C(load_config($file)):C($key,load_config($file));
}
// 读取当前应用模式对应的配置文件
if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT))
C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT));
// 加载模式别名定义
if(isset($mode['alias'])){
self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);
}
// 加载应用别名定义文件
if(is_file(CONF_PATH.'alias.php'))
self::addMap(include CONF_PATH.'alias.php');
// 加载模式行为定义
if(isset($mode['tags'])) {
Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);
}
// 加载应用行为定义
if(is_file(CONF_PATH.'tags.php'))
// 允许应用增加开发模式配置定义
Hook::import(include CONF_PATH.'tags.php');
4.调试模式下和非调试模式下的加载
这里非调试模式下,在Runtime目录下会有一个~runtime.php的文件,打开会发现这个是经过编译后的源码文件,里面包含核心配置文件,核心类,map映射等的源码。也就是说在运行模式下,TP会把加载的核心配置文件,核心类等的内容保存到这个文件里,这样每次直接调用~runtime.php文件相当于把核心类等直接引入过来,加快了程序运行的速度。
php源码哪些文件是主程序,ThinkPHP源码分析之核心类文件的加载相关推荐
- 分析ThinkPHP5的源码(1) : 类的自动加载
前文 Composer 下载ThinkPHP5.1的源码,每个框架它都必须都有一个"类的自动加载"机制 ,我们都知道PHP引入文件是需要require . include 才能使用 ...
- flash AS3 Loader加载外部文件类 及队列加载方法
从2011年开始使用这段代码为了应对各种加载修修改改了这么多年,很基础的功能,没啥特别的,重点在于加载子swf获取它的类,还有就是卸载子swf时要清理内存,否则内存占用会节节窜高,内存溢出,所以加载新 ...
- Spring Ioc 源码分析(一)--Spring Ioc容器的加载
1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:Intellj idea debug 模式 ...
- QML 地图修改插件源码(一)解决Map使用Open Street Map(OSM)无法加载在线地图的解决办法
最近在使用Qml地图中发现,osm地图在线加载地图失败,通过查看osm插件源代码,找到了osm瓦片地图的源地址为:http://c.tile.openstreetmap.org/%z/%x/%y.pn ...
- 【GStreamer源码分析】playbin播放test.wav加载插件过程分析
playbin播放test.wav加载插件过程分析 一.前言 二.playbin 播放 .wav 音频插件加载一览 三.测试代码 3.1 gst_init 3.2 gst_element_set_st ...
- Linux复制文件到usb设备中,使用shell脚本实现USB设备的加载与文件复制
使用shell脚本实现USB设备的加载与文件复制 在Linux操作系统中,如果插入一个USB设备,需要用mount挂载命令才能实现这个设备的加载,下面写一个USB设备挂载与文件复制的Shell程序,程 ...
- struts2 ajax上传文件 file空_WordPress插件漏洞分析:WPDiscuz任意文件上传漏洞
写在前面的话 就在不久之前,Wordfence的威胁情报团队在一款名叫wpDiscuz的Wordpress评论插件中发现了一个高危漏洞,而这款插件目前已有超过80000个网站在使用了.这个漏洞将允许未 ...
- js 读取本地文件到服务器,在没有Web服务器的情况下使用Javascript加载本地文件...
我需要编写一个使用HTML5和canvas的软件. 整个软件应该能够在本地运行,而不需要服务器.所以我只能使用Javascript,不能使用php. 困难的部分:我必须动态获取操作期间所需的文本文件的 ...
- Spring源码分析【3】-SpingWebInitializer的加载
SpingWebInitializer的加载 Spring基于注解的配置代码: public class SpingWebInitializer extends AbstractAnnotationC ...
最新文章
- 监控软件nagios错误总结
- 机器学习Sklearn实战——KNN算法
- 新手小白零基础搭建个人博客(一)服务器篇
- 关于Thinkphp3.2版本的分页问题
- How is XSRF token retrieved from backend
- 关于使用pdf.js预览pdf的一些问题
- 数仓集群管理:单节点故障RTO机制分析
- 腾讯为60亿美元债券定价 为1年来亚洲最大美元债发行交易
- linux下gdb调试程序
- 小暑至盛夏始吃苦尝酸保健康
- 小鬼授权系统源码全解密源码 附授权代码
- 如何查询Opencv的版本
- 【宋红康 MySQL数据库 】【高级篇】【09】InnoDB的数据存储结构
- 度分秒地理位置转wgs84坐标和2000坐标,2000坐标转wgs84坐标
- beamforming matlab,Beamforming- 波束形成Matlab程序,通过 了解 的算法过程,以及其含义 272万源代码下载- www.pudn.com...
- 好的vue框架-模板
- 用Python 实现简单的汇率计算
- Microsoft OneNote - 图片文字提取
- 崩坏3九游服务器稳定吗,崩坏3:大佬亲身经历告诉你,玩崩坏3到底该不该压等级!...
- 国内的知名产品及其开发语言v0.0.1