PageRenderTime 51ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/HDPHP/hdphp/Lib/Core/Boot.class.php

https://github.com/13808796047/AEshop
PHP | 295 lines | 268 code | 5 blank | 22 comment | 4 complexity | bd9fd5c84cd784090a615ed8cdbf8f7c MD5 | raw file
Possible License(s): Apache-2.0
  1. <?php
  2. if (!defined("HDPHP_PATH"))
  3. exit('No direct script access allowed');
  4. //.-----------------------------------------------------------------------------------
  5. // | Software: [HDPHP framework]
  6. // | Version: 2013.05
  7. // | Site: http://www.hdphp.com
  8. // |-----------------------------------------------------------------------------------
  9. // | Author: 向军 <houdunwangxj@gmail.com>
  10. // | Copyright (c) 2012-2013, http://www.houdunwang.com.All Rights Reserved.
  11. // |-----------------------------------------------------------------------------------
  12. // | License: http://www.apache.org/licenses/LICENSE-2.0
  13. // '-----------------------------------------------------------------------------------
  14. /**
  15. * 生成编译文件
  16. * @package hdphp
  17. * @supackage core
  18. * @author hdxj<houdunwangxj@gmail.com>
  19. */
  20. final class Boot
  21. {
  22. /**
  23. * 运行框架
  24. * 在单入口文件引入框架hdphp.php文件会自动执行run()方法,所以不用单独执行run方法
  25. * @access public
  26. * @return void
  27. */
  28. static public function run()
  29. {
  30. if (version_compare(PHP_VERSION, '5.4.0', '<')) {
  31. ini_set('magic_quotes_runtime', 0);
  32. define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc() ? TRUE : FALSE);
  33. } else {
  34. define('MAGIC_QUOTES_GPC', false);
  35. }
  36. $root = str_replace('\\','/',dirname($_SERVER['SCRIPT_FILENAME']));
  37. define('ROOT_PATH', $root.'/'); //根目录
  38. define("DS", DIRECTORY_SEPARATOR); //目录分隔符
  39. define('IS_CGI', substr(PHP_SAPI, 0, 3) == 'cgi' ? TRUE : FALSE);
  40. define('IS_WIN', strstr(PHP_OS, 'WIN') ? TRUE : FALSE);
  41. define('IS_CLI', PHP_SAPI == 'cli' ? TRUE : FALSE);
  42. define("HDPHP_DATA_PATH", HDPHP_PATH . 'Data/'); //数据目录
  43. define("HDPHP_LIB_PATH", HDPHP_PATH . 'Lib/'); //lib目录
  44. define("HDPHP_CONFIG_PATH", HDPHP_PATH . 'Config/'); //配置目录
  45. define("HDPHP_CORE_PATH", HDPHP_LIB_PATH . 'Core/'); //核心目录
  46. define("HDPHP_EXTEND_PATH", HDPHP_PATH . 'Extend/'); //扩展目录
  47. define("HDPHP_ORG_PATH", HDPHP_EXTEND_PATH . 'Org/'); //org目录
  48. define("HDPHP_DRIVER_PATH", HDPHP_LIB_PATH . 'Driver/'); //驱动目录
  49. define("HDPHP_EVENT_PATH", HDPHP_LIB_PATH . 'Event/'); //事件目录
  50. define("HDPHP_FUNCTION_PATH", HDPHP_LIB_PATH . 'Function/'); //函数目录
  51. define("HDPHP_LANGUAGE_PATH", HDPHP_LIB_PATH . 'Language/'); //语言目录
  52. define("HDPHP_TPL_PATH", HDPHP_LIB_PATH . 'Tpl/'); //框架模板目录
  53. define('IS_GROUP', defined("GROUP_PATH"));
  54. defined("STATIC_PATH") or define("STATIC_PATH",'Static/'); //网站静态文件目录
  55. defined("COMMON_PATH") or define("COMMON_PATH", IS_GROUP ? GROUP_PATH . 'Common/' : APP_PATH); //应用组公共目录
  56. defined("COMMON_CONFIG_PATH") or define("COMMON_CONFIG_PATH", IS_GROUP ? COMMON_PATH . 'Config/' : APP_PATH); //应用组公共目录
  57. defined("COMMON_MODEL_PATH") or define("COMMON_MODEL_PATH", IS_GROUP ? COMMON_PATH . 'Model/' : APP_PATH); //应用组公共目录
  58. defined("COMMON_CONTROL_PATH") or define("COMMON_CONTROL_PATH", IS_GROUP ? COMMON_PATH . 'Control/' : APP_PATH); //应用组公共目录
  59. defined("COMMON_LANGUAGE_PATH") or define("COMMON_LANGUAGE_PATH", IS_GROUP ? COMMON_PATH . 'Language/' : APP_PATH); //应用组语言包目录
  60. defined("COMMON_EXTEND_PATH") or define("COMMON_EXTEND_PATH", IS_GROUP ? COMMON_PATH . 'Extend/' : APP_PATH); //应用组扩展目录
  61. defined("COMMON_EVENT_PATH") or define("COMMON_EVENT_PATH", IS_GROUP ? COMMON_PATH . 'Event/' : APP_PATH); //应用组事件目录
  62. defined("COMMON_TAG_PATH") or define("COMMON_TAG_PATH", IS_GROUP ? COMMON_PATH . 'Tag/' : APP_PATH); //应用组标签目录
  63. defined("COMMON_LIB_PATH") or define("COMMON_LIB_PATH", IS_GROUP ? COMMON_PATH . 'Lib/' : APP_PATH); //应用组扩展包目录
  64. //加载核心文件
  65. self::loadCoreFile();
  66. //加载基本配置
  67. self::loadConfig();
  68. //编译核心文件
  69. self::compile();
  70. //应用初始化
  71. HDPHP::init();
  72. //创建应用目录
  73. self::mkDirs();
  74. //运行应用
  75. App::run();
  76. }
  77. /**
  78. * 加载核心文件
  79. * @access private
  80. * @return void
  81. */
  82. static private function loadCoreFile()
  83. {
  84. $files = array(
  85. HDPHP_CORE_PATH . 'HDPHP.class.php', //HDPHP顶级类
  86. HDPHP_CORE_PATH . 'Control.class.php', //HDPHP顶级类
  87. HDPHP_CORE_PATH . 'HdException.class.php', //异常处理类
  88. HDPHP_CORE_PATH . 'App.class.php', //HDPHP顶级类
  89. HDPHP_CORE_PATH . 'Route.class.php', //URL处理类
  90. HDPHP_CORE_PATH . 'Event.class.php', //事件处理类
  91. HDPHP_CORE_PATH . 'Log.class.php', //公共函数
  92. HDPHP_FUNCTION_PATH . 'Functions.php', //应用函数
  93. HDPHP_FUNCTION_PATH . 'Common.php', //公共函数
  94. HDPHP_CORE_PATH . 'Debug.class.php', //Debug处理类
  95. );
  96. foreach ($files as $v) {
  97. require($v);
  98. }
  99. }
  100. /**
  101. * 加载基本配置
  102. * @access private
  103. */
  104. static private function loadConfig()
  105. {
  106. //系统配置
  107. C(require(HDPHP_CONFIG_PATH . 'config.php'));
  108. //系统事件
  109. C("CORE_EVENT", require(HDPHP_CONFIG_PATH . 'event.php'));
  110. //系统语言
  111. L(require(HDPHP_LANGUAGE_PATH . 'zh.php'));
  112. //别名
  113. alias_import(require(HDPHP_CORE_PATH . 'Alias.php'));
  114. }
  115. /**
  116. * 创建项目运行目录
  117. * @access private
  118. * @return void
  119. */
  120. static public function mkDirs()
  121. {
  122. if (IS_GROUP and is_dir(COMMON_PATH)) return;
  123. if (is_dir(CONTROL_PATH)) return;
  124. //目录
  125. $dirs = array(
  126. CONTROL_PATH,
  127. CONFIG_PATH,
  128. LANGUAGE_PATH,
  129. MODEL_PATH,
  130. CONFIG_PATH,
  131. EVENT_PATH,
  132. TAG_PATH,
  133. LIB_PATH,
  134. COMPILE_PATH,
  135. CACHE_PATH,
  136. TABLE_PATH,
  137. LOG_PATH,
  138. TPL_PATH,
  139. PUBLIC_PATH,
  140. TEMP_PATH,
  141. STATIC_PATH
  142. );
  143. //应用组模式
  144. if (IS_GROUP) {
  145. $dirs = array_merge($dirs, array(
  146. COMMON_PATH,
  147. COMMON_CONFIG_PATH,
  148. COMMON_MODEL_PATH,
  149. COMMON_CONTROL_PATH,
  150. COMMON_LANGUAGE_PATH,
  151. COMMON_EVENT_PATH,
  152. COMMON_TAG_PATH,
  153. COMMON_LIB_PATH
  154. ));
  155. }
  156. foreach ($dirs as $d) {
  157. if (!dir_create($d, 0755)):
  158. header("Content-type:text/html;charset=utf-8");
  159. exit("目录{$d}创建失败,请检查权限");
  160. endif;
  161. }
  162. //复制公共模板文件
  163. is_file(PUBLIC_PATH . "success.html") or copy(HDPHP_TPL_PATH . "success.html", PUBLIC_PATH . "success.html");
  164. is_file(PUBLIC_PATH . "error.html") or copy(HDPHP_TPL_PATH . "error.html", PUBLIC_PATH . "error.html");
  165. //复制配置文件
  166. is_file(CONFIG_PATH . "config.php") or copy(HDPHP_TPL_PATH . "config.php", CONFIG_PATH . "config.php");
  167. is_file(CONFIG_PATH . "event.php") or copy(HDPHP_TPL_PATH . "event.php", CONFIG_PATH . "event.php");
  168. is_file(CONFIG_PATH . "alias.php") or copy(HDPHP_TPL_PATH . "alias.php", CONFIG_PATH . "alias.php");
  169. //应用组模式
  170. if (IS_GROUP) {
  171. //复制配置文件
  172. is_file(COMMON_CONFIG_PATH . "config.php") or copy(HDPHP_TPL_PATH . "config.php", COMMON_CONFIG_PATH . "config.php");
  173. is_file(COMMON_CONFIG_PATH . "event.php") or copy(HDPHP_TPL_PATH . "event.php", COMMON_CONFIG_PATH . "event.php");
  174. is_file(COMMON_CONFIG_PATH . "alias.php") or copy(HDPHP_TPL_PATH . "alias.php", COMMON_CONFIG_PATH . "alias.php");
  175. is_file(COMMON_LANGUAGE_PATH . "alias.php") or copy(HDPHP_TPL_PATH . "alias.php", COMMON_LANGUAGE_PATH . "alias.php");
  176. }
  177. //创建测试控制器
  178. is_file(CONTROL_PATH . 'IndexControl.class.php') or file_put_contents(CONTROL_PATH . 'IndexControl.class.php', file_get_contents(HDPHP_TPL_PATH . 'control.php'));
  179. //创建安全文件
  180. self::safeFile();
  181. }
  182. /**
  183. * 创建安全文件
  184. * @access private
  185. * @return void
  186. */
  187. static private function safeFile()
  188. {
  189. if (!defined("DIR_SAFE")) return;
  190. $dirs = array(
  191. COMMON_PATH,
  192. COMMON_CONFIG_PATH,
  193. COMMON_MODEL_PATH,
  194. COMMON_LANGUAGE_PATH,
  195. COMMON_EVENT_PATH,
  196. COMMON_TAG_PATH,
  197. COMMON_LIB_PATH,
  198. APP_PATH,
  199. CONTROL_PATH,
  200. CONFIG_PATH,
  201. LANGUAGE_PATH,
  202. MODEL_PATH,
  203. CONFIG_PATH,
  204. EVENT_PATH,
  205. TAG_PATH,
  206. LIB_PATH,
  207. COMPILE_PATH,
  208. CACHE_PATH,
  209. TABLE_PATH,
  210. LOG_PATH,
  211. TPL_PATH,
  212. PUBLIC_PATH,
  213. TEMP_PATH,
  214. );
  215. $file = HDPHP_TPL_PATH . '/index.html';
  216. foreach ($dirs as $d) {
  217. is_file($d . '/index.html') || copy($file, $d . '/index.html');
  218. }
  219. }
  220. /**
  221. * 编译核心文件
  222. * @access private
  223. */
  224. static private function compile()
  225. {
  226. if (DEBUG) {
  227. is_file(TEMP_FILE) and unlink(TEMP_FILE);
  228. return;
  229. }
  230. $compile = '';
  231. //常量编译
  232. $_define = get_defined_constants(true);
  233. foreach ($_define['user'] as $n => $d) {
  234. if ($d == '\\') $d = "'\\\\'";
  235. else $d = is_int($d) ? intval($d) : "'{$d}'";
  236. $compile .= "defined('{$n}') OR define('{$n}',{$d});";
  237. }
  238. $files = array(
  239. HDPHP_CORE_PATH . 'App.class.php', //HDPHP顶级类
  240. HDPHP_CORE_PATH . 'Control.class.php', //控制器基类
  241. HDPHP_CORE_PATH . 'Debug.class.php', //Debug处理类
  242. HDPHP_CORE_PATH . 'Event.class.php', //事件处理类
  243. HDPHP_CORE_PATH . 'HDPHP.class.php', //HDPHP顶级类
  244. HDPHP_CORE_PATH . 'HdException.class.php', //异常处理类
  245. HDPHP_CORE_PATH . 'Log.class.php', //Log日志类
  246. HDPHP_CORE_PATH . 'Route.class.php', //URL处理类
  247. HDPHP_FUNCTION_PATH . 'Functions.php', //应用函数
  248. HDPHP_FUNCTION_PATH . 'Common.php', //公共函数
  249. HDPHP_DRIVER_PATH . 'Cache/Cache.class.php', //缓存基类
  250. HDPHP_DRIVER_PATH . 'Cache/CacheFactory.class.php', //缓存工厂类
  251. HDPHP_DRIVER_PATH . 'Cache/CacheFile.class.php', //文件缓存处理类
  252. HDPHP_DRIVER_PATH . 'Db/Db.class.php', //数据处理基类
  253. HDPHP_DRIVER_PATH . 'Db/DbFactory.class.php', //数据工厂类
  254. HDPHP_DRIVER_PATH . 'Db/DbInterface.class.php', //数据接口类
  255. HDPHP_DRIVER_PATH . 'Db/DbMysqli.class.php', //Mysqli驱动类
  256. HDPHP_DRIVER_PATH . 'Model/Model.class.php', //模型基类
  257. HDPHP_DRIVER_PATH . 'Model/RelationModel.class.php', //关联模型类
  258. HDPHP_DRIVER_PATH . 'Model/ViewModel.class.php', //视图模型类
  259. HDPHP_DRIVER_PATH . 'View/ViewHd.class.php', //Hd视图驱动类
  260. HDPHP_DRIVER_PATH . 'View/View.class.php', //视图库
  261. HDPHP_DRIVER_PATH . 'View/ViewFactory.class.php', //视图工厂库
  262. HDPHP_DRIVER_PATH . 'View/ViewCompile.class.php', //模板编译类
  263. HDPHP_EXTEND_PATH . 'Tool/Dir.class.php', //目录操作类
  264. );
  265. foreach ($files as $f) {
  266. $con = compress(trim(file_get_contents($f)));
  267. $compile .= substr($con, -2) == '?>' ? trim(substr($con, 5, -2)) : trim(substr($con, 5));
  268. }
  269. //HDPHP框加核心配置
  270. $compile .= 'C(' . var_export(C(), true) . ');';
  271. //HDPHP框架核心语言包
  272. $compile .= 'L(' . var_export(L(), true) . ');';
  273. //别名配置文件
  274. $compile .= 'alias_import(' . var_export(alias_import(), true) . ');';
  275. //编译内容
  276. $compile = '<?php if(!defined(\'DEBUG\'))exit;' . $compile . 'HDPHP::init();App::run();?>';
  277. //创建Boot编译文件
  278. if (is_dir(TEMP_PATH) or dir_create(TEMP_PATH) and is_writable(TEMP_PATH))
  279. return file_put_contents(TEMP_FILE, compress($compile));
  280. header("Content-type:text/html;charset=utf-8");
  281. exit("<div style='border:solid 1px #dcdcdc;padding:30px;'>目录创建失败,请修改" . realpath(dirname(TEMP_PATH)) . "目录权限</div>");
  282. }
  283. }
  284. ?>