PHP接口响应性能调优

OPCache

在扩展里面启用了OPCache后,如果效果不明显可能未成功设置,还需进行一些配置调整。

JWT(PHP ^Version 8.0)

可以参考鸟哥文章:PHP 8新特性之JIT简介

数据库请求瓶颈

大多数情况下,不怎么会在PHP出现响应慢的瓶颈问题,多数出现于连接到DB上的连接数不够用,查询效率低下等;如果连接池不够用,那只能是增加数据库机器或使用一些长连接的框架,如Swoole;如果查询效率低下可根据EXPLAIN找到语句效率瓶颈,适当增添对应索引;在查询数据库时,返回的字段只返回自己需要的或增加Redis等缓存数据库进行查询接口缓存;

PHP-FPM进程数

一般情况下默认的FPM进程数是满足需求的,但如果在请求量大的情况下,可能在等待进程时出现了排队,可能会忽略这一点设置;

启用框架的配置缓存

部分框架会提供一些配置缓存,如Laravel,可通过以下命令生成一些缓存:

php artisan config:cache //配置缓存
php artisan route:cache //路由缓存

将部分功能改造成任务队列模式

比如导入,导出这些耗时长的功能,应修改成任务队列模式进行消费完成;

将提交类接口增加一层缓存

比如在高频的扫码提交操作,我们可以先把数据提交到Redis或内存缓存(Swoole)内,再通过定时任务回写数据库即可;

前端能做的事情避免后端完成

例如二维码生成,如果后端生成二维码再返回给前端,则是返回一个图片或base64给予到前端,这可能占用了响应大小导致速度缓慢或生成内容较大导致生成时间较长;这类任务应该直接返回字符串给予到前端,由前端生成,并且这类生成是在客户端完成的能减少服务端压力;

修改Session的存储位置

部分项目可能还在使用着session存储用户上下文,默认session是存放在文件系统的,那么可能会出现IO瓶颈,建议修改至例如Redis等内存存储方式;

统计类接口进行数据缓存,定时更新

像我们常做的排行版、商品数据统计、请求数据统计等,不一定要求实时查询,更别说其实实时查询效率不如定时缓存数据;所以直接将这类数据缓存到内存,每隔一分钟/十分钟进行更新,为防止用户进行前台更新等待,可以再启动一个定时器,每在缓存到期前就更新数据提前预热;

查询API进行数据缓存

在部分情况下我们接口可能是调用的第三方查询后返回的,比如查询快递信息,这些短时间或数据更新不频繁的第三方请求,但是第三方响应速度较慢,这时候也对返回的接口进行缓存,例如根据快递号为键值的缓存,这些其他用户搜索同一个快递号就也享受到缓存返回了。