1 访问index.php 入口文件,定义应用目录,加载框架引导文件
<?php // [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php';
2 加载base基础文件,定义目录常量环境常量,加载loader类,注册自动加载,注册错误和异常处理机制,加载惯例配置文件
2.1 注册自动加载机制
public static function register($autoload = '') { // 注册系统自动加载 spl_autoload_register($autoload ?: 'think\Loader::autoload', true, true); // 注册命名空间定义 self::addNamespace([ 'think' => LIB_PATH . 'think' . DS, 'behavior' => LIB_PATH . 'behavior' . DS, 'traits' => LIB_PATH . 'traits' . DS, ]); // 加载类库映射文件 if (is_file(RUNTIME_PATH . 'classmap' . EXT)) { self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT)); } // Composer自动加载支持 if (is_dir(VENDOR_PATH . 'composer')) { self::registerComposerLoader(); } // 自动加载extend目录 self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS); }
备注:spl_autoload_register
2.2 注册错误和异常处理机制
/** * 注册异常处理 * @return void */ public static function register() { error_reporting(E_ALL); // 设置函数允许错误报告的等级 error_reporting 0 关闭 E_ERROR | E_WARNING | E_PARSE 分别为错误 警告 解析错误 E_ALL 报告所有错误 set_error_handler([__CLASS__, 'appError']); //设置用户自定义的错误处理函数 set_exception_handler([__CLASS__, 'appException']); //设置用户自定义的异常处理函数 register_shutdown_function([__CLASS__, 'appShutdown']); //注册一个会在php中止时执行的函数 }
2.3 加载惯例配置文件
将convention文件中的的配置保存在已数组的形式$config常量中
// 加载惯例配置文件 hinkConfig::set(include THINK_PATH . 'convention' . EXT);
2.4执行应用
// 执行应用 App::run()->send();
/** * 发送数据到客户端 * @access public * @return mixed * @throws InvalidArgumentException */ public function send() { // 监听response_send Hook::listen('response_send', $this); // 处理输出数据 $data = $this->getContent(); // Trace调试注入 if (Env::get('app_trace', Config::get('app_trace'))) { Debug::inject($this, $data); } if (200 == $this->code) { $cache = Request::instance()->getCache(); if ($cache) { $this->header['Cache-Control'] = 'max-age=' . $cache[1] . ',must-revalidate'; $this->header['Last-Modified'] = gmdate('D, d M Y H:i:s') . ' GMT'; $this->header['Expires'] = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT'; Cache::tag($cache[2])->set($cache[0], [$data, $this->header], $cache[1]); } } if (!headers_sent() && !empty($this->header)) { // 发送状态码 http_response_code($this->code); // 发送头部信息 foreach ($this->header as $name => $val) { if (is_null($val)) { header($name); } else { header($name . ':' . $val); } } } echo $data; if (function_exists('fastcgi_finish_request')) { // 提高页面响应 fastcgi_finish_request(); } // 监听response_end Hook::listen('response_end', $this); // 清空当次请求有效的数据 if (!($this instanceof RedirectResponse)) { Session::flush(); } }