その後のまとめです。チューニングプロセスで多くの落とし穴を経験した後、最終的に予備的なパフォーマンステスト計画を完成させて実装し、実際のテストデータを通じてLaravel開発プロセスにおけるいくつかの実践的なスキルを要約しました。
最近、同僚は、Laravelで書かれたアプリケーションの応答が少し遅く、20を超える同時アプリケーションがCPUをいっぱいにしていると報告しました...遅い問題を解決するために、いくつかのインターフェイスはnodejsで書かれています。
そして私の最初の反応は、人気のあるフレームワークがどうしてこんなにひどいものになるのだろうかということでした。使い方に何か問題があるはずです。それを知るために、私は Laravel アプリケーションのパフォーマンス調整の旅を始めました。
このパフォーマンス テスト計画で使用される最適化のヒントは、主に Laravel フレームワーク自体とそれが提供するツールに基づいています。
アプリケーションのデバッグをオフにする app.debug=false
app.debug=false
缓存配置信息 php artisan config:cache
缓存路由信息 php artisan router:cache
类映射加载优化 php artisan optimize
自动加载优化 composer dumpautoload
根据需要只加载必要的中间件
使用即时编译器(JIT),如:HHVM、OPcache
使用 PHP 7.x
除了以上优化技巧之外,还有很多编码上的实践可以提升 Laravel 应用性能,在本文中暂时不会做说明。(也可以关注我的后续文章)
打开应用根目录下的 .env 文件,把 debug 设置为 false。
APP_DEBUG=false
php artisan config:cache
运行以上命令可以把 config 文件夹里所有配置信息合并到一个 bootstrap/cache/config.php
文件中,减少运行时载入文件的数量。
php artisan config:clear
运行以上命令可以清除配置信息的缓存,也就是删除 bootstrap/cache/config.php
文件
php artisan route:cache
运行以上命令会生成文件 bootstrap/cache/routes.php
。路由缓存可以有效的提高路由器的注册效率,在大型应用程序中效果越加明显。
php artisan route:clear
运行以上命令会清除路由缓存,也就是删除 bootstrap/cache/routes.php
文件。
php artisan optimize --force
运行以上命令能够把常用加载的类合并到一个文件中,通过减少文件的加载来提高运行效率。这个命令会生成 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
两个文件。
通过修改 config/compile.php
文件可以添加要合并的类。
在生产环境中不需要指定 --force
参数文件也可以自动生成。
php artisan clear-compiled
运行以上命令会清除类映射加载优化,也就是删除 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
两个文件。
composer dumpautoload -o
Laravel 应用程序是使用 composer 来构建的。这个命令会把 PSR-0 和 PSR-4 转换为一个类映射表来提高类的加载速度。
注意:
php artisan optimize --force
命令里已经做了这个操作。
Laravel 应用程序内置了并开启了很多的中间件。每一个 Laravel 的请求都会加载相关的中间件、产生各种数据。在 app/Http/Kernel.php
中注释掉不需要的中间件(如 session 支持)可以极大的提升性能。
HHVM 和 OPcache 都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高 50% 或者更高的性能。
只能说 PHP 7.x 比起之前的版本在性能上有了极大的提升。
嗯,限于你的真实企业环境,这个也许很长时间内改变不了,算我没说。
我们使用简单的 Apache ab 命令仅对应用入口文件进行测试,并记录和分析数据。
仅对应用的入口文件 index.php 进行测试,访问 “/” 或者 “/index.php” 返回框架的欢迎页面。更全面的性能测试需要针对应用的更多接口进行测试。
使用 Apache ab 命令。ab -t 10 -c 10 {url}
phpArtisan config:cache
🎜🎜キャッシュルーティング情報 php職人ルーター:キャッシュ
🎜🎜🎜🎜クラスマップ読み込みの最適化php職人最適化
🎜🎜🎜🎜自動読み込みの最適化composer dumpautoload
🎜🎜🎜🎜あるものだけを読み込みます必要に応じて必要 ミドルウェア 🎜🎜🎜🎜 は、HHVM、OPcache などのジャストインタイム コンパイラ (JIT) を使用します 🎜🎜🎜🎜 PHP 7.x を使用します🎜🎜bootstrap/cache/config.php
ファイルにマージされ、実行する必要がある時点でロードされるファイルの数。 🎜rrreee🎜上記のコマンドを実行して、構成情報のキャッシュをクリアします。つまり、bootstrap/cache/config.php
ファイルを削除します🎜bootstrap/cache/routes.php
を生成します。ルート キャッシュはルーターの登録効率を効果的に向上させることができ、その効果は大規模なアプリケーションでより顕著になります。 🎜rrreee🎜上記のコマンドを実行すると、ルーティング キャッシュがクリアされます。これは、bootstrap/cache/routes.php
ファイルを削除することを意味します。 🎜bootstrap/cache/compiled.php
と bootstrap/cache/services.json
の 2 つのファイルを生成します。 🎜🎜 config/compile.php
ファイルを変更することで、マージするクラスを追加できます。 🎜🎜本番環境では、--force
パラメータ ファイルを指定する必要はなく、自動的に生成できます。 🎜rrreee🎜上記のコマンドを実行すると、クラス マップの読み込みの最適化がクリアされます。つまり、2 つのファイル bootstrap/cache/compiled.php
と bootstrap/cache/services.json
が削除されます。 >。 🎜🎜注: この操作は、phpArtisanoptimize --force
コマンドですでに実行されています。 🎜
app/Http/Kernel.php
内の不要なミドルウェア (セッション サポートなど) をコメント アウトすると、パフォーマンスが大幅に向上する可能性があります。 🎜🎜 まあ、実際の企業環境に限定すると、これは長い間変わらないかもしれませんが、私はそれについては触れませんでした。 🎜🎜0x02 テスト計画🎜🎜 シンプルな Apache ab コマンドを使用して、アプリケーション エントリ ファイルのみをテストし、データを記録して分析します。 🎜🎜🎜🎜アプリケーションのエントリファイルindex.phpのみをテストします。「/」または「/index.php」にアクセスして、フレームワークのようこそページに戻ります。より包括的なパフォーマンス テストには、アプリケーションのより多くのインターフェイスのテストが必要です。 🎜🎜🎜🎜Apache abコマンドを使用します。
ab -t 10 -c 10 {url}
。このコマンドは、URL に対する 10 個のリクエストを同時に開始し、10 秒間継続することを意味します。コマンド内の特定のパラメーター設定は、テストするサーバーのパフォーマンスに基づいて選択する必要があります。 🎜🎜🎜🎜マシンの変動によるデータエラーを回避するため、各テスト条件では複数のabコマンドを実行してコマンドの実行結果を記録し、1秒あたりに処理されるリクエストの数とリクエストの応答時間に焦点を当て、異常値を分析して排除します。 🎜テスト条件を調整するたびに、ブラウザでようこそページにアクセスし、テスト条件の変更によるアクセスエラーがないことを確認する必要があります。ページアクセスエラーが発生すると、テスト結果が不正確になります。
サーバー環境の説明
特定の環境から分離されたテストデータはすべて無意味であり、同様の条件でのみ比較できます。
この環境は、8G メモリ、2.8GHz プロセッサ、SSD ハードドライブを搭載した Mac 上で実行されます。
テストサーバーはHomesteadを使用して構築されています。仮想マシンはシングルコア CPU と 2G メモリで構成されています。
サーバーの PHP バージョンは 7.1 です。指定しない場合、OPcache がオンになります。
テストされた Laravel アプリケーションはバージョン 5.2 で作成されました。 appHttproutes.php
には 85 個のルートが定義されています。 appHttproutes.php
中定义了 85 个路由。
测试过程中除了虚拟机、终端及固定的浏览器窗口外,没有会影响机器的程序运行。
以上的数据,大家在自己进行测试时可以参考。
按照以下检查项执行相应的操作。
运行 ab -t 10 -c 10 http://myurl.com/index.php
基础检查项
.env 文件中 APP_DEBUG=true
不存在 bootstrap/cache/config.php
不存在 bootstrap/cache/routes.php
不存在 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
app/Http/Kernel.php
中开启了大部分的中间件
浏览器访问 Laravel 应用程序欢迎页确保正常访问
在步骤 1 基础上修改 .env 文件中 APP_DEBUG=false
。
浏览器访问 Laravel 应用程序欢迎页确保正常访问。
运行 ab -t 10 -c 10 http://myurl.com/index.php
。
与步骤 1 结果比较发现:关闭应用 debug 之后,每秒处理请求数从 26-34 上升到 33-35,请求响应时间从 大部分 300ms 以上下降到 290ms 左右,效果不太明显,但确实有一定的提升。
注意:这部分与应用中的日志等使用情况有比较大的关联。
在步骤 2 基础上,运行 php artisan config:cache
,确认生成 bootstrap/cache/config.php
。
浏览器访问 Laravel 应用程序欢迎页确保正常访问。
运行 ab -t 10 -c 10 http://myurl.com/index.php
。
与步骤 2 结果比较发现:开启配置信息缓存之后,每秒处理请求数从 33-35 上升到 36-38,请求响应时间从 290ms 左右下降到 260ms 左右,效果不太明显,但确实有一定的提升。
在步骤 3 基础上,运行 php artisan route:cache
,确认生成 bootstrap/cache/routes.php
。
浏览器访问 Laravel 应用程序欢迎页确保正常访问。
运行 ab -t 10 -c 10 http://myurl.com/index.php
。
与步骤 3 结果比较发现:开启路由信息缓存之后,每秒处理请求数从 36-38 上升到 60 左右,请求响应时间从 260ms 下降到 160ms 左右,效果显著,从 TPS 看,提升了 70%。
在步骤 4 基础上,注释掉不必要的中间件代码。
浏览器访问 Laravel 应用程序欢迎页确保正常访问。
运行 ab -t 10 -c 10 http://myurl.com/index.php
ab -t 10 -c 10 http://myurl.com/index.php
🎜🎜APP_DEBUG=true
🎜🎜🎜🎜 は 🎜🎜.env ファイルに存在しませんbootstrap/cache/config.php
🎜🎜🎜🎜 は存在しません bootstrap/cache/routes.php
🎜🎜🎜🎜 は存在しませんbootstrap/cache/compiled.php
と bootstrap/cache/services.json
🎜🎜🎜🎜 ほとんどのミドルウェアは app/Http/Kernel.php
で有効になります🎜🎜🎜🎜 通常のアクセスを確保するには、ブラウザで Laravel アプリケーションのようこそページにアクセスしてください🎜🎜 ベースの .env ファイルを変更します。ステップ 1 で APP_DEBUG=false
。 🎜🎜🎜🎜通常のアクセスを確認するには、ブラウザで Laravel アプリケーションのようこそページにアクセスしてください。 🎜🎜🎜🎜ab -t 10 -c 10 http://myurl.com/index.php
を実行します。 🎜🎜🎜注: この部分は、アプリケーションでのログの使用法と密接に関連しています。 🎜
を実行します。 php 職人 config:cache
、bootstrap/cache/config.php
が生成されることを確認します。 🎜🎜🎜🎜通常のアクセスを確認するには、ブラウザで Laravel アプリケーションのようこそページにアクセスしてください。 🎜🎜🎜🎜ab -t 10 -c 10 http://myurl.com/index.php
を実行します。 🎜🎜phpArtisan を実行します。 Route:cache
で、bootstrap/cache/routes.php
が生成されることを確認します。 🎜🎜🎜🎜通常のアクセスを確認するには、ブラウザで Laravel アプリケーションのようこそページにアクセスしてください。 🎜🎜🎜🎜ab -t 10 -c 10 http://myurl.com/index.php
を実行します。 🎜🎜ab -t 10 -c 10 http://myurl.com/index.php
を実行します。 🎜
注: このテストではすべてのミドルウェアをコメントアウトしました。実際の状況では、必要なミドルウェアのみを保持するように努める必要があります。
ステップ4の結果と比較すると、不要なミドルウェアを削除した後、1秒あたりのリクエスト処理数が約60から約60に増加したことがわかります。リクエストの応答時間は 160 ミリ秒から約 110 ミリ秒になり、TPS の観点からは、その効果は 50% 増加しました。
6. クラスマップ読み込みの最適化をオンにする6.1 操作phpArtisanoptimize --force
を実行し、bootstrap/cache/compiled が有効になっていることを確認します。 php
と bootstrap/cache/services.json
が生成されます。 php artisan optimize --force
,确认生成 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
。
浏览器访问 Laravel 应用程序欢迎页确保正常访问。
运行 ab -t 10 -c 10 http://myurl.com/index.php
。
与步骤 5 结果比较发现:做了类映射加载优化之后,每秒处理请求数从 90 上升到 110,请求响应时间从 110ms 下降到 100ms 以下,效果还是比较明显的。
在步骤 6 基础上,关闭 PHP 的 OPcache,并重启服务器。通过 phpinfo() 的 Zend OPcache 确认 OPcache 已经关闭。
浏览器访问 Laravel 应用程序欢迎页确保正常访问。
运行 ab -t 10 -c 10 http://myurl.com/index.php
。
与步骤 6 结果比较发现:关闭 OPcache 之后,每秒处理请求数从 110 下降到 15,请求响应时间从 100ms 以下上升到 650ms 以上。开启与关闭 OPcache,数据上竟有几倍的差别。
此后,我重新开启了 PHP 的 OPcache,数据恢复到步骤 6 水平。
在运行 php artisan route:cache
命令时报这个错误。
原因:路由文件中处理“/”时使用了闭包的方式。要运行该命令,路由的具体实现不能使用闭包方式。
修改方案:将路由的具体实现放到控制器中来实现。
在运行 php artisan route:cache
命令时报这个错误。
原因:路由文件中定义了重复的路由。
修改方案:排查路由文件中的重复路由并修改。尤其要注意 resource
方法很可能导致与其方法重复。
在运行 php artisan optimize --force
命名时报这个错误。
原因:在加载需要编译的类时没有找到相应的文件。5.2 版本的 vendor/laravel/framework/src/Illuminate/Foundation/Console/Optimize/config.php
中定义了要编译的文件路径,但不知道为什么 /vendor/laravel/framework/src/Illuminate/Database/Eloquent/ActiveRecords.php
没有找到,所以报了这个错误。
修改方案:暂时注释掉了以上 config.php 中的 ../ActiveRecords.php
一行。
在运行 php artisan config:cache
之后,浏览器上访问 Laravel 应用程序欢迎页报这个错误。
原因:Laravel 应用程序服务器是通过 Homestead 在虚拟机上搭建的。而这个命令我是在虚拟机之外运行的,导致生成的 config.php 中的路径是本机路径,而不是虚拟机上的路径。所以无法找到视图文件。
修改方案:ssh 到虚拟机内部运行该命令。
坑也踩了,测试也做过了。这里针对这次经历做个实践技巧的简单总结。
关闭应用debug app.debug=false
缓存配置信息 php artisan config:cache
缓存路由信息 php artisan router:cache
ab -t 10 -c 10 http://myurl.com/index.php
を実行します。 🎜🎜🎜6.2 データレコード🎜🎜🎜🎜🎜🎜6.3 比較結果🎜 🎜ステップ 5 の結果と比較すると、クラス マッピングの読み込みの最適化後、1 秒あたりに処理されるリクエストの数が 90 から 110 に増加し、リクエストの応答時間が 110 ミリ秒から 100 ミリ秒未満に低下したことがわかります。🎜その効果はかなりのものです。明らか。 🎜🎜🎜7. OPcacheを閉じる🎜🎜7.1 操作🎜🎜🎜🎜ステップ6に基づいて、PHPのOPcacheを閉じてサーバーを再起動します。 phpinfo() の Zend OPcache を介して OPcache が閉じられていることを確認します。 🎜🎜🎜🎜通常のアクセスを確認するには、ブラウザで Laravel アプリケーションのようこそページにアクセスしてください。 🎜🎜🎜🎜ab -t 10 -c 10 http://myurl.com/index.php
を実行します。 🎜🎜🎜🎜7.2 データレコード🎜🎜🎜🎜🎜🎜7.3 比較結果🎜 🎜 ステップ 6 の結果と比較すると、OPcache をオフにした後、1 秒あたりに処理されるリクエストの数が 110 から 15 に減少し、リクエストの応答時間が 100 ミリ秒未満から 650 ミリ秒以上に増加したことがわかります。 🎜OPcacheを開いたり閉じたりすると、データの違いは数倍になります。 🎜🎜🎜🎜その後、PHPのOPcacheを再度開くと、データは手順6のレベルに復元されました。 🎜🎜phpArtisanroute:cache
コマンドを実行すると報告されます。 🎜🎜 原因: ルーティング ファイルに重複したルートが定義されています。 🎜🎜変更計画: ルーティング ファイル内の重複ルートを確認し、それらを変更します。特に、resource
メソッドはメソッドの重複を引き起こす可能性があることに注意してください。 🎜🎜3. [RuntimeException] 指定されたファイル名が無効です。🎜🎜このエラーは、phpArtisan optimize --force
命名を実行すると発生します。 🎜🎜 原因: コンパイルが必要なクラスをロードするときに、対応するファイルが見つかりませんでした。コンパイルされるファイルパスは、5.2 バージョンの vendor/laravel/framework/src/Illuminate/Foundation/Console/Optimize/config.php
で定義されていますが、なぜ なのかわかりません。 /vendor/laravel/framework/src/Illuminate/Database/Eloquent/ActiveRecords.php
が見つからなかったため、このエラーが報告されました。 🎜🎜修正計画: 上記の config.php の ../ActiveRecords.php
行を一時的にコメントアウトします。 🎜🎜4. FileViewFinder.php 行 137 の InvalidArgumentException: ビュー [ようこそ] が見つかりません🎜🎜 phpArtisan config:cache
を実行した後、ブラウザで Laravel アプリケーションのようこそページにアクセスすると、このエラーが報告されます。 。 🎜🎜理由: Laravel アプリケーションサーバーは、Homestead を使用して仮想マシン上に構築されています。このコマンドを仮想マシンの外部で実行したため、生成された config.php 内のパスが仮想マシン上のパスではなくローカル パスになりました。したがって、ビューファイルが見つかりません。 🎜🎜変更計画: 仮想マシンに SSH で接続し、このコマンドを実行します。 🎜app.debug=false
をオフにする🎜🎜🎜🎜 キャッシュ構成情報 phpArtisan config:cache
🎜🎜🎜🎜キャッシュルーティング情報phpArtisan router:cache
🎜クラスマップ読み込みの最適化 phpArtisanoptimize
(自動読み込み最適化 composer dumpautoload
を含む) php artisan optimize
(包含自动加载优化 composer dumpautoload
)
根据需要只加载必要的中间件
使用即时编译器(JIT),如:HHVM、OPcache
路由的具体实现放到控制器中。
不定义重复的路由,尤其注意 resouce
resource
メソッドに特に注意してください。 データベース リクエストの最適化
以上がLaravelフレームワークのパフォーマンスチューニング方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。