ホームページ  >  記事  >  バックエンド開発  >  thinkPHP5.0フレームワークアプリケーション実装のリクエストライフサイクルの詳細な分析

thinkPHP5.0フレームワークアプリケーション実装のリクエストライフサイクルの詳細な分析

黄舟
黄舟オリジナル
2017-03-27 09:24:591855ブラウズ

この記事では主に thinkPHP5.0 フレームワーク アプリケーション リクエストライフ サイクル を紹介し、thinkPHP5.0 フレームワーク アプリケーション リクエスト ライフサイクルに含まれるさまざまな実行プロセスをより詳細に分析します。必要な方はこの例を参照してください。記事

thinkPHP5.0 フレームワーク アプリケーションのリクエストのライフサイクルについて説明します。参考までに皆さんと共有してください。詳細は次のとおりです:

この記事では、開発者が実行プロセス全体を理解できるように、ThinkPHP5.0 のアプリケーション リクエストのライフ サイクルについて一般的に紹介します。

1. エントリーファイル

ユーザーによって開始されたリクエストは、アプリケーションのエントリーファイル (通常は public/index.php ファイル) を通過します。もちろん、新しいエントリ ファイルを変更または追加することもできます。

通常、エントリーファイルのコードは比較的単純です。一般的なエントリーファイルのコードは次のとおりです。

// 应用入口文件
// 定义项目路径
define('APP_PATH', DIR . '/../application/');
// 加载框架引导文件
require DIR . '/../thinkphp/start.php';

一般的なエントリーファイルには主にいくつかの定数が定義されています。サポートされている定数については、以降のコンテンツまたは付録を参照してください。

一般に、アプリケーション エントリ ファイルにあまり多くのコード、特にビジネス ロジックに関連するコードを追加することはお勧めしません。

2. ブート ファイル

次のステップは、実行フレームワークのブート ファイルです。start.php ファイルは、システムのデフォルトのブート ファイルです。ブートファイルでは、次の操作が順番に実行されます:

① システム定数定義のロード;
③ 自動ロードメカニズムの登録;
⑤ ロード従来の設定ファイル;
⑥ アプリケーションを実行します;

アプリケーションエントリファイルでデフォルトのブートファイルが変更された場合、上記の実行プロセスはそれに応じて変更される可能性があります。

3. 自動ロードの登録

このステップが完了すると、システムは Loader::register() メソッドを呼び出して、仕様に準拠するすべての

クラス ライブラリ

を登録します。 Composer がロードに依存するパーティ クラス ライブラリ) は自動的にロードされます。 システムの自動読み込みは 2 つの部分で構成されます:

① 登録システムの自動読み込みメソッド thinkLoader::autoload

② 登録システム namespace
定義③ クラス ライブラリ マッピング ファイルを読み込みます (存在する場合) )④ Composer がインストールされている場合は、Composer を自動ロード用に登録します


クラス ライブラリの自動ロード検出シーケンスは次のとおりです:

① クラス ライブラリ マッピングを定義するかどうか

② PSR-4 自動ロード検出;

③ PSR-0 自動ロード検出;

クラス ライブラリ マッピングを定義する方法が最も効率的であることがわかります。

4. エラーと例外のメカニズムを登録する

Error::register() を実行して、エラーと例外の処理メカニズムを登録します。

は 3 つの部分で構成されます:

① アプリケーションのシャットダウン メソッド: thinkError::appShutdown<p></p>エラー処理メソッド: thinkError::appError③ 例外処理メソッド: thinkError::appException

thinkError::appShutdown<br>错误处理方法:thinkError::appError<br>③ 异常处理方法:thinkError::appException

注册应用关闭方法是为了便于拦截一些系统错误。

在整个应用请求的生命周期过程中,如果抛出了异常或者严重错误,均会导致应用提前结束,并响应输出异常和错误信息

5、应用初始化

执行应用的第一步操作就是对应用进行初始化,包括:

加载应用(公共)配置;
加载应用状态配置;
加载别名定义;
加载行为定义;
加载公共(函数)文件;
加载扩展配置文件(由extra_config_list定义);
加载扩展函数文件(由extra_file_list定义);
设置默认时区;
加载系统语言包;

6、URL访问检测

应用初始化完成后,就会进行URL的访问检测,包括PATH_INFO检测和URL后缀检测。

5.0的URL访问必须是PATH_INFO方式(包括兼容方式)的URL地址,例如:

serverName/index.php/index/index/hello/val/value

所以,如果你的环境只能支持普通方式的URL参数访问,那么必须使用

serverName/index.php?s=/index/index/hello&val=value

如果是命令行下面访问入口文件的话,则通过

