PageRenderTime 56ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://github.com/13808796047/AEshop
PHP | 276 lines | 200 code | 8 blank | 68 comment | 19 complexity | b04fbae353da2c097c07a7029be653bc 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. static private $_dirs = array(); //初始目录
  23. static private $_compile = ''; //编译内容
  24. /**
  25. * 运行框架
  26. * 在单入口文件引入框架hdphp.php文件会自动执行run()方法,所以不用单独执行run方法
  27. * @access public
  28. * @return void
  29. */
  30. static public function run()
  31. {
  32. define("DS", DIRECTORY_SEPARATOR); //目录分隔符
  33. define("IS_WIN", strstr(PHP_OS, 'WIN') ? true : false); //window环境
  34. define("HDPHP_DATA_PATH", HDPHP_PATH . 'Data/'); //数据目录
  35. define("HDPHP_LIB_PATH", HDPHP_PATH . 'Lib/'); //lib目录
  36. define("HDPHP_CONFIG_PATH", HDPHP_PATH . 'Config/'); //配置目录
  37. define("HDPHP_CORE_PATH", HDPHP_LIB_PATH . 'Core/'); //核心目录
  38. define("HDPHP_EXTEND_PATH", HDPHP_PATH . 'Extend/'); //扩展目录
  39. define("HDPHP_DRIVER_PATH", HDPHP_LIB_PATH . 'Driver/'); //驱动目录
  40. define("HDPHP_EVENT_PATH", HDPHP_LIB_PATH . 'Event/'); //事件目录
  41. define("HDPHP_FUNCTION_PATH", HDPHP_LIB_PATH . 'Function/'); //函数目录
  42. define("HDPHP_LANGUAGE_PATH", HDPHP_LIB_PATH . 'Language/'); //语言目录
  43. define("HDPHP_TPL_PATH", HDPHP_LIB_PATH . 'Tpl/'); //框架模板目录
  44. define("COMMON_PATH", IS_GROUP ? GROUP_PATH . 'Common/' : APP_PATH); //应用组公共目录
  45. define("COMMON_CONFIG_PATH", IS_GROUP ? COMMON_PATH . 'Config/' : APP_PATH); //应用组公共目录
  46. define("COMMON_MODEL_PATH", IS_GROUP ? COMMON_PATH . 'Model/' : APP_PATH); //应用组公共目录
  47. define("COMMON_LANGUAGE_PATH", IS_GROUP ? COMMON_PATH . 'Language/' : APP_PATH); //应用组语言包目录
  48. define("COMMON_EVENT_PATH", IS_GROUP ? COMMON_PATH . 'Event/' : APP_PATH); //应用组公共目录
  49. define("COMMON_TAG_PATH", IS_GROUP ? COMMON_PATH . 'Tag/' : APP_PATH); //应用组公共目录
  50. define("COMMON_LIB_PATH", IS_GROUP ? COMMON_PATH . 'Lib/' : APP_PATH); //应用组公共目录
  51. //加载核心文件
  52. self::loadCoreFile();
  53. //系统配置
  54. C(require(HDPHP_CONFIG_PATH . 'config.php'));
  55. //系统事件
  56. C("CORE_EVENT", require(HDPHP_CONFIG_PATH . 'event.php'));
  57. //系统语言
  58. L(require(HDPHP_LANGUAGE_PATH . 'zh.php'));
  59. //别名
  60. alias_import(require(HDPHP_CORE_PATH . 'Alias.php'));
  61. //编译核心文件
  62. self::compile();
  63. //获得应用变量
  64. HDPHP::init();
  65. //创建应用目录
  66. self::mkDirs();
  67. //自动加载文件
  68. self::compileAppLib();
  69. //运行应用
  70. App::run();
  71. }
  72. /**
  73. * 加载核心文件
  74. * @access private
  75. * @return void
  76. */
  77. static private function loadCoreFile()
  78. {
  79. $files = array(
  80. HDPHP_CORE_PATH . 'HDPHP.class.php', //HDPHP顶级类
  81. HDPHP_CORE_PATH . 'Control.class.php', //HDPHP顶级类
  82. HDPHP_CORE_PATH . 'HdphpException.class.php', //异常处理类
  83. HDPHP_CORE_PATH . 'App.class.php', //HDPHP顶级类
  84. HDPHP_CORE_PATH . 'Route.class.php', //URL处理类
  85. HDPHP_CORE_PATH . 'Event.class.php', //事件处理类
  86. HDPHP_CORE_PATH . 'Log.class.php', //公共函数
  87. HDPHP_FUNCTION_PATH . 'Functions.php', //应用函数
  88. HDPHP_FUNCTION_PATH . 'Common.php', //公共函数
  89. );
  90. foreach ($files as $v) {
  91. require($v);
  92. }
  93. }
  94. /**
  95. * 创建项目运行目录
  96. * @access private
  97. * @return void
  98. */
  99. static public function mkDirs()
  100. {
  101. //应用组时不自动创建应用目录
  102. if (defined("GROUP_PATH") && is_dir(GROUP_PATH)) {
  103. return;
  104. }
  105. //目录
  106. $dirs = array(
  107. COMMON_PATH,
  108. COMMON_CONFIG_PATH,
  109. COMMON_MODEL_PATH,
  110. COMMON_LANGUAGE_PATH,
  111. COMMON_EVENT_PATH,
  112. COMMON_TAG_PATH,
  113. COMMON_LIB_PATH,
  114. APP_PATH,
  115. CONTROL_PATH,
  116. CONFIG_PATH,
  117. LANGUAGE_PATH,
  118. MODEL_PATH,
  119. CONFIG_PATH,
  120. EVENT_PATH,
  121. TAG_PATH,
  122. LIB_PATH,
  123. COMPILE_PATH,
  124. CACHE_PATH,
  125. TABLE_PATH,
  126. LOG_PATH,
  127. TPL_PATH,
  128. PUBLIC_PATH
  129. );
  130. foreach ($dirs as $d) {
  131. if (is_dir($d) || dir_create($d, 0755, true)):
  132. else:
  133. header("Content-type:text/html;charset=utf-8");
  134. exit("目录" . $d . "创建失败,请检查权限");
  135. endif;
  136. }
  137. //复制公共模板文件
  138. is_file(PUBLIC_PATH . "success.html") or copy(HDPHP_TPL_PATH . "app_success.html", PUBLIC_PATH . "success.html");
  139. is_file(PUBLIC_PATH . "error.html") or copy(HDPHP_TPL_PATH . "app_error.html", PUBLIC_PATH . "error.html");
  140. //复制配置文件
  141. is_file(CONFIG_PATH . "config.php") or copy(HDPHP_TPL_PATH . "config.php", CONFIG_PATH . "config.php");
  142. is_file(CONFIG_PATH . "event.php") or copy(HDPHP_TPL_PATH . "event.php", CONFIG_PATH . "event.php");
  143. //创建测试控制器
  144. is_file(CONTROL_PATH . 'IndexControl.class.php') or file_put_contents(CONTROL_PATH . 'IndexControl.class.php', file_get_contents(HDPHP_TPL_PATH . 'control_test.php'));
  145. //创建安全文件
  146. self::safeFile();
  147. }
  148. /**
  149. * 创建安全文件
  150. * @access private
  151. * @return void
  152. */
  153. static private function safeFile()
  154. {
  155. if (!defined("DIR_SAFE")) return;
  156. $dirs = array(
  157. COMMON_PATH,
  158. COMMON_CONFIG_PATH,
  159. COMMON_MODEL_PATH,
  160. COMMON_LANGUAGE_PATH,
  161. COMMON_EVENT_PATH,
  162. COMMON_TAG_PATH,
  163. COMMON_LIB_PATH,
  164. APP_PATH,
  165. CONTROL_PATH,
  166. CONFIG_PATH,
  167. LANGUAGE_PATH,
  168. MODEL_PATH,
  169. CONFIG_PATH,
  170. EVENT_PATH,
  171. TAG_PATH,
  172. LIB_PATH,
  173. COMPILE_PATH,
  174. CACHE_PATH,
  175. TABLE_PATH,
  176. LOG_PATH,
  177. TPL_PATH,
  178. PUBLIC_PATH
  179. );
  180. $file = HDPHP_TPL . '/index.html';
  181. foreach ($dirs as $d) {
  182. is_file($d . '/index.html') || copy($file, $d . '/index.html');
  183. }
  184. }
  185. /**
  186. * 编译核心文件
  187. * @access private
  188. */
  189. static private function compile()
  190. {
  191. $boot = TEMP_PATH . TEMP_FILE;
  192. if (DEBUG) {
  193. is_file($boot) and unlink($boot);
  194. return;
  195. }
  196. $compile = '';
  197. //常量编译
  198. $_define = get_defined_constants(true);
  199. foreach ($_define['user'] as $n => $d) {
  200. if ($d == '\\') $d = "'\\\\'";
  201. else $d = is_int($d) ? intval($d) : "'{$d}'";
  202. $compile .= "defined('{$n}') OR define('{$n}',{$d});";
  203. }
  204. $files = array(
  205. HDPHP_CORE_PATH . 'HDPHP.class.php', //HDPHP顶级类
  206. HDPHP_CORE_PATH . 'HdphpException.class.php', //异常处理类
  207. HDPHP_CORE_PATH . 'App.class.php', //HDPHP顶级类
  208. HDPHP_CORE_PATH . 'Route.class.php', //URL处理类
  209. HDPHP_CORE_PATH . 'Log.class.php', //Log日志类
  210. HDPHP_CORE_PATH . 'Event.class.php', //事件处理类
  211. HDPHP_FUNCTION_PATH . 'Functions.php', //应用函数
  212. HDPHP_FUNCTION_PATH . 'Common.php', //公共函数
  213. HDPHP_DRIVER_PATH . 'View/View.class.php', //视图库
  214. HDPHP_DRIVER_PATH . 'View/Hd/Compile.class.php', //模板编译类
  215. );
  216. foreach ($files as $f) {
  217. $con = compress(trim(file_get_contents($f)));
  218. $compile .= substr($con, -2) == '?>' ? trim(substr($con, 5, -2)) : trim(substr($con, 5));
  219. }
  220. $compile .= 'C(' . var_export(C(), true) . ');';
  221. $compile .= 'L(' . var_export(L(), true) . ');';
  222. $compile .= 'alias_import(' . var_export(alias_import(), true) . ');';
  223. self::$_compile = $compile;
  224. }
  225. /**
  226. * 加载应用文件
  227. */
  228. static private function compileAppLib()
  229. {
  230. //自动加载文件列表
  231. $files = C("AUTO_LOAD_FILE");
  232. if (!is_array($files)) {
  233. $files = array_filter(preg_split('@,@i', $files));
  234. }
  235. $compile = '';
  236. if (!empty($files)) {
  237. foreach ($files as $f) {
  238. $f = preg_replace('@\.php@i', '', trim($f)) . '.php';
  239. if (strpos($f, '/') === false)
  240. $f = LIB_PATH . $f;
  241. require_cache($f);
  242. //编译自动加载文件
  243. if (!DEBUG) {
  244. $con = trim(file_get_contents($f));
  245. $compile .= substr($con, -2) == '?>' ? trim(substr($con, 5, -2)) : trim(substr($con, 5));
  246. }
  247. }
  248. }
  249. //DEBUG时删除编译文件
  250. $boot = TEMP_PATH . TEMP_FILE;
  251. if (DEBUG) {
  252. is_file($boot) and unlink($boot);
  253. return;
  254. }
  255. //公共文件编译
  256. $compile = self::$_compile . $compile . 'HDPHP::init();';
  257. //如果网址发生变化,生新生成编译文件
  258. $compile .= 'define("CLEAR_TPL_COMPILE_FILE",strstr(__HOST__,$_SERVER["SERVER_NAME"])==false);';
  259. //编译内容
  260. $compile = '<?php ' . $compile . 'App::run();?>';
  261. //创建编译文件
  262. if (is_dir(TEMP_PATH) or dir_create(TEMP_PATH) and is_writable(TEMP_PATH))
  263. return file_put_contents($boot, compress($compile));
  264. header("Content-type:text/html;charset=utf-8");
  265. exit("<div style='border:solid 1px #dcdcdc;padding:30px;'>目录创建失败,请修改" . realpath(dirname(TEMP_PATH)) . "目录权限</div>");
  266. }
  267. }
  268. ?>