<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] * * * * * ## 1 本節是應用啟動文件(/thinkphp/library/think/App.php)的其他靜態方法分析 **self::initModule()** ~~~ private static function initModule($module, $config) { $module = (COMMON_MODULE == $module || !APP_MULTI_MODULE) ? '' : $module . DS; if (is_file(APP_PATH . $module . 'init' . EXT)) { include APP_PATH . $module . 'init' . EXT; } else { $path = APP_PATH . $module; $config = Config::load(APP_PATH . $module . 'config' . EXT); if ($config['app_status']) { $config = Config::load(APP_PATH . $module . $config['app_status'] . EXT); } if ($config['extra_config_list']) { foreach ($config['extra_config_list'] as $name => $file) { $file = strpos($file, '.') ? $file : $path . $file . EXT; Config::load($file, is_string($name) ? $name : pathinfo($file, PATHINFO_FILENAME)); } } if (is_file($path . 'alias' . EXT)) { Loader::addMap(include $path . 'alias' . EXT); } if (APP_HOOK && is_file($path . 'tags' . EXT)) { Hook::import(include $path . 'tags' . EXT); } if (is_file($path . 'common' . EXT)) { include $path . 'common' . EXT; } if ($config['lang_switch_on'] && $module) { Lang::load($path . 'lang' . DS . LANG_SET . EXT); } } } ~~~ **self::initModule()源碼分析** `$module = (COMMON_MODULE == $module || !APP_MULTI_MODULE) ? '' : $module . DS;` 模塊目錄名稱獲取 ~~~ if (is_file(APP_PATH . $module . 'init' . EXT)) { include APP_PATH . $module . 'init' . EXT; } ~~~ 檢查是否存在模塊對應的初始化入口文件init.php,見使用范例 模塊開發 ~~~ $path = APP_PATH . $module; $config = Config::load(APP_PATH . $module . 'config' . EXT); ~~~ 加載模塊的配置文件 見使用范例 模塊開發 ~~~ if ($config['app_status']) { $config = Config::load(APP_PATH . $module . $config['app_status'] . EXT); } ~~~ 加載模塊狀態配置文件 見使用范例 模塊開發 ~~~ if ($config['extra_config_list']) { foreach ($config['extra_config_list'] as $name => $file) { $file = strpos($file, '.') ? $file : $path . $file . EXT; Config::load($file, is_string($name) ? $name : pathinfo($file, PATHINFO_FILENAME)); } } ~~~ 加載模塊擴展配置文件 見使用范例模塊開發 ~~~ if (is_file($path . 'alias' . EXT)) { Loader::addMap(include $path . 'alias' . EXT); } ~~~ 加載模塊別名配置文件 見使用范例模塊開發 ~~~ if (APP_HOOK && is_file($path . 'tags' . EXT)) { Hook::import(include $path . 'tags' . EXT); } ~~~ 加載模塊行為擴展文件 見使用范例模塊開發 ~~~ if (is_file($path . 'common' . EXT)) { include $path . 'common' . EXT; } ~~~ 加載模塊公共函數文件 見使用范例模塊開發 ~~~ if ($config['lang_switch_on'] && $module) { Lang::load($path . 'lang' . DS . LANG_SET . EXT); } ~~~ 加載模塊語言包文件 見使用范例模塊開發 * * * * * * * * * * **2 self::parsePathinfo()源代碼** ~~~ private static function parsePathinfo(array $config) { if (isset($_GET[$config['var_pathinfo']])) { $_SERVER['PATH_INFO'] = $_GET[$config['var_pathinfo']]; unset($_GET[$config['var_pathinfo']]); } elseif (IS_CLI) { // CLI模式下 index.php module/controller/action/params/... $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; } APP_HOOK && Hook::listen('path_info'); if (!isset($_SERVER['PATH_INFO'])) { foreach ($config['pathinfo_fetch'] as $type) { if (!empty($_SERVER[$type])) { $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; break; } } } } ~~~ **self::parsePathinfo()源代碼分析** ~~~ if (isset($_GET[$config['var_pathinfo']])) { $_SERVER['PATH_INFO'] = $_GET[$config['var_pathinfo']]; unset($_GET[$config['var_pathinfo']]); } elseif (IS_CLI) { // CLI模式下 index.php module/controller/action/params/... $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; } ~~~ 檢查$_GET參數是否包含$config配置的兼容模式參數, 兼容模式參數見附:全局配置文件 如果有 設置$_SERVER['PATH_INFO']為$_GET中兼容模式參數對應的參數的值 并刪除$_GET兼容模式參數 如果沒有檢查模式檢查 檢查是否是CLI模式 然后設置$_SERVER['PATH_INFO']為CLI的$_SERVER['argv'][1]參數 這里的PATH_INFO其實就是調用的文件名稱與參數 ` APP_HOOK && Hook::listen('path_info');` path_info分析回調 ~~~ if (!isset($_SERVER['PATH_INFO'])) { foreach ($config['pathinfo_fetch'] as $type) { if (!empty($_SERVER[$type])) { $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; break; } } } ~~~ 如果上面獲取PATH_INFO失敗 那么從配置信息$config['pathinfp_fetch']中依次讀取PATH_INFP信息 經過上面調用獲取了全局變量$_SERVER['PATH_INFO']的值,這個值在下面的self::route()中會用到 * * * * * * * * * * **3 self::route()源代碼** ~~~ public static function route(array $config) { self::parsePathinfo($config); if (empty($_SERVER['PATH_INFO'])) { $_SERVER['PATH_INFO'] = ''; define('__INFO__', ''); define('__EXT__', ''); } else { $_SERVER['PATH_INFO'] = trim($_SERVER['PATH_INFO'], '/'); define('__INFO__', $_SERVER['PATH_INFO']); define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'], PATHINFO_EXTENSION))); if ($config['url_deny_suffix'] && preg_match('/\.(' . $config['url_deny_suffix'] . ')$/i', __INFO__)) { throw new Exception('url suffix deny'); } $_SERVER['PATH_INFO'] = preg_replace($config['url_html_suffix'] ? '/\.(' . trim($config['url_html_suffix'], '.') . ')$/i' : '/\.' . __EXT__ . '$/i', '', __INFO__); } $depr = $config['pathinfo_depr']; $result = false; if (APP_ROUTE_ON && !empty($config['url_route_on'])) { if (!empty($config['route'])) { Route::register($config['route']); } $result = Route::check($_SERVER['PATH_INFO'], $depr, !IS_CLI ? $config['url_domain_deploy'] : false); if (APP_ROUTE_MUST && false === $result && $config['url_route_must']) { throw new Exception('route not define '); } } if (false === $result) { $result = Route::parseUrl($_SERVER['PATH_INFO'], $depr); } self::dispatch($result); } ~~~ **self::route()源代碼分析** `self::parsePathinfo($config);` 調用上面的self::parsePathinfo()獲取$_SERVER['PATH_INFO']的值 ~~~ $_SERVER['PATH_INFO'] = ''; define('__INFO__', ''); define('__EXT__', ''); ~~~ 如果$_SERVER['PATH_INFO']為空 設置`__INFO__ __EXT__`全局變量為空 ~~~ $_SERVER['PATH_INFO'] = trim($_SERVER['PATH_INFO'], '/'); define('__INFO__', $_SERVER['PATH_INFO']); define('__EXT__', strtolower(pathinfo($_SERVER['PATH_INFO'], PATHINFO_EXTENSION))); if ($config['url_deny_suffix'] && preg_match('/\.(' . $config['url_deny_suffix'] . ')$/i', __INFO__)) { throw new Exception('url suffix deny'); } $_SERVER['PATH_INFO'] = preg_replace($config['url_html_suffix'] ? '/\.(' . trim($config['url_html_suffix'], '.') . ')$/i' : '/\.' . __EXT__ . '$/i', '', __INFO__); ~~~ 如果$_SERVER['PATH_INFO']為空 設置`__INFO__ __EXT__`為$_SERVER['PATH_INFO']的相應值。 并檢查是否禁用相應的后綴請求 見使用范例 禁用URL后綴 接著去除正常的Url后綴???待分析 `$depr = $config['pathinfo_depr'];` 獲取配置的pathinfo_depr, ~~~ if (APP_ROUTE_ON && !empty($config['url_route_on'])) { } ~~~ 檢查全局變量APP_ROUTE_ON 是否開啟路由檢測 全局變量設置見 [附:全局變量文件](http://www.hmoore.net/zmwtp/tp5/119430) 如果開啟 ~~~ if (!empty($config['route'])) { Route::register($config['route']); } ~~~ 將配置中的路由添加到全局路由定義 全局路由定義見 [附:全局路由文件](http://www.hmoore.net/zmwtp/tp5/119438) `$result = Route::check($_SERVER['PATH_INFO'], $depr, !IS_CLI ? $config['url_domain_deploy'] : false);` 檢查路由 ???待分析 ~~~ if (APP_ROUTE_MUST && false === $result && $config['url_route_must']) { throw new Exception('route not define '); } ~~~ 路由檢測結果分析 ~~~ if (false === $result) { $result = Route::parseUrl($_SERVER['PATH_INFO'], $depr); } ~~~ 路由url分析 見 [附:全局路由文件](http://www.hmoore.net/zmwtp/tp5/119438) `self::dispatch($result);` 注冊路由分析結果到app調度類型$dispatch 調度類型的使用見 [應用調度分析](http://www.hmoore.net/zmwtp/tp5/119428) ## 3 總結 **initModule() 模塊的初始化實現** 在系統主流程App::run()中有兩處調用, 一處是App::run()剛開始總的公共模塊初始化 self::initModule(COMMON_MODULE,Config::get()) 一處是App::module()中的應用模塊初始化 self::initModule(MODULE_NAME, $config); **parsePathinfo() 獲取請求信息** **route() 根據請求信息進行路由分派** 其他的函數包括 run() 應用啟動流程 見 [應用啟動文件](http://www.hmoore.net/zmwtp/tp5/119426) invokeFunction() 調度回調函數 見 [應用調度分析](http://www.hmoore.net/zmwtp/tp5/119428) invokeMethod() 調度回調方法 見 [應用調度分析](http://www.hmoore.net/zmwtp/tp5/119428) bindParams() 調度參數合成 見 [應用調度分析](http://www.hmoore.net/zmwtp/tp5/119428) module() 調度回調模塊 見 [應用調度分析](http://www.hmoore.net/zmwtp/tp5/119428) dispathc() 調度注冊見[應用調度分析](http://www.hmoore.net/zmwtp/tp5/119428)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看