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

    // 加载惯例配置文件
    	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();
            }
        }
  • 相关阅读:
    Freefilesync-文件夹自动同步
    考研打卡_Day077
    考研打卡_Day076
    考研打卡_Day075
    考研打卡_Day074
    考研打卡_Day073
    考研打卡_Day072
    考研打卡_Day071
    考研打卡_Day070
    考研打卡_Day069
  • 原文地址:https://www.cnblogs.com/mike1314/p/8548862.html
Copyright © 2020-2023  润新知