thinkphp5.0框架运行机制分享小结

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常量中

// 加载惯例配置文件
\think\Config::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();
        }
    }

 

posted @ 2018-03-12 16:21  坚持奔跑在路上  阅读(341)  评论(0编辑  收藏  举报