为了提高基于ThinkPHP开发应用的性能,ThinkPHP正式版本中引入了项目编译机制。所谓的项目编译机制指当应用第一次被运行时,系统会在运行时目录下生成两个编译缓存文件:~runtime.php和~app.php,前者为核心编译缓存文件,后者为项目编译缓存文件。这两个文件打包了执行应用所需要的一些脚本文件内容,这样做的目的,是为了省去每次执行应用时重复的I/O开销,提高应用性能。
核心编译缓存文件中包含的文件有三种不同的情况:如果用户在自身的项目配置目录中配置了core.php文件,那么~runtime.php中就包含core.php文件中返回的文件列表下的文件;如果用户设置了项目特定的运行模式,那么~runtime.php中就包含该模式下所定义的核心文件;除此之外,~runtime.php中包含的就是ThinkPHP默认的核心文件,这些文件由系统目录下公共目录下的core.php决定。
// 读取核心编译文件列表
if(is_file(CONFIG_PATH.'core.php')) {
// 加载项目自定义的核心编译文件列表
$list = include CONFIG_PATH.'core.php'; // 可以自定义核心编译文件列表(s)
}elseif(defined('THINK_MODE')) {
// 根据设置的运行模式加载不同的核心编译文件
$list = include THINK_PATH.'/Mode/'.strtolower(THINK_MODE).'.php';
}else{
// 默认核心
$list = include THINK_PATH.'/Common/core.php'; // * important *(s)
}
通常情况下,使用框架默认的核心文件就能满足大部分应用要求。 核心文件返回如下8个文件:系统函数库(functions.php),系统基类(Think.class.php),异常处理类(ThinkException.class.php),日志处理类(Log.class.php),应用程序类(App.class.php),控制器类(Action.class.php),视图类(View.class.php)和别名类(alias.php)。如果应用有特别的核心文件需要编译缓存,也可以将文件加入到数组中。
// 系统默认的核心列表文件
return array(
THINK_PATH.'/Common/functions.php', // 系统函数库
THINK_PATH.'/Lib/Think/Core/Think.class.php', // 系统核心类库基类
THINK_PATH.'/Lib/Think/Exception/ThinkException.class.php', // 异常处理类
THINK_PATH.'/Lib/Think/Core/Log.class.php', // 日志处理类
THINK_PATH.'/Lib/Think/Core/App.class.php', // 应用程序类
THINK_PATH.'/Lib/Think/Core/Action.class.php', // 控制器类
//THINK_PATH.'/Lib/Think/Core/Model.class.php', // 模型类
THINK_PATH.'/Lib/Think/Core/View.class.php', // 视图类
THINK_PATH.'/Common/alias.php', // 加载别名
);
同时,如果环境中PHP版本低于5.2.0,~runtime.php还会包含系统提供的兼容函数库compat.php, 更大的兼容各种不同的环境。
为了更有效率的包含这些核心文件,ThinkPHP采取了foreach遍历加载文件的方法。至此,已经可以运行一个应用了。但是,这样存在一个问题,就是每次执行应用的时候,系统都会重复上面的操作,这将造成很大的I/O开销,当访问量达到一定数量后,服务器将会不堪重负。为了解决这个问题,ThinkPHP提供了一种解决方案,就是使用编译缓存机制。具体实现是将核心文件内容编译到同一个文件中,这样每次执行应用时,只需加载这个编译缓存文件即可,这样就极大地减少了I/O开销,增强了应用程序的性能。
ThinkPHP项目编译机制主要借助系统函数compile()完成,compile()函数位于系统函数库中,其具体内容如下:
function compile($filename, $runtime=false) {
$content = file_get_contents($filename);
if (true === $runtime)
// 替换预编译指令(ALLINONE模式)
$content = preg_replace('/\/\/\[RUNTIME\](.*?)\/\/\[\/RUNTIME\]/s', '', $content);
$content = substr(trim($content), 5);
if ('?>' == substr($content, -2))
$content = substr($content, 0, -2);
return $content;
}
可以看到,函数通过将文件内容读入到一个字符串,然后对字符串进行了一些截取处理,去掉了PHP的开始和结束标记。最后返回包含文件内容的字符串。
有了这个compile()函数,余下就是调用这个函数处理核心文件并将这些处理后得到的字符串连接的过程。考虑到开发者在使用ThinkPHP进行开发会经历开发调试与部署两种不同环境,ThinkPHP为开发者提供了两种不同的编译缓存模式。一种是仅仅将核心文件内容简单的编译在了一个文件中,这种模式方便开发者在开发过程中快速的进行错误定位。另一种模式则不仅仅是对文件内容的简单叠加,还去除了其中的注释和空白进行,这种模式适合于部署环境,保证服务器更快的响应。
if(!defined('NO_CACHE_RUNTIME')) {
// 生成核心编译缓存文件。
$compile = defined('RUNTIME_ALLINONE'); // return 'true' or 'false'(s)
$content = compile(THINK_PATH.'/Common/defines.php',$compile);
$content .= compile(defined('PATH_DEFINE_FILE')? PATH_DEFINE_FILE : THINK_PATH.'/Common/paths.php',$compile);
foreach ($list as $file){
$content .= compile($file,$compile);
}
$runtime = defined('THINK_MODE')?'~'.strtolower(THINK_MODE).'_runtime.php':'~runtime.php';
if(defined('STRIP_RUNTIME_SPACE') && STRIP_RUNTIME_SPACE == false ) {
file_put_contents(RUNTIME_PATH.$runtime,'<?php'.$content);
}else{
file_put_contents(RUNTIME_PATH.$runtime,strip_whitespace('<?php'.$content));
}
unset($content);
}
这样就生成了核心编译缓存文件~runtime.php。
项目编译缓存文件~app.php则是通过调用App类下的init方法生成的。在第一次运行应用时,应用程序初始化,系统会预编译项目。项目编译缓存文件中包含:惯例配置文件,项目配置文件,公共函数文件以及自定义的项目编译文件列表文件。
(完)
分享到:
相关推荐
《深入解析ThinkPHP6.0框架源码》 ThinkPHP6.0是基于PHP语言的轻量级开发框架,以其高效、稳定、易用的特点深受开发者喜爱。它为快速构建Web应用提供了强大的支持,同时也为开发者提供了源码级别的学习资源。在深入...
四、项目结构分析 - index.php:入口文件,负责调度整个应用。 - App:应用程序目录,包含各个模块的控制器、模型、视图等文件。 - Public:静态资源文件夹,存放CSS、JavaScript和图片等。 - ThinkPHP:Thinkphp...
本篇将围绕"thinkphp5-master"源码进行深入探讨,揭示其背后的运行机制和设计思想。 一、目录结构解析 "thinkphp5-master"的源码结构清晰,遵循MVC模式,主要分为以下几个关键部分: 1. application:应用目录,...
1. SQL注入防护:ThinkPHP提供预编译SQL和参数绑定机制,有效防止SQL注入攻击。 2. CSRF防护:利用Token机制防止跨站请求伪造攻击,确保用户操作的安全性。 3. 错误处理与日志记录:合理设置错误提示级别,记录...
根据提供的压缩包文件名称"132676218423022500",虽然无法直接获取详细内容,但通常ThinkPHP的源码包会包含以下关键文件和目录: 1. `ThinkPHP`:框架主体,包含核心类库和函数。 2. `Application`:应用程序目录,...
标题中的"ThinkPHP帮忙砍价任务赚钱源码 可封装APP.zip"表明这是一个基于ThinkPHP框架的源代码项目,主要用于实现“帮忙砍价”的任务功能,并且具备将此功能封装成独立应用程序(APP)的能力。在IT行业中,源码是...
4. 安全防护:采用ThinkPHP内置的安全机制,如输入过滤、SQL预编译等,防止SQL注入等攻击。 五、源码学习价值 对于正在学习ThinkPHP3.x或进行毕业设计、课程设计的同学来说,这个项目具有很高的学习价值。通过阅读...
"Thinkphp全新UI黑白模式微信影视小程序源码" 是一款基于Thinkphp框架开发的小程序项目,特别之处在于它具有两种主题模式——黑白色调,以适应不同用户的视觉偏好。这款源码是专为微信平台设计的,用于搭建影视类小...
综合以上分析,我们可以看出这个项目是一个完整的、基于ThinkPHP框架的数字货币交易平台,具备多语言支持和跨平台适应性,并且提供了一个后台管理系统,方便管理和监控交易活动。开发者可以通过研究源码学习ThinkPHP...
1. **SQL注入防护**:ThinkPHP5内置了防止SQL注入的机制,通过预编译和参数绑定等方式确保数据安全。 2. **XSS防护**:防止跨站脚本攻击,对用户输入进行过滤和转义。 3. **权限控制**:通过角色权限设置,防止非法...
《基于ThinkPHP的药店药品进销存管理系统源码解析》 在信息技术日益发达的今天,高效、精准的药品进销存管理对于药店运营至关重要。基于ThinkPHP框架开发的药店药品进销存管理系统,以其强大的功能和灵活的扩展性,...
ThinkPHP5提供了诸如防止SQL注入、XSS攻击的安全机制,但开发者还需要额外的防护措施,如使用预编译语句、过滤用户输入、设置合理的session过期时间等。另外,为了提高系统性能,可以进行数据库优化(如索引建立、...
综上所述,这个源码项目涵盖了物联网、云计算、设备管理、数据分析等多个IT领域的核心技术,对于想要学习和实践物联网解决方案的开发者具有极高的学习价值。通过深入理解和定制这个源码,开发者可以构建出适合自己...
2. 理解源码结构,分析前端页面逻辑和接口调用。 3. 学习并熟悉fastadmin的后端架构,包括控制器、模型、视图和中间件等。 4. 设计和实现新功能时,确保前后端数据交互的正确性,遵循RESTful API设计原则。 5. 对于...
【标签解析】:“源码”标签表示这个压缩包包含的是可以编译或执行的原始代码,而不是编译后的二进制文件。对于开发者而言,源码能提供更多的学习和定制机会,可以深入了解系统的工作原理,并根据需求进行修改和扩展...
开发者需要在源码中实现相应的安全机制,如使用预编译语句、输入验证、HTTPS加密传输等。 5. **模板建站**:"模板建站"标签表明CRMSHOP可能包含多种预设的界面风格,方便用户快速搭建具有专业外观的商城网站。用户...
理解这些防护机制并能识别它们在源码中的实现是分析的关键。 7. **性能优化**:美团网作为大型网站,必须考虑性能优化,包括缓存策略(如 Memcached 或 Redis)、数据库索引优化、减少HTTP请求和优化图片资源等。 ...
6. **源码分析与扩展** ThinkJD的源代码结构清晰,易于阅读和理解,开发者可以根据自己的需求进行二次开发和扩展。如果你希望了解其内部实现机制,可以查看Leytton-ThinkJD-82121ab这个版本的源代码,通过阅读和...