이후 요약입니다. 튜닝 과정에서 많은 우여곡절을 겪은 끝에 마침내 예비 성능 테스트 계획을 완성하고 구현했으며, 실제 테스트 데이터를 통해 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}
php artisan config:cache
🎜🎜캐시 라우팅 정보 php artisan router:cache
🎜🎜🎜🎜클래스 맵 로딩 최적화php artisanoptim
🎜🎜🎜🎜자동 로딩 최적화composer dumpautoload
🎜🎜🎜🎜있는 것만 로드하세요 미들웨어🎜🎜🎜🎜는 HHVM, OPcache🎜🎜🎜🎜와 같은 JIT(Just-In-Time 컴파일러)를 사용합니다. PHP 7.x🎜🎜bootstrap/cache/config.php
파일로 병합하여 need to run 해당 시점에 로드된 파일 수입니다. 🎜rrreee🎜위 명령을 실행하여 구성 정보 캐시를 삭제합니다. 즉, bootstrap/cache/config.php
파일을 삭제합니다🎜bootstrap/cache/routes.php
파일을 생성합니다. 경로 캐싱은 라우터의 등록 효율성을 효과적으로 향상시킬 수 있으며 그 효과는 대규모 애플리케이션에서 더욱 분명합니다. 🎜rrreee🎜위 명령을 실행하면 라우팅 캐시가 지워집니다. 이는 bootstrap/cache/routes.php
파일이 삭제된다는 의미입니다. 🎜bootstrap/cache/compiled.php
및 bootstrap/cache/services.json
이라는 두 개의 파일을 생성합니다. 🎜🎜 config/compile.php
파일을 수정하여 병합할 클래스를 추가할 수 있습니다. 🎜🎜프로덕션 환경에서는 --force
매개변수 파일을 지정할 필요가 없으며 자동으로 생성될 수 있습니다. 🎜rrreee🎜위 명령을 실행하면 클래스 맵 로딩 최적화가 지워집니다. 즉, bootstrap/cache/compiled.php
및 bootstrap/cache/services.json
두 파일이 삭제됩니다. >. 🎜🎜참고: 이 작업은 php artisanoptim-force
명령에서 이미 수행되었습니다. 🎜
app/Http/Kernel.php
에서 불필요한 미들웨어(예: 세션 지원)를 주석 처리하면 성능이 크게 향상될 수 있습니다. 🎜🎜글쎄, 실제 기업 환경에 국한되어 오랫동안 변경되지 않을 수도 있으므로 언급하지 않았습니다. 🎜🎜0x02 테스트 계획🎜🎜간단한 Apache ab 명령을 사용하여 애플리케이션 항목 파일만 테스트하고 데이터를 기록하고 분석합니다. 🎜🎜🎜🎜애플리케이션의 항목 파일인 index.php만 테스트하세요. 프레임워크의 시작 페이지로 돌아가려면 "/" 또는 "/index.php"에 액세스하세요. 보다 포괄적인 성능 테스트를 위해서는 애플리케이션의 더 많은 인터페이스를 테스트해야 합니다. 🎜🎜🎜🎜Apache ab 명령을 사용하세요.
ab -t 10 -c 10 {url}
. 이 명령은 해당 URL에 대한 10개의 요청을 동시에 시작하고 10초 동안 지속된다는 의미입니다. 명령의 특정 매개변수 설정은 테스트할 서버 성능에 따라 선택해야 합니다. 🎜🎜🎜🎜기계 변동으로 인한 데이터 오류를 방지하기 위해 각 테스트 조건은 여러 ab 명령을 실행하고 명령 실행 결과를 기록하며, 초당 처리되는 요청 수와 요청 응답 시간에 중점을 두고 이상값을 분석 및 제거합니다. 🎜테스트 조건이 조정될 때마다 테스트 조건 수정으로 인한 접속 오류가 없는지 확인하기 위해 브라우저에서 웰컴 페이지에 접속해야 합니다. 페이지 액세스 오류가 발생하면 테스트 결과가 올바르지 않게 됩니다.
서버 환경 설명
특정 환경과 분리된 모든 테스트 데이터는 의미가 없으며 유사한 조건에서만 비교할 수 있습니다.
이 환경은 8G 메모리, 2.8GHz 프로세서 및 SSD 하드 드라이브를 갖춘 Mac에서 실행됩니다.
테스트 서버는 홈스테드를 사용하여 구축되었습니다. 가상 머신은 단일 코어 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 애플리케이션 시작 페이지에 액세스합니다🎜🎜 기반 수정 1단계 APP_DEBUG=false
. 🎜🎜🎜🎜브라우저로 Laravel 애플리케이션 시작 페이지를 방문하여 정상적인 액세스를 확인하세요. 🎜🎜🎜🎜 ab -t 10 -c 10 http://myurl.com/index.php
를 실행하세요. 🎜🎜🎜참고: 이 부분은 애플리케이션의 로그 사용과 밀접한 관련이 있습니다. 🎜
를 실행합니다. php artisan config:cache
, bootstrap/cache/config.php
생성을 확인하세요. 🎜🎜🎜🎜브라우저로 Laravel 애플리케이션 시작 페이지를 방문하여 정상적인 액세스를 확인하세요. 🎜🎜🎜🎜 ab -t 10 -c 10 http://myurl.com/index.php
를 실행하세요. 🎜🎜php artisan을 실행합니다. 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단계 결과와 비교하면 불필요한 미들웨어를 삭제한 후 초당 처리되는 요청 수가 약 60개에서 약 60개로 증가한 것으로 나타났습니다. 90, 요청 응답 시간은 160ms에서 약 110ms로 TPS의 관점에서 볼 때 효과가 매우 분명합니다.
6. 클래스 맵 로딩 최적화 켜기 6.1 작업php artisanoptim --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단계 결과와 비교하면 클래스 매핑 로딩 최적화 후 초당 처리되는 요청 수가 90에서 110으로 증가하고 요청 응답 시간이 110ms에서 100ms 미만으로 감소한 것으로 나타났습니다. 🎜효과가 상당히 큽니다. 분명한. 🎜🎜🎜7. OPcache 닫기🎜🎜7.1 Operation🎜🎜🎜🎜 6단계에 따라 PHP의 OPcache를 닫고 서버를 다시 시작합니다. phpinfo()의 Zend OPcache를 통해 OPcache가 닫혔는지 확인하세요. 🎜🎜🎜🎜브라우저로 Laravel 애플리케이션 시작 페이지를 방문하여 정상적인 액세스를 확인하세요. 🎜🎜🎜🎜 ab -t 10 -c 10 http://myurl.com/index.php
를 실행하세요. 🎜🎜🎜🎜7.2 데이터 기록🎜🎜🎜🎜🎜🎜7.3 비교 결과 🎜 🎜6단계 결과와 비교하면, OPcache를 끈 후 초당 처리되는 요청 수가 110에서 15로 감소하고, 요청 응답 시간이 100ms 미만에서 650ms 이상으로 증가한 것으로 나타났습니다. 🎜OPcache를 열고 닫으면 데이터 차이가 몇 배나 납니다. 🎜🎜🎜🎜이후 PHP의 OPcache를 다시 열었더니 6단계 수준으로 데이터가 복원되었습니다. 🎜🎜php artisan Route:cache
명령 실행 이 오류를 보고하세요. . 🎜🎜원인: 라우팅 파일에서 "/" 처리 시 클로저가 사용되었습니다. 이 명령을 실행하려면 라우팅 구현에서 클로저를 사용하면 안 됩니다. 🎜🎜수정 계획: 컨트롤러에 특정 라우팅 구현을 넣습니다. 🎜🎜2. [예외] 'Closure' 직렬화는 허용되지 않습니다. 🎜🎜이 오류는 php artisan Route:cache
명령을 실행할 때 보고됩니다. 🎜🎜원인: 라우팅 파일에 중복된 경로가 정의되어 있습니다. 🎜🎜수정 계획: 라우팅 파일에서 중복된 경로를 확인하고 수정합니다. 특히, resource
메서드는 해당 메서드의 중복을 일으킬 가능성이 있다는 점에 유의하세요. 🎜🎜3. [RuntimeException] 잘못된 파일 이름이 제공되었습니다.🎜🎜이 오류는 php artisanoptim --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: View [welcome]을 찾을 수 없습니다. 🎜🎜php artisan config:cache
를 실행한 후 브라우저에서 Laravel 애플리케이션 시작 페이지에 액세스할 때 이 오류가 보고됩니다. . 🎜🎜이유: Laravel 애플리케이션 서버는 Homestead를 사용하는 가상 머신에 구축되었습니다. 가상 머신 외부에서 이 명령을 실행했는데, 이로 인해 생성된 config.php의 경로가 가상 머신의 경로가 아닌 로컬 경로가 되었습니다. 따라서 뷰 파일을 찾을 수 없습니다. 🎜🎜수정 계획: SSH를 통해 가상 머신에 접속하고 이 명령을 실행하세요. 🎜app.debug=false
🎜🎜🎜🎜캐시 구성 정보 php artisan config:cache
🎜🎜🎜🎜캐시 라우팅 정보php artisan router:cache
🎜클래스 맵 로딩 최적화 php artisanoptim
(자동 로딩 최적화 composer dumpautoload
포함) php artisan optimize
(包含自动加载优化 composer dumpautoload
)
根据需要只加载必要的中间件
使用即时编译器(JIT),如:HHVM、OPcache
路由的具体实现放到控制器中。
不定义重复的路由,尤其注意 resouce
resource
메서드에 특히 주의하세요. 데이터베이스 요청 최적화
위 내용은 Laravel 프레임워크 성능 조정 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!