性能与缓存
缓存链怎么配、什么情况下必须清缓存、索引与分页为什么这么设计、调度与分区怎么用、压测看哪些指标。
约 10 分钟
进阶
代码块右上角可一键复制
本页目录(10 分钟读完)
这一章只做一件事:让网站变快。
先说结论:多数变慢不是代码问题,是缓存没配、索引没建。 按下面的步骤做,大部分问题会消失。
慢得打不开 → 看 排错手册。
怎么建索引#
作用:数据库查得快。这是最有效的一步。
步骤:
- 进项目根目录
- 跑这条命令
php aucms db:index- 要做站内搜索,再跑这条
php aucms db:index --fulltext效果:
| 场景 | 没索引 | 有索引 |
|---|---|---|
| 栏目列表(10 万行) | 73ms | 微秒级 |
| 相关推荐 | 全表扫 | 毫秒级 |
| 今日新增统计 | 171 秒 | 毫秒级 |
刚上线数据少,看不出差别。
数据一多就雪崩式变慢。
所以部署时就要跑,不要等慢了再补。打不开? → 看 排错手册
怎么开 opcache#
作用:PHP 代码不用每次重新编译。
步骤:
- 打开
php.ini - 加上这几行
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000- 重启 PHP-FPM
systemctl reload php-fpm效果:页面快 30%–50%。
打不开? → 看 排错手册
怎么开 apcu#
作用:单机内存缓存,微秒级读取。
步骤:
- 装扩展
# 宝塔:软件商店 → PHP → 安装 apcu
pecl install apcu- 改缓存链。打开
config/cache.php,把chain改成:
'chain' => array('static', 'apcu', 'redis', 'memcached', 'file'),- 重启 PHP-FPM
效果:热数据几乎不走数据库。
链尾必须保留 file。
去掉 file 又没有 redis/apcu,限流、表单 Token、记住登录会全部失效。
表现为「提交表单总说过期」「登录保持不住」。打不开? → 看 排错手册
怎么配 redis(多机时)#
作用:多台服务器共享缓存。
步骤:
- 装好 redis
- 打开
config/cache.php - 改这几项
'default' => 'redis',
'prefix' => 'aucms:',
'stores' => array(
'redis' => array(
'host' => '127.0.0.1',
'port' => 6379,
),
),- 重启 PHP-FPM
多个站点共用一个 Redis 时,prefix 必须区分。
否则缓存会串站。效果:多台机器看到同一份缓存。
打不开? → 看 排错手册
什么时候必须清缓存#
作用:改了东西没生效时,按这张表做。
| 你改了什么 | 做什么 | 命令 |
|---|---|---|
| 后台改设置 | 清缓存 | php aucms cache:clear |
改模板 .html | 不用管 | 自动重编译 |
| 改 CSS / JS | 不用管 | ?v= 指纹会变 |
| 加了/改了路由 | 重建 | php aucms cache:rebuild |
| 启用/停用插件 | 重建 | php aucms cache:rebuild |
| 改 PHP 类文件 | 重建 | php aucms cache:rebuild |
| 用了 Redis 且改了设置 | 还要删键 | redis-cli del aucms:setting:all |
| 用了 Swoole | 重启 worker | — |
「改了没生效」排查顺序:
- 无痕窗口打开(排浏览器缓存)
php aucms cache:clearphp aucms cache:rebuild- 有 Redis 就
redis-cli del aucms:setting:all - 常驻进程就重启 worker
打不开? → 看 排错手册
列表页为什么不算总数#
作用:明白为什么分页不显示「共 12345 条」。
栏目页默认用 simple 分页,不算总数。
| 算总数 | 不算总数 |
|---|---|
| 百万级几百毫秒 | 毫秒级 |
| 亿级 25.8 秒 | 毫秒级 |
| 用户根本不看这个数 | 用户体验一样 |
需要显示总数时,别在模板里引用 $pager.total(它是 0)。怎么开定时任务#
作用:让「到点该发的文章」真的发出去。
步骤:
第 1 步:测试跑一轮
php aucms schedule:work --once第 2 步:后台常驻
nohup php aucms schedule:work > runtime/log/schedule.log 2>&1 &第 3 步:生产用 systemd 托管
- 新建
/etc/systemd/system/aucms-schedule.service - 贴下面的内容
- 改
WorkingDirectory和ExecStart为你的路径
[Unit]
Description=aucms scheduler
After=network.target
[Service]
User=www
WorkingDirectory=/www/wwwroot/example.com
ExecStart=/www/server/php/74/bin/php aucms schedule:work
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target- 启用
systemctl enable --now aucms-schedule内置任务:
| 任务 | 频率 | 干什么 |
|---|---|---|
cron | 每分钟 | 触发 cron_run 钩子 |
views | 每 5 分钟 | 浏览量批量落库 |
publish | 每分钟 | 到点草稿转已发布 |
recycle | 每天 03:30 | 清回收站(默认关) |
常用命令:
php aucms schedule:list # 看任务
php aucms schedule:status # 进程活着吗
php aucms schedule:stop # 退出打不开? → 看 排错手册
日志表太大怎么办#
作用:几百万行时 DELETE 会锁表卡站。
步骤:
- 看当前情况
php aucms partition:status- 补齐未来分区
php aucms partition:apply- 先演练会删什么
php aucms partition:prune --dry- 确认后真删
php aucms partition:prune效果:删旧数据变成 DROP PARTITION,秒级完成。
改分区策略前必读三条:
1) 分区键必须进所有唯一键
2) ENGINE= 必须写在 PARTITION BY 之前
3) BIGINT 时间戳用 RANGE(col) 数字上界打不开? → 看 排错手册
压测看哪四个指标#
作用:用数字判断快不快。
步骤:
- 跑压测(关掉限流!)
ab -n 2000 -c 50 http://127.0.0.1:8080/list/news- 只看这四个数
| 指标 | 健康值 | 超了说明 |
|---|---|---|
| 平均响应 | < 120ms | 有全表扫或没缓存 |
| P95 | < 300ms | 尾部卡 |
| QPS | 视机器 | 单核 FPM 约 200–600 |
| 错误率 | 0 | 有 5xx 先看日志 |
压测前必做:
1) 安全设置 → 关掉限流,否则被自己挡住
2) 用真实数据量压,空表数字没意义十条优化清单#
按性价比排,从最有效开始:
| 顺序 | 做什么 | 怎么做 |
|---|---|---|
| 1 | 建索引 | php aucms db:index |
| 2 | 开 opcache | php.ini 里打开 |
| 3 | 装 apcu | 缓存链加上 apcu |
| 4 | 多机用 redis | default 改 redis,设 prefix |
| 5 | 列表保持 simple 分页 | 模板别引用 $pager.total |
| 6 | 图片走 thumb | 别让列表加载原图 |
| 7 | 大表分区 | partition:prune |
| 8 | 调度交给 systemd | 别用 crontab 每分钟 fork |
| 9 | 静态资源加过期 | Nginx 加 expires 30d |
| 10 | 模板里不做查询 | 数据由控制器取好 |
最后一条最重要。
模板里没有取数据的能力,这是刻意设计。
要查就在控制器里补变量,别在模板里查。FPM 下别配连接池#
php aucms db:pool # 查看状态FPM 模式下进程处理完就退出,连接跟着关。
跨请求复用做不到,开池子没意义。
只有 Swoole 常驻模式下连接池才是真的。什么时候上 Swoole#
| 情况 | 建议 |
|---|---|
| 日均 PV < 10 万 | 别折腾,FPM 够用 |
| 要 WebSocket | 上 Swoole |
| 每秒并发 > 500 | 上 Swoole + 连接池 |
| 团队没人懂常驻 | 别上 |
php swoole.php 0.0.0.0 9501 8 # 地址 端口 Worker数常驻模式下改代码必须重启 worker。
否则跑的还是旧代码 —— 这是最常见的「改了没用」。接下来看哪一章#
没找到答案?
在后台「缓存与维护 → 系统体检」里看环境是否正常;仍无解就打开
server_debug.php 复现一次,页面会直接告诉你异常文件与行号。