<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- /** * ThinkPHP 运行时文件 编译后不再加载 * @category Think * @package Common * @author liu21st <liu21st@gmail.com> */ defined('THINK_PATH') or exit(); if(version_compare(PHP_VERSION,'5.2.0','<')) die('require PHP > 5.2.0 !'); // 版本信息 define('THINK_VERSION', '3.1.3'); // 系统信息 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); } define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 ); define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 ); define('IS_CLI',PHP_SAPI=='cli'? 1 : 0); // 项目名称 defined('APP_NAME') or define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME']))); if(!IS_CLI) { // 当前文件名 if(!defined('_PHP_FILE_')) { 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__')) { // 网站URL根目录 if( strtoupper(APP_NAME) == strtoupper(basename(dirname(_PHP_FILE_))) ) { $_root = dirname(dirname(_PHP_FILE_)); }else { $_root = dirname(_PHP_FILE_); } define('__ROOT__', (($_root=='/' || $_root=='\\')?'':$_root)); } //支持的URL模式 define('URL_COMMON', 0); //普通模式 define('URL_PATHINFO', 1); //PATHINFO模式 define('URL_REWRITE', 2); //REWRITE模式 define('URL_COMPAT', 3); // 兼容模式 } // 路径设置 可在入口文件中重新定义 所有路径常量都必须以/ 结尾 defined('CORE_PATH') or define('CORE_PATH', THINK_PATH.'Lib/'); // 系统核心类库目录 defined('EXTEND_PATH') or define('EXTEND_PATH', THINK_PATH.'Extend/'); // 系统扩展目录 defined('MODE_PATH') or define('MODE_PATH', EXTEND_PATH.'Mode/'); // 模式扩展目录 defined('ENGINE_PATH') or define('ENGINE_PATH', EXTEND_PATH.'Engine/'); // 引擎扩展目录 defined('VENDOR_PATH') or define('VENDOR_PATH', EXTEND_PATH.'Vendor/'); // 第三方类库目录 defined('LIBRARY_PATH') or define('LIBRARY_PATH', EXTEND_PATH.'Library/'); // 扩展类库目录 defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH.'Common/'); // 项目公共目录 defined('LIB_PATH') or define('LIB_PATH', APP_PATH.'Lib/'); // 项目类库目录 defined('CONF_PATH') or define('CONF_PATH', APP_PATH.'Conf/'); // 项目配置目录 defined('LANG_PATH') or define('LANG_PATH', APP_PATH.'Lang/'); // 项目语言包目录 defined('TMPL_PATH') or define('TMPL_PATH', APP_PATH.'Tpl/'); // 项目模板目录 defined('HTML_PATH') or define('HTML_PATH', APP_PATH.'Html/'); // 项目静态目录 defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH.'Logs/'); // 项目日志目录 defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH.'Temp/'); // 项目缓存目录 defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH.'Data/'); // 项目数据目录 defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH.'Cache/'); // 项目模板缓存目录 // 为了方便导入第三方类库 设置Vendor目录到include_path set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH); // 加载运行时所需要的文件 并负责自动目录生成 function load_runtime_file() { // 加载系统基础函数库 require THINK_PATH.'Common/common.php'; // 读取核心文件列表 $list = array( CORE_PATH.'Core/Think.class.php', CORE_PATH.'Core/ThinkException.class.php', // 异常处理类 CORE_PATH.'Core/Behavior.class.php', ); // 加载模式文件列表 foreach ($list as $key=>$file){ if(is_file($file)) require_cache($file); } // 加载系统类库别名定义 alias_import(include THINK_PATH.'Conf/alias.php'); // 检查项目目录结构 如果不存在则自动创建 if(!is_dir(LIB_PATH)) { // 创建项目目录结构 build_app_dir(); }elseif(!is_dir(CACHE_PATH)){ // 检查缓存目录 check_runtime(); }elseif(APP_DEBUG){ // 调试模式切换删除编译缓存 if(is_file(RUNTIME_FILE)) unlink(RUNTIME_FILE); } } // 检查缓存目录(Runtime) 如果不存在则自动创建 function check_runtime() { if(!is_dir(RUNTIME_PATH)) { mkdir(RUNTIME_PATH); }elseif(!is_writeable(RUNTIME_PATH)) { header('Content-Type:text/html; charset=utf-8'); exit('目录 [ '.RUNTIME_PATH.' ] 不可写!'); } mkdir(CACHE_PATH); // 模板缓存目录 if(!is_dir(LOG_PATH)) mkdir(LOG_PATH); // 日志目录 if(!is_dir(TEMP_PATH)) mkdir(TEMP_PATH); // 数据缓存目录 if(!is_dir(DATA_PATH)) mkdir(DATA_PATH); // 数据文件目录 return true; } // 创建编译缓存 function build_runtime_cache($append='') { // 生成编译文件 $defs = get_defined_constants(TRUE); $content = '$GLOBALS[\'_beginTime\'] = microtime(TRUE);'; if(defined('RUNTIME_DEF_FILE')) { // 编译后的常量文件外部引入 file_put_contents(RUNTIME_DEF_FILE,'<?php '.array_define($defs['user'])); $content .= 'require \''.RUNTIME_DEF_FILE.'\';'; }else{ $content .= array_define($defs['user']); } $content .= 'set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH);'; // 读取核心编译文件列表 $list = array( THINK_PATH.'Common/common.php', CORE_PATH.'Core/Think.class.php', CORE_PATH.'Core/ThinkException.class.php', CORE_PATH.'Core/Behavior.class.php', ); foreach ($list as $file){ $content .= compile($file); } // 系统行为扩展文件统一编译 $content .= build_tags_cache(); $alias = include THINK_PATH.'Conf/alias.php'; $content .= 'alias_import('.var_export($alias,true).');'; // 编译框架默认语言包和配置参数 $content .= $append."\nL(".var_export(L(),true).");C(".var_export(C(),true).');G(\'loadTime\');Think::Start();'; file_put_contents(RUNTIME_FILE,strip_whitespace('<?php '.str_replace("defined('THINK_PATH') or exit();",' ',$content))); } // 编译系统行为扩展类库 function build_tags_cache() { $tags = C('extends'); $content = ''; foreach ($tags as $tag=>$item){ foreach ($item as $key=>$name) { $content .= is_int($key)?compile(CORE_PATH.'Behavior/'.$name.'Behavior.class.php'):compile($name); } } return $content; } // 创建项目目录结构 function build_app_dir() { // 没有创建项目目录的话自动创建 if(!is_dir(APP_PATH)) mkdir(APP_PATH,0755,true); if(is_writeable(APP_PATH)) { $dirs = array( LIB_PATH, RUNTIME_PATH, CONF_PATH, COMMON_PATH, LANG_PATH, CACHE_PATH, TMPL_PATH, TMPL_PATH.C('DEFAULT_THEME').'/', LOG_PATH, TEMP_PATH, DATA_PATH, LIB_PATH.'Model/', LIB_PATH.'Action/', LIB_PATH.'Behavior/', LIB_PATH.'Widget/', ); foreach ($dirs as $dir){ if(!is_dir($dir)) mkdir($dir,0755,true); } // 写入目录安全文件 build_dir_secure($dirs); // 写入初始配置文件 if(!is_file(CONF_PATH.'config.php')) file_put_contents(CONF_PATH.'config.php',"<?php\nreturn array(\n\t//'配置项'=>'配置值'\n);\n?>"); // 写入测试Action if(!is_file(LIB_PATH.'Action/IndexAction.class.php')) build_first_action(); }else{ header('Content-Type:text/html; charset=utf-8'); exit('项目目录不可写,目录无法自动生成!<BR>请使用项目生成器或者手动生成项目目录~'); } } // 创建测试Action function build_first_action() { $content = file_get_contents(THINK_PATH.'Tpl/default_index.tpl'); file_put_contents(LIB_PATH.'Action/IndexAction.class.php',$content); } // 生成目录安全文件 function build_dir_secure($dirs=array()) { // 目录安全写入 if(defined('BUILD_DIR_SECURE') && BUILD_DIR_SECURE) { defined('DIR_SECURE_FILENAME') or define('DIR_SECURE_FILENAME', 'index.html'); defined('DIR_SECURE_CONTENT') or define('DIR_SECURE_CONTENT', ' '); // 自动写入目录安全文件 $content = DIR_SECURE_CONTENT; $files = explode(',', DIR_SECURE_FILENAME); foreach ($files as $filename){ foreach ($dirs as $dir) file_put_contents($dir.$filename,$content); } } } // 加载运行时所需文件 load_runtime_file(); // 记录加载文件时间 G('loadTime'); // 执行入口 Think::Start();