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

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

不言
不言オリジナル
2018-05-07 09:54:211537ブラウズ

この記事では主に 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 を登録します

② システムの名前空間定義を登録します ③ クラス ライブラリ マッピング ファイルをロードします (存在する場合)
④ 存在する場合Composer をインストールし、自動ロード用に Composer を登録します
⑤ Extend 拡張機能ディレクトリを登録します

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

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

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

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

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

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

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

① アプリケーションのシャットダウン メソッド: thinkError::appShutdown

② エラー処理メソッド: thinkError::appError<p></p>③ 例外処理メソッド: thinkError::appExceptionthinkError::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地址,例如:

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

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

http://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 アクセス検出

アプリケーションの初期化が完了すると、PATH_INFO 検出と URL サフィックス検出を含む URL アクセス検出が実行されます。

🎜5.0 URL アクセスは、PATH_INFO モード (互換モードを含む) の URL アドレスである必要があります。例: 🎜🎜http://serverName/index.php/index/index/hello / val/value🎜🎜🎜そのため、環境が通常の URL パラメーター アクセスのみをサポートしている場合は、🎜🎜http://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、应用结束

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

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

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

相关推荐:

ThinkPHP框架中使用Memcached缓存数据的方法

thinkphp框架里用linux的crontab写php的定时脚本

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

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