ホームページ >PHPフレームワーク >ThinkPHP >ThinkPHP アプリケーションのパフォーマンスを効果的に向上させるのに役立ちます。
以下は、thinkphp フレームワーク チュートリアルのコラムで、その方法を紹介します。 ThinkPHP アプリケーションのパフォーマンスを効果的に向上させることができます。困っている友人のお役に立てれば幸いです。
アプリケーションのパフォーマンスに関しては、関係する要素が多すぎます。サーバーの最適化とフロントエンドの最適化については、オンラインで多くの記事があるため、ここでは詳しく説明しません。詳細はこちら。この記事では、ThinkPHP 5.1
アプリケーション開発 (特にデプロイメント環境) に関連する可能性のあるパフォーマンスの最適化方法と注意事項を簡単に紹介します。
推奨事項: 「ThinkPHP 5.1 世界初ビデオチュートリアル 」
まず第一に、フレームワークがアプリケーションのパフォーマンスのボトルネックではないこと、アーキテクチャ上のボトルネックではないことを強調しなければなりません。デザイン、データベース、才能はそうです。フレームワークの設計の開始時には、汎用性を高めるため、特定のアプリケーションに対して詳細な最適化は特に実行されませんが、ターゲットを絞ったチューニングを実行するためのいくつかの可能な手段と構成パラメーターが提供されます。最適化とは、開発時の状況に応じて調整できる手段です。
パフォーマンス最適化の正しい手順は、アーキテクチャの最適化、データベースの最適化、コードの最適化です。
アーキテクチャの最適化には、テクノロジー、ストレージ、ネットワーク、サービスの選択とアーキテクチャが含まれます。成熟した最新の開発アーキテクチャと設計パターンを使用するようにしてください。フロントエンドとバックエンドは完全に分離されるように設計されているため、フロントエンドとバックエンドの個別の最適化が容易になり、テストが容易になります。
アプリケーションでパフォーマンスのボトルネックが発生した場合、現時点で考慮する必要があるのは、コード自体の最適化ではなく、アーキテクチャの最適化です。これは、多くの場合、アーキテクチャ レベルでの最適化効果が最も重要であるためです。
デプロイメント環境でデバッグ モードをオフにすることを忘れないでください。これは、パフォーマンスを考慮するだけでなく、セキュリティ上の理由からも当てはまります。実際、展開後に設定ファイルを変更する必要がないように、環境変数を使用してデバッグ モードをオフに設定することをお勧めします。
デバッグ モードはログ情報、追加のデバッグ情報、キャッシュの無効化に影響を与えるため、デバッグ モードをオフにするとパフォーマンスが向上する可能性があります。
マルチモジュール機能を使用すると、ファイルの I/O
オーバーヘッドと追加の設定とチェックが増加します。アプリケーションを計画するときに必要です。 アーキテクチャを設計するときは、単一モジュールの使用を検討してから、コントローラー階層を使用してコントローラーが多すぎる問題を解決してください。
単一モジュールを使用するパフォーマンスの利点は、swoole
にデプロイすると、より完全に反映されます。これは、アプリケーション ファイルがサービスを開始すると、そのファイルがメモリにロードされ、関連するファイルがメモリに読み込まれるためです。モジュールのファイルは、要求されるたびに再ロードされます。
ルーティング ルールを定義するときは、配列を使用せず、ルートを登録するメソッドを使用し、ルーティング グループ (またはリソース ルーティング) をより頻繁に使用するようにしてください。グループ ルーティングによりルート一致の数が減り、ルーティングのパフォーマンスが向上します。複数のドメイン名に異なるルートがある場合は、ドメイン名に基づいたルートを使用することも計画する必要があります。
ルーティングの現在のルートのデータ検証や許可チェックなどの操作を設計してみてください。比較的明確である一方で、検証操作は早い段階で実行できます。コントローラーの実行を待たずに可能です。
グループが多い場合は、ルートの遅延解決を有効にします。
// 开启路由延迟解析 'url_lazy_route' => true,
同じグループに多数のルーティング ルールがある場合は、ルーティング ルールを結合することをお勧めします。
// 合并分组路由规则 'route_rule_merge' => true,
GET リクエストのルーティングでは、ルーティング リクエスト キャッシュを設定できます。
// 定义GET请求路由规则 并设置3600秒的缓存 Route::get('new/:id','News/read')->cache(3600);
導入フェーズでは、ルート キャッシュを有効にすることができます。
// 开启路由缓存(仅部署模式有效) 'route_check_cache' => true,
5. クエリの最適化
まず、良い開発習慣を維持し、Db クラスとモデルの正しい使用姿勢を理解してください。データベース自体のパフォーマンスを最適化するには、次のことができます。 「MySQL パフォーマンスの最適化」を参照してください。ベスト 21 エクスペリエンス。以下は、主にフレームワーク内のデータ クエリに関連する最適化戦略です。
リクエストあたりのクエリの数を減らし、高いリアルタイム パフォーマンスを必要としないデータ クエリのデータ クエリ キャッシュを合理的に計画します (できれば Redis を使用してください)。キャッシュ)。
Blog::where('id', 10) ->cache(30) ->find();
関連クエリを使用する場合、cache メソッドはメイン モデルのデータ キャッシュにのみ使用できますが、Cache クラスの remember メソッドを使用すると便利なデータ キャッシュが可能になります。
$users = Cache::remember('users', function(){ return User::with('profile') ->where('status', 1) ->select();},30);
クエリの数にこだわりすぎないでください
クエリの数を減らそうとするのはパフォーマンス上の理由からですが、必須ではありません。最も少ないクエリが必ずしも最高のパフォーマンスを意味するわけではありません。複雑な JOIN クエリのパフォーマンスは、2 つの単純なクエリほど高くない可能性がありますが、単純なクエリを使用する方が明確で理解しやすく、データ クエリをキャッシュする方が便利です。
不要总是以为模型的性能一定比Db类低,框架的ORM查询设计经过了较为合理的优化,正确使用模型一样可以有出色的性能,而且比Db查询要方便很多。
尤其是对于一些复杂的设计来说使用模型关联显得比直接用Db更加简单,例如使用关联预载入查询就可以避免N+1查询问题。
User::with(['profile','book'])->select();
如果用Db类自己实现的话,费时费力,性能还不一定优。
对于大量数据的处理操作,使用chunk分批处理方法。
User::chunk(100, function($users) { foreach ($users as $user) { // 处理数据 }});
对于内存开销比较大的应用,在做大量数据查询和处理的时候,使用cursor方法,可以利用PHP的生成器特性,减少内存占用。
$cursor = User::cursor();foreach($cursor as $user){ // 处理数据 }
你会发现用户数据不论是1万还是10万级别,内存开销并没有大的变化。
涉及到对大量数据的处理,包括数据迁移、批量更新,尽量使用命令行指令运行,否则会因为超时而中断。
可以通过数据集的方法完成的子集或者排序操作不要再次查询,例如:
// 模型查询返回数据集对象 $users = User::select(); // 按照用户的成绩由高到低排序 $list1 = $users->order('score', 'desc'); // 筛选成绩在90分以上的用户 $list2 = $users->where('score', '>=', 90);
字段缓存
利用下面指令在部署后生成字段缓存,可以减少每次数据表的字段查询开销。
php think optimize:schema
更多用法可以参考官方手册的数据字段缓存。
每次在应用初始化或者模块初始化的时候会有一定的I/O开销,如果已经开启OpCache的话对性能影响甚微,如果比较在意的也可以通过命令行指令生成配置缓存(包括相关的公共文件和各种定义文件)。
生成应用配置缓存:
php think optimize:config
生成模块配置缓存:
php think optimize:config index
注意:一旦配置或者公共文件发生变化,必须重新生成。
类库映射可以提升类库的自动加载性能,使用下面的指令可以生成系统类库和应用类库的类库映射(包括extend目录下的类库)。
php think optimize:autoload
vendor目录下的类库可以使用composer的dump-autoload指令优化加载性能。
composer dump-autoload -o
该命令把 PSR-0 和 PSR-4 转换为一个类映射表,来提高类的加载速度。
以上がThinkPHP アプリケーションのパフォーマンスを効果的に向上させるのに役立ちます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。