如何有效提高ThinkPHP的应用性能

发布时间:2018-11-19 10:09:57 来源:ThinkPHP

说到应用性能,涉 及到的方方面面实在是太多了,关 于服务器优化和前端优化的文章网上很多,所以就不再累述了。本 文仅抛砖引玉浅述下ThinkPHP5.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,

查询优化

首 先保持良好的开发习惯,了解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

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

注意:一 旦数据库的表结构发生变化,必须重新生成。

配置和公共文件缓存

每 次在应用初始化或者模块初始化的时候会有一定的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 转换为一个类映射表,来提高类的加载速度。


下一篇:

最新资讯

  1. 移动互联网建站:遵 义做网站建设那家公司好
  2. 贵 州腾巢网络成功入驻熊掌号,再 现移动互联时代新域名
  3. 贵 阳旅游网站建设及技术开发解决方案
  4. 贵 阳企业营销型网站建设重点在于效果而不是价格高低
  5. 遵义企业开发小程序,助 企业快速进入新移动互联网时代
  6. 新 移动时代的制胜法宝——百度智能小程序
  7. 贵阳网站建设,附:网站建设明细报价表
  8. 贵州遵 义做网站建设那家公司好?
  9. 为留住Safari默认搜索引擎“宝座”,谷歌将向苹果支付90亿美元
  10. 小程序的未来如何?是否新商机?
  11. 腾 巢绥阳本土网络公司,提 供网站建设及小程序开发服务
  12. 腾 巢网络自主开发微信小程序正式上线投入运营
友情链接:    彩票资讯   中国体育彩票网 - 体彩中心   彩票宝---首页_欢迎您   网上如何买彩票   网上怎么买彩票