>  기사  >  PHP 프레임워크  >  ThinkPHP 애플리케이션 성능을 효과적으로 향상시키도록 도와주세요!

ThinkPHP 애플리케이션 성능을 효과적으로 향상시키도록 도와주세요!

藏色散人
藏色散人앞으로
2020-12-03 14:41:112845검색

다음 프레임워크 튜토리얼 칼럼에서는 ThinkPHP의 애플리케이션 성능을 효과적으로 향상시키는 방법을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

애플리케이션 성능에 관해서는 관련된 측면이 너무 많습니다. 서버 최적화와 프런트엔드 최적화에 관한 기사가 온라인에 너무 많기 때문에 여기서는 자세히 다루지 않겠습니다. 이 기사에서는 ThinkPHP 5.1 애플리케이션 개발(특히 배포 환경)과 관련된 몇 가지 성능 최적화 방법과 주의사항을 간략하게 소개합니다.

ThinkPHP 애플리케이션 성능을 효과적으로 향상시키도록 도와주세요!추천: "ThinkPHP 5.1 세계 최초 비디오 튜토리얼

"

5.1 应用开发中(尤其是部署环境)可能涉及的一些性能优化手段和注意事项。

推荐:《ThinkPHP 5.1全球首发视频教程

首先要强调一点:框架并不是应用性能的瓶颈,架构设计、数据库和人才是。框架在设计之初,出于通用性考虑,不会特意针对某个应用做深入优化,但提供了一些可能的手段和配置参数让你进行针对性的调优,下面就列举一些可能的优化手段,在开发的时候可以根据情况调整。

正确的性能优化步骤应该是:架构优化、数据库优化、代码优化。

1. 架构优化

架构优化涉及到技术、存储、网络、服务的选型和构架,尽量使用成熟和现代的开发架构和设计模式。前后端完全分离设计,便于前后端的独立优化,也更加便于测试工作。

如果你的应用遇到了性能瓶颈,这个时候要考虑的就是优化架构而不是优化代码本身,因为架构层面的优化效果往往是最显著的。

2. 关闭调试模式

部署环境千万不要忘记关闭调试模式,这不仅仅是出于性能考虑,更多是基于安全因素。事实上,建议通过环境变量来配置关闭调试模式,这样部署后不需要更改任何配置文件。

因为调试模式影响日志记录信息、额外的调试信息和缓存失效,关闭调试模式能够带来一定的性能提升。

3. 使用单模块

使用多模块功能会增加文件的 I/O 开销和额外的配置及检查,如非必要在规划你的应用架构的时候尽量考虑使用单一模块,然后使用控制器分级来解决控制器过多的问题。

使用单一模块的性能优势,在部署到 swoole우선, 한 가지 점을 강조합니다. 프레임워크는 애플리케이션 성능, 아키텍처 설계, 데이터베이스 및 인재의 병목 현상이 아닙니다. 설계 초기에는 다양성을 위해 프레임워크가 특정 애플리케이션에 대한 심층적인 최적화를 구체적으로 수행하지는 않지만 목표 조정을 수행할 수 있는 몇 가지 가능한 수단과 구성 매개변수를 제공합니다. 다음은 몇 가지 가능한 최적화 수단입니다. . 개발 상황에 따라 조정될 수 있습니다.

올바른 성능 최적화 단계는 아키텍처 최적화, 데이터베이스 최적화 및 코드 최적화입니다.

1. 아키텍처 최적화

아키텍처 최적화에는 기술, 스토리지, 네트워크 및 서비스의 선택과 아키텍처가 포함됩니다. 성숙하고 현대적인 개발 아키텍처와 디자인 패턴을 사용해 보세요. 프런트엔드와 백엔드가 완전히 분리되도록 설계되어 프런트엔드와 백엔드의 독립적인 최적화가 용이하고 테스트가 더 쉬워졌습니다.

애플리케이션에서 성능 병목 현상이 발생하는 경우 이때 고려해야 할 것은 코드 자체를 최적화하는 것보다 아키텍처를 최적화하는 것입니다. 아키텍처 수준의 최적화 효과가 가장 중요한 경우가 많기 때문입니다.