$php index.php index/index/hello/val/value...

获取到正常的$_SERVER['PATH_INFO']アプリケーションのシャットダウンメソッドの登録は、何らかのシステムの傍受を容易にするためです。エラー。

アプリケーション リクエストのライフ サイクル全体で、例外または重大なエラーがスローされた場合、アプリケーションは早期に終了し、出力例外と エラー メッセージ

5. アプリケーションの初期化

🎜🎜アプリケーションを実行する最初のステップは、以下を含むアプリケーションの初期化です。🎜アプリケーションのステータス設定をロードします。 ;🎜パブリック (関数) ファイルをロードする;🎜拡張設定ファイル (extra_config_list で定義される) をロードする;🎜拡張機能ファイル (extra_file_list で定義される) をロードする;🎜デフォルトのタイムゾーンを設定する;🎜システム言語パックをロードする;🎜🎜🎜🎜6, URL アクセス検出🎜🎜🎜アプリケーションの初期化後、URL アクセス検出が行われます。 PATH_INFO 検出と URL サフィックス検出を含みます。 🎜🎜5.0 URL アクセスは、PATH_INFO モード (互換モードを含む) の URL アドレスである必要があります。例: 🎜🎜serverName/index.php/index/index/hello/val/value 🎜 🎜🎜そのため、環境が通常の URL パラメーター アクセスのみをサポートしている場合は、 🎜🎜serverName/index.php?s=/index/index/hello&val=value を使用する必要があります 🎜🎜 🎜コマンドラインからエントリーファイルにアクセスする場合、🎜🎜$phpindex.phpindex/index/hello/val/value...🎜🎜 $ を通じて通常の を取得できます。 _SERVER['PATH_INFO'] パラメータを確認してから続行してください。 🎜🎜🎜7. ルート検出🎜🎜🎜 url_route_on パラメーターが有効な場合、URL ルート検出が最初に実行されます。 🎜

如果一旦检测到匹配的路由,根据定义的路由地址会注册到相应的URL调度。

5.0的路由地址支持如下方式:

路由到模块/控制器/操作;
路由到外部重定向地址;
路由到控制器方法;
路由到闭包函数;
路由到类的方法;

路由地址可能会受域名绑定的影响。

如果关闭路由或者路由检测无效则进行默认的模块/控制器/操作的分析识别。

如果在应用初始化的时候指定了应用调度方式,那么路由检测是可选的。

可以使用 \think\App::dispatch() 进行应用调度。

8、分发请求

在完成了URL检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要的一个环节。

在这一步骤中,完成应用的业务逻辑及数据返回。

建议统一使用return返回数据,而不是echo输出,如非必要,请不要执行exit中断。

直接echo输出的数据将无法进行自动转换响应输出的便利。

下面是系统支持的分发请求机制,可以根据情况选择:

模块/控制器/操作

这是默认的分发请求机制,系统会根据URL或者路由地址来判断当前请求的模块、控制器和操作名,并自动调用相应的访问控制器类,执行操作对应的方法。

该机制下面,首先会判断当前模块,并进行模块的初始化操作(和应用的初始化操作类似),模块的配置参数会覆盖应用的尚未生效的配置参数。

支持模块映射、URL参数绑定到方法,以及操作绑定到类等一些功能。

控制器方法

和前一种方式类似,只是无需判断模块、控制器和操作,直接分发请求到一个指定的控制器类的方法,因此没有进行模块的初始化操作。

外部重定向

可以直接分发请求到一个外部的重定向地址,支持指定重定向代码,默认为301重定向。

闭包函数

路由地址定义的时候可以直接采用闭包函数,完成一些相对简单的逻辑操作和输出。

类的方法

除了以上方式外,还支持分发请求到类的方法,包括:
静态方法: 

&#39;blog/:id&#39;=>&#39;\org\util\Blog::read&#39;

类的方法:

&#39;blog/:id&#39;=>&#39;\app\index\controller\Blog@read&#39;

9、响应输出

控制器的所有操作方法都是return返回而不是直接输出,系统会调用Response::send方法将最终的应用返回的数据输出到页面或者客户端,并自动转换成default_return_type参数配置的格式。所以,应用执行的数据输出只需要返回一个正常的PHP数据即可。

10、应用结束

事实上,在应用的数据响应输出之后,应用并没真正的结束,系统会在应用输出或者中断后进行日志保存写入操作。

系统的日志包括用户调试输出的和系统自动生成的日志,统一会在应用结束的时候进行写入操作。

而日志的写入操作受日志初始化的影响。

以上がthinkPHP5.0フレームワークアプリケーション実装のリクエストライフサイクルの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。