说到应用性能,涉及到的方方面面实在是太多了,关于服务器优化和前端优化的文章网上很多,所以就不再累述了。本文仅抛砖引玉浅述下ThinkPHP 5.1 应用开发中(尤其是部署环境)可能涉及的一些性能优化手段和注意事项。

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

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

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方法只能用于主模型的数据缓存,但你可以使用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 的应用性能相关推荐

  1. 4个提高深度学习模型性能的技巧

    点击上方"AI遇见机器学习",选择"星标"公众号 原创干货,第一时间送达 深度学习是一个广阔的领域,但我们大多数人在构建模型时都面临一些共同的难题 在这里,我们 ...

  2. FPGA之道(70)提高设计的综合性能(二)提高设计的自测性

    文章目录 前言 提高设计的自测性 增加测试管脚 状态寄存器集 虚拟示波器 ChipScope&SignalTap 自己编写VirtualScope 编写激励发生测试模块 前言 本文节选自< ...

  3. apr提高tomcat的web性能

    apr提高tomcat的Web性能 Tomcat可以使用APR来提供超强的可伸缩性和性能,更好地集成本地服务器技术.APR(Apache Portable Runtime)是一个高可移植库,它是Apa ...

  4. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

    最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们带来的宝贵财富 欢迎其他的dba来拍砖 目录 1.什么是执行计划?执行计划是 ...

  5. DL之DNN优化技术:利用Dropout(简介、使用、应用)优化方法提高DNN模型的性能

    DL之DNN优化技术:利用Dropout(简介.入门.使用)优化方法提高DNN模型的性能 目录 Dropout简介 Dropout使用 Dropout应用 Dropout简介 随机失活(dropout ...

  6. DL之DNN优化技术:利用Batch Normalization(简介、入门、使用)优化方法提高DNN模型的性能

    DL之DNN优化技术:利用Batch Normalization优化方法提高DNN模型的性能 目录 Batch Normalization简介 Batch Normalization入门 Batch ...

  7. insert exec 语句不能嵌套_走向DBA「MSSQL篇」 - 从SQL语句的角度提高数据库的访问性能...

    最近公司来一个非常虎的DBA,10几年的经验,这里就称之为蔡老师吧,在征得我们蔡老同意的前提下 ,我们来分享一下蔡老给我们带来的宝贵财富,欢迎其他的DBA来拍砖. 目录 1.什么是执行计划?执行计划是 ...

  8. 建立合理的索引提高SQL Server的性能

    建立合理的索引提高SQL Server的性能- 标签:索引,性能优化 建立合理的索引提高SQL Server的性能 在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的 ...

  9. 从外到内提高SQL Server数据库性能

    如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能.如下图: 第一层:网络环境 到企业碰到数据库反映速度比较慢时,首先想到的是是否是网络环 ...

最新文章

  1. 女生零基础学软件测试难不难
  2. 表贴电阻尺寸与什么有关_为什么电阻的长度与电阻的大小有关系
  3. linux权限746,linux文件权限学习笔一
  4. 用MS SQL Server事件探查器来跟踪数据库的操作
  5. 简单介绍一下BSP中的dirs文件和sources文件(WinCE
  6. android Bitmap类方法属性 详细说明
  7. HashSet、LinkedHashSet、TreeSet
  8. JDBC ResultSet分析
  9. bmp280c语言程序,51单片机读取BMP280 180 280气压值1602显示程序
  10. 【PS | 学习】毛坯乡间图打造复古美式电影海报图
  11. Word如何让样式库中的样式不添加到自动生成的目录中
  12. HTML5期末大作业:个人网站设计——简单响应式个人博客HTML模板(8页面) HTML+CSS+JavaScript...
  13. Flink 1.10之改进的TaskManager内存模型与配置/taskmanager.memory.network.fraction
  14. react应用结构框架图
  15. 服务器3D场景建模(三):体素场景(一)
  16. bind mysql web_bind智能DNS + bindUI管理系统(mysql + bind dlz)
  17. 【Element ui 的NavMenu二级菜单下拉icon修改】
  18. 第1讲 样本空间 随机事件
  19. SSE(Server-Sent Events)| 前后端demo参考
  20. 微软 Teams 可以排排坐了~~ C位你要不要?

热门文章

  1. 小学僧的游戏开发之旅——(集思广益)俯视坦克射击游戏实战
  2. IntelliJ IDEA编程笔记:Resources下创建包
  3. Delphi Web前端开发教程(5):基于TMS WEB Core框架
  4. 10次面试9次被刷?500道Java面试题让你怒斩offer
  5. python 实现录音加百度语音识别
  6. K-1.4.0 如何防范WiFi Cracking
  7. 全球及中国能源期货行业市场现状及未来前瞻报告2022-2028年
  8. 【Java】流(Stream)快速入门
  9. 【cartographer】(2)分枝定界算法
  10. 数据驱动——新材料发展的新引擎