性能与缓存

缓存链怎么配、什么情况下必须清缓存、索引与分页为什么这么设计、调度与分区怎么用、压测看哪些指标。

约 10 分钟 进阶 代码块右上角可一键复制
本页目录(10 分钟读完)

这一章只做一件事:让网站变快。

先说结论:多数变慢不是代码问题,是缓存没配、索引没建。 按下面的步骤做,大部分问题会消失。

慢得打不开 → 看 排错手册。

怎么建索引#

作用:数据库查得快。这是最有效的一步。

步骤:

  1. 进项目根目录
  2. 跑这条命令
Shell
php aucms db:index
  1. 要做站内搜索,再跑这条
Shell
php aucms db:index --fulltext

效果:

场景没索引有索引
栏目列表(10 万行)73ms微秒级
相关推荐全表扫毫秒级
今日新增统计171 秒毫秒级
文本
刚上线数据少,看不出差别。
数据一多就雪崩式变慢。
所以部署时就要跑,不要等慢了再补。

打不开? → 看 排错手册

怎么开 opcache#

作用:PHP 代码不用每次重新编译。

步骤:

  1. 打开 php.ini
  2. 加上这几行
INI
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
  1. 重启 PHP-FPM
Shell
systemctl reload php-fpm

效果:页面快 30%–50%。

打不开? → 看 排错手册

怎么开 apcu#

作用:单机内存缓存,微秒级读取。

步骤:

  1. 装扩展
Shell
# 宝塔:软件商店 → PHP → 安装 apcu
pecl install apcu
  1. 改缓存链。打开 config/cache.php,把 chain 改成:
PHP
'chain' => array('static', 'apcu', 'redis', 'memcached', 'file'),
  1. 重启 PHP-FPM

效果:热数据几乎不走数据库。

文本
链尾必须保留 file。
去掉 file 又没有 redis/apcu,限流、表单 Token、记住登录会全部失效。
表现为「提交表单总说过期」「登录保持不住」。

打不开? → 看 排错手册

怎么配 redis(多机时)#

作用:多台服务器共享缓存。

步骤:

  1. 装好 redis
  2. 打开 config/cache.php
  3. 改这几项
PHP
'default' => 'redis',
'prefix'  => 'aucms:',
'stores'  => array(
    'redis' => array(
        'host' => '127.0.0.1',
        'port' => 6379,
    ),
),
  1. 重启 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—

「改了没生效」排查顺序:

  1. 无痕窗口打开(排浏览器缓存)
  2. php aucms cache:clear
  3. php aucms cache:rebuild
  4. 有 Redis 就 redis-cli del aucms:setting:all
  5. 常驻进程就重启 worker

打不开? → 看 排错手册

列表页为什么不算总数#

作用:明白为什么分页不显示「共 12345 条」。

栏目页默认用 simple 分页,不算总数。

算总数不算总数
百万级几百毫秒毫秒级
亿级 25.8 秒毫秒级
用户根本不看这个数用户体验一样
文本
需要显示总数时,别在模板里引用 $pager.total(它是 0)。

怎么开定时任务#

作用:让「到点该发的文章」真的发出去。

步骤:

第 1 步:测试跑一轮

Shell
php aucms schedule:work --once

第 2 步:后台常驻

Shell
nohup php aucms schedule:work > runtime/log/schedule.log 2>&1 &

第 3 步:生产用 systemd 托管

  1. 新建 /etc/systemd/system/aucms-schedule.service
  2. 贴下面的内容
  3. 改 WorkingDirectory 和 ExecStart 为你的路径
INI
[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
  1. 启用
Shell
systemctl enable --now aucms-schedule

内置任务:

任务频率干什么
cron每分钟触发 cron_run 钩子
views每 5 分钟浏览量批量落库
publish每分钟到点草稿转已发布
recycle每天 03:30清回收站(默认关)

常用命令:

Shell
php aucms schedule:list      # 看任务
php aucms schedule:status    # 进程活着吗
php aucms schedule:stop      # 退出

打不开? → 看 排错手册

日志表太大怎么办#

作用:几百万行时 DELETE 会锁表卡站。

步骤:

  1. 看当前情况
Shell
php aucms partition:status
  1. 补齐未来分区
Shell
php aucms partition:apply
  1. 先演练会删什么
Shell
php aucms partition:prune --dry
  1. 确认后真删
Shell
php aucms partition:prune

效果:删旧数据变成 DROP PARTITION,秒级完成。

文本
改分区策略前必读三条:
1) 分区键必须进所有唯一键
2) ENGINE= 必须写在 PARTITION BY 之前
3) BIGINT 时间戳用 RANGE(col) 数字上界

打不开? → 看 排错手册

压测看哪四个指标#

作用:用数字判断快不快。

步骤:

  1. 跑压测(关掉限流!)
Shell
ab -n 2000 -c 50 http://127.0.0.1:8080/list/news
  1. 只看这四个数
指标健康值超了说明
平均响应< 120ms有全表扫或没缓存
P95< 300ms尾部卡
QPS视机器单核 FPM 约 200–600
错误率0有 5xx 先看日志
文本
压测前必做:
1) 安全设置 → 关掉限流,否则被自己挡住
2) 用真实数据量压,空表数字没意义

十条优化清单#

按性价比排,从最有效开始:

顺序做什么怎么做
1建索引php aucms db:index
2开 opcachephp.ini 里打开
3装 apcu缓存链加上 apcu
4多机用 redisdefault 改 redis,设 prefix
5列表保持 simple 分页模板别引用 $pager.total
6图片走 thumb别让列表加载原图
7大表分区partition:prune
8调度交给 systemd别用 crontab 每分钟 fork
9静态资源加过期Nginx 加 expires 30d
10模板里不做查询数据由控制器取好
文本
最后一条最重要。
模板里没有取数据的能力,这是刻意设计。
要查就在控制器里补变量,别在模板里查。

FPM 下别配连接池#

Shell
php aucms db:pool    # 查看状态
文本
FPM 模式下进程处理完就退出,连接跟着关。
跨请求复用做不到,开池子没意义。

只有 Swoole 常驻模式下连接池才是真的。

什么时候上 Swoole#

情况建议
日均 PV < 10 万别折腾,FPM 够用
要 WebSocket上 Swoole
每秒并发 > 500上 Swoole + 连接池
团队没人懂常驻别上
Shell
php swoole.php 0.0.0.0 9501 8    # 地址 端口 Worker数
文本
常驻模式下改代码必须重启 worker。
否则跑的还是旧代码 —— 这是最常见的「改了没用」。

接下来看哪一章#

我想…去看
网站被打开了报错排错手册
上线前检查上线检查清单
部署到服务器部署上线
没找到答案? 在后台「缓存与维护 → 系统体检」里看环境是否正常;仍无解就打开 server_debug.php 复现一次,页面会直接告诉你异常文件与行号。