Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

194 строки
5.9 KiB

  1. <?php declare(strict_types=1);
  2. namespace Kuxin;
  3. use Kuxin\Helper\Json;
  4. use Kuxin\Helper\Jsonp;
  5. use Kuxin\Helper\Xml;
  6. /**
  7. * Class Kuxin
  8. *
  9. * @package Kuxin
  10. * @author Pakey <pakey@qq.com>
  11. */
  12. class Kuxin
  13. {
  14. /**
  15. *
  16. */
  17. public static function init(): void
  18. {
  19. // 注册AUTOLOAD方法
  20. spl_autoload_register([Loader::class, 'autoload']);
  21. // 注册配置
  22. Config::LoadDir(KX_ROOT . '/app/config');
  23. // 配置错误级别
  24. if (Config::get('app.debug')) {
  25. ini_set('display_errors', 'on');
  26. error_reporting(E_ALL);
  27. } else {
  28. ini_set('display_errors', 'off');
  29. error_reporting(0);
  30. }
  31. //程序关闭
  32. register_shutdown_function([__CLASS__, 'shutdown']);
  33. // 设定错误和异常处理
  34. set_error_handler([__CLASS__, 'error']);
  35. set_exception_handler([__CLASS__, 'exception']);
  36. // 时区
  37. date_default_timezone_set('PRC');
  38. // 记录开始运行时间
  39. Registry::set('_startTime', microtime(true));
  40. // 记录sql执行次数
  41. Registry::set('_sql', []);
  42. Registry::set('_sqlnum', 0);
  43. // 缓存读取次数
  44. Registry::set('_cacheRead', 0);
  45. Registry::set('_cacheHit', 0);
  46. // 缓存写入次数
  47. Registry::set('_cacheWrite', 0);
  48. // 记录内存初始使用
  49. Registry::set('_startUseMems', memory_get_usage());
  50. // 记录网络请求
  51. Registry::set('_http', []);
  52. Registry::set('_httpnum', 0);
  53. // 常量定义
  54. define('KX_VERSION', '3.5.12');
  55. // 加载助手文件
  56. Loader::import(KX_ROOT . '/app/helper.php');
  57. // 加载版本文件
  58. Loader::import(KX_ROOT . '/app/version.php');
  59. }
  60. /**
  61. *
  62. */
  63. public static function start(): void
  64. {
  65. self::init();
  66. Plugin::call('app_start');
  67. if (PHP_SAPI == 'cli') {
  68. Router::cli();
  69. global $argv;
  70. //系统console和用户的走不同的位置
  71. if (in_array(Router::$controller, Router::$selfConsoleClass)) {
  72. $controllerName = 'Kuxin\\Console\\' . Router::$controller;
  73. } else {
  74. $controllerName = 'App\\Console\\' . Router::$controller;
  75. }
  76. unset($argv[0], $argv[1]);
  77. $controller = Loader::instance($controllerName, $argv);
  78. if (!$controller) {
  79. trigger_error('控制器[' . $controllerName . ']不存在', E_USER_ERROR);
  80. }
  81. $actionName = Router::$action;
  82. $controller->init();
  83. if (is_callable([$controller, $actionName])) {
  84. $controller->$actionName();
  85. } else {
  86. trigger_error('控制器[' . $controllerName . ']对应的方法[' . $actionName . ']不存在', E_USER_ERROR);
  87. }
  88. } else {
  89. Router::dispatcher();
  90. $controllerName = 'App\\Controller\\' . Router::$controller;
  91. /** @var \Kuxin\Controller $controller */
  92. $controller = Loader::instance($controllerName);
  93. if (!$controller) {
  94. trigger_error('控制器[' . $controllerName . ']不存在', E_USER_ERROR);
  95. }
  96. $actionName = Router::$action;
  97. $return = $controller->middleware();
  98. if ($return === null) {
  99. if (is_callable([$controller, $actionName])) {
  100. $controller->init();
  101. if (in_array($actionName, $controller->disableActions)) {
  102. trigger_error('控制器[' . $controllerName . ']对应的方法[' . $actionName . ']不允许访问', E_USER_ERROR);
  103. }
  104. $return = $controller->$actionName();
  105. } else {
  106. trigger_error('控制器[' . $controllerName . ']对应的方法[' . $actionName . ']不存在', E_USER_ERROR);
  107. }
  108. }
  109. if (Response::isAutoRender()) {
  110. switch (Response::getType()) {
  111. case 'html':
  112. $body = $return;
  113. break;
  114. case 'json':
  115. $body = Json::encode($return);
  116. break;
  117. case 'jsonp':
  118. $body = Jsonp::encode($return);
  119. break;
  120. case 'xml':
  121. $body = Xml::encode($return);
  122. break;
  123. default:
  124. if (Request::isAjax()) {
  125. Response::setType('json');
  126. $body = Json::encode($return);
  127. } else {
  128. $body = $return;
  129. }
  130. }
  131. } else {
  132. $body = $return;
  133. }
  134. //设置输出内容
  135. Response::setBody($body);
  136. }
  137. }
  138. /**
  139. *
  140. */
  141. public static function shutdown(): void
  142. {
  143. //如果开启日志 则记录日志
  144. if (Config::get('log.power')) {
  145. Log::build();
  146. }
  147. }
  148. /**
  149. * @param \Exception $e
  150. */
  151. public static function exception($e)
  152. {
  153. Response::error($e->getmessage(), $e->getFile(), $e->getLine());
  154. }
  155. /**
  156. * @param $errno
  157. * @param $errstr
  158. * @param $errfile
  159. * @param $errline
  160. */
  161. public static function error($errno, $errstr, $errfile, $errline)
  162. {
  163. switch ($errno) {
  164. case E_ERROR:
  165. case E_PARSE:
  166. case E_CORE_ERROR:
  167. case E_COMPILE_ERROR:
  168. case E_USER_ERROR:
  169. Response::error($errstr, $errfile, $errline);
  170. break;
  171. case E_STRICT:
  172. case E_USER_WARNING:
  173. case E_USER_NOTICE:
  174. default:
  175. break;
  176. }
  177. }
  178. }
  179. include __DIR__ . '/loader.php';
  180. Kuxin::start();