在分析ThinkPHP框架入口文件之前先看一下ThinkPHP3.2.1中自带的应用入口文件。
// 检测PHP环境,这里可以看出想要使用ThinkPHP3.2.1版本,PHP版本必须大于5.3,直接说明ThinkPHP3.2.1框架使用了大量PHP5.3以上版本的新特新
if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !');
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
// 定义应用目录
define('APP_PATH','./Application/');
// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';
从上面的例子中可以看出ThinkPHP的项目入口文件当真简单,这只是针对应用者而已,其实ThinkPHP框架正常运行需要定义大量常量。下面分析框架入口文件,并记录所有使用的配置和常量,如果出现bug也会做出记录,在整个项目分析完成后一起归纳分享。
// ThinkPHP公共入口文件
//以下两个记录为调试模式和记录日志时使用的。
//将当前时间记录到全局变量_beginTime中
$GLOBALS['_beginTime'] = microtime(TRUE);
//判断memory_get_usage是否启用,并定义一个常量
define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
//将获得当前内存使用值存入全局变量_startUseMems中
if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();
/*
*这里有一个PHP5.3版本的新特新,const在5.3之后就变为可全局使用了,并且在使用命名空间时只能用const来定义
*define为全局常量,const可以使用命名空间来避免不同命名空间的常量名称冲突。
*const关键字定义常量的几个规则:
* 1.建议使用大写字母定义
* 2.常量不能使用$符号去声明
* 3.必须符合define定义常量的命名规则
* 4.常量值必须是一个常量表达式,而不能是一个不确定的结果,如变量或者函数等
* 5.其值必须是标量类型(字符串、布尔值、整型、浮点型)
* 6.如果在一个命名空间定义,在其它命名空间必须是命名空间方式访问常量
*/
// 版本信息
const THINK_VERSION = '3.2.1';
// URL 模式定义
const URL_COMMON = 0; //普通模式
const URL_PATHINFO = 1; //PATHINFO模式
const URL_REWRITE = 2; //REWRITE模式
const URL_COMPAT = 3; // 兼容模式
// 类文件后缀
const EXT = '.class.php';
// 系统常量定义,系统常量都做了判断,这也是我们自己可以在项目入口文件配置的常量值
//THINK_PATH定义THINK_PATH框架路径,__DIR__返回当前脚本所在目录
defined('THINK_PATH') or define('THINK_PATH', __DIR__.'/');
//APP_PATH项目路径,dirname($_SERVER['SCRIPT_FILENAME']).'/')获取当前应用入口文件所在的目录
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
//APP_STATUS应用环境常量,用来决定加载的主配置文件
defined('APP_STATUS') or define('APP_STATUS', '');
//APP_DEBUG调试模式常量
defined('APP_DEBUG') or define('APP_DEBUG', false);
//下面这两个常量比较有意思,比之前的版本更加简单化支持sae环境
//APP_MODE项目环境,sae新浪云,common普通模式
//STORAGE_TYPE定义默认缓存文件类型
if(function_exists('saeAutoLoader')){// 自动识别SAE环境
defined('APP_MODE') or define('APP_MODE', 'sae');
defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');
}else{
defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默认为普通模式
defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默认为File
}
//RUNTIME_PATH,项目运行时缓存主目录,可以更改其它常量实现与主缓存目录分离
defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH.'Runtime/'); // 系统运行时目录
//LIB_PATH定义系统核心类库主目录
defined('LIB_PATH') or define('LIB_PATH', realpath(THINK_PATH.'Library').'/'); // 系统核心类库目录
//CORE_PATH定义ThinkPHP框架类库目录
defined('CORE_PATH') or define('CORE_PATH', LIB_PATH.'Think/'); // Think类库目录
//BEHAVIOR_PATH定义ThinkPHP框架行为类库目录
defined('BEHAVIOR_PATH')or define('BEHAVIOR_PATH', LIB_PATH.'Behavior/'); // 行为类库目录
//MODE_PATH定义系统应用模式目录,目前支持api、sae和common模式
defined('MODE_PATH') or define('MODE_PATH', THINK_PATH.'Mode/'); // 系统应用模式目录
//Vendor定义第三方类库目录
defined('VENDOR_PATH') or define('VENDOR_PATH', LIB_PATH.'Vendor/'); // 第三方类库目录
//Common应用公共函数库目录
defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH.'Common/'); // 应用公共目录
//CONF_PATH定义应用配置文件目录
defined('CONF_PATH') or define('CONF_PATH', COMMON_PATH.'Conf/'); // 应用配置目录
//LANG_PATH定义应用语言目录
defined('LANG_PATH') or define('LANG_PATH', COMMON_PATH.'Lang/'); // 应用语言目录
//HTML_PATH定义应用静态文件目录
defined('HTML_PATH') or define('HTML_PATH', APP_PATH.'Html/'); // 应用静态目录
//LOG_PATH定义应用日志目录
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH.'Logs/'); // 应用日志目录
//TEMP_PATH定义缓存目录
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH.'Temp/'); // 应用缓存目录
//DATA_PATH定义应用数据缓存目录
defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH.'Data/'); // 应用数据目录
//CACHE_PATH定义模版编译缓存目录
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH.'Cache/'); // 应用模板缓存目录
//设置magic_quotes_runtime自动安全过滤状态,
//这个在php5.4及以上版本中移除了该设置
if(version_compare(PHP_VERSION,'5.4.0','<')) {
ini_set('magic_quotes_runtime',0);
define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()?True:False);
}else{
define('MAGIC_QUOTES_GPC',false);
}
//判断php与服务器之间所使用的接口类型
define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 );
//判断是否在windows系统下运行
define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 );
//判断是否在命令行模式下运行
define('IS_CLI',PHP_SAPI=='cli'? 1 : 0);
if(!IS_CLI) {
// 当前入口文件路径文件名
if(!defined('_PHP_FILE_')) {
echo $_SERVER['HTTP_HOST'];
if(IS_CGI) {
//CGI/FASTCGI模式下
$_temp = explode('.php',$_SERVER['PHP_SELF']);
define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/'));
}else {
define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'],'/'));
}
}
//获取当前入口所在目录
if(!defined('__ROOT__')) {
$_root = rtrim(dirname(_PHP_FILE_),'/');
define('__ROOT__', (($_root=='/' || $_root=='\\')?'':$_root));
}
}
// 加载核心Think类
require CORE_PATH.'Think'.EXT;
// 应用初始化
Think\Think::start();
提醒:通过定义和改变原有框架及应用的目录结构可以简单提高系统安全等级,虽然作用不是很大,请勿因物小而不为。