2. 디버깅 모드 끄기

환경을 배포할 때 디버깅 모드를 끄는 것은 성능상의 이유일 뿐만 아니라 보안상의 이유이기도 합니다. 실제로 배포 후 구성 파일을 변경할 필요가 없도록 환경 변수를 통해 디버그 모드가 꺼지도록 구성하는 것이 좋습니다.


디버깅 모드는 로깅 정보, 추가 디버깅 정보 및 캐시 무효화에 영향을 미치므로 디버깅 모드를 끄면 성능이 향상될 수 있습니다.

3. 단일 모듈 사용

다중 모듈 기능을 사용하면 파일의 I/O 오버헤드가 증가하고 추가 구성 및 확인이 필요하지 않은 경우 단일 모듈 사용을 고려해보세요. 애플리케이션 아키텍처 모듈을 계획할 때 모듈을 선택한 다음 컨트롤러 등급을 사용하여 너무 많은 컨트롤러 문제를 해결하세요.


단일 모듈을 사용하는 성능 이점은 swoole에 배포할 때 더 완벽하게 반영될 수 있습니다. 애플리케이션 파일이 서비스를 시작하면 메모리에 로드되고 관련 파일이 모듈은 다시 로드 요청마다 로드됩니다.

4. 라우팅 설계 및 최적화

라우팅 규칙을 정의할 때 배열을 사용하지 말고 경로를 등록하는 방법을 사용하고 라우팅 그룹(또는 리소스 라우팅)을 더 자주 사용하십시오. 그룹 라우팅은 일치하는 경로 수를 줄여 라우팅 성능을 향상시킬 수 있습니다. 여러 도메인 이름에 대해 서로 다른 경로가 있는 경우 도메인 이름을 기반으로 하는 경로도 사용할 계획을 세워야 합니다.

라우팅에서 현재 경로에 대한 데이터 확인 및 권한 확인과 같은 작업을 설계해 보세요. 반면에 확인 작업은 기다리지 않고 최대한 빨리 수행할 수 있습니다. 실행할 컨트롤러입니다.

그룹이 많은 경우 경로 확인 지연을 활성화합니다.

// 开启路由延迟解析
'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 클래스의 Remember 방식을 사용할 수 있습니다. 🎜🎜
$users = Cache::remember('users', function(){
    return User::with('profile')
        ->where('status', 1)
        ->select();},30);
🎜쿼리 수에 너무 집착하지 마세요🎜🎜🎜쿼리 수를 최대한 줄이는 것은 성능상의 이유이지만, 쿼리를 적게 사용한다고 해서 반드시 최고의 성능을 얻을 수 있는 것은 아닙니다. 복잡한 JOIN 쿼리의 성능은 두 개의 단순 쿼리만큼 높지 않을 수 있지만 간단한 쿼리를 사용하는 것이 더 명확하고 이해하기 쉬우며 데이터 쿼리를 캐시하는 것이 더 편리합니다. 🎜
正确使用模型关联

不要总是以为模型的性能一定比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

更多用法可以参考官方手册的数据字段缓存。

6.0 配置和公共文件缓存

每次在应用初始化或者模块初始化的时候会有一定的I/O开销,如果已经开启OpCache的话对性能影响甚微,如果比较在意的也可以通过命令行指令生成配置缓存(包括相关的公共文件和各种定义文件)。

生成应用配置缓存:

php think optimize:config

生成模块配置缓存:

php think optimize:config index

注意:一旦配置或者公共文件发生变化,必须重新生成。

7.0 生成类库映射

类库映射可以提升类库的自动加载性能,使用下面的指令可以生成系统类库和应用类库的类库映射(包括extend目录下的类库)。

php think optimize:autoload

vendor目录下的类库可以使用composer的dump-autoload指令优化加载性能。

composer dump-autoload -o

该命令把 PSR-0 和 PSR-4 转换为一个类映射表,来提高类的加载速度。

위 내용은 ThinkPHP 애플리케이션 성능을 효과적으로 향상시키도록 도와주세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제