如何利用Ubuntu PHP进行缓存优化
小樊
36
2025-12-28 06:43:02
Ubuntu PHP 缓存优化实操指南
一 分层缓存总体策略
- 建议按“代码层→对象层→边缘层→存储层”组合使用缓存,兼顾性能与一致性:
- 代码层:OPcache(字节码缓存,减少编译开销,适用于所有 PHP 应用,建议默认开启)。
- 对象层:APCu(用户态键值缓存,适合计算结果、配置、片段)、Redis/Memcached(高性能键值存储,常作对象缓存与会话存储后端)。
- 边缘层:Varnish / Nginx 反向代理缓存(整页/片段缓存,适合匿名流量、静态资源与可缓存 API)。
- 存储层与浏览器:Apache mod_expires/mod_file_cache(资源客户端缓存)、静态资源上 CDN,必要时配合磁盘/SSD 层加速。以上方案可按场景叠加,避免单点优化。
二 快速落地步骤
- 安装与启用 OPcache(必开)
- 安装:sudo apt update && sudo apt install php-opcache
- 编辑对应 PHP 版本的 ini(如:/etc/php/8.1/apache2/php.ini 或 /etc/php/8.1/fpm/php.ini),加入/确认:
- [opcache]
- zend_extension=opcache.so
- opcache.enable=1
- opcache.memory_consumption=128
- opcache.interned_strings_buffer=8
- opcache.max_accelerated_files=10000
- opcache.revalidate_freq=60
- opcache.fast_shutdown=1
- 重启服务:sudo systemctl restart apache2 或 php8.1-fpm
- 安装与启用 APCu(用户缓存)
- 安装:sudo apt install php-apcu
- 配置(php.ini):
- [apcu]
- apcu.enable=1
- apcu.shm_size=64M
- apcu.ttl=7200
- apcu.enable_cli=0(生产 CLI 建议关闭,避免污染缓存)
- 安装与启用 Redis/Memcached(外部对象缓存与会话)
- 安装:sudo apt install redis-server php-redis;或 sudo apt install memcached php-memcached
- 启用:多数发行版包已自动启用扩展;如需手动,在 php.ini 加入 extension=redis.so 或 extension=memcached.so
- 验证服务:sudo systemctl status redis-server / memcached
- 基本连通性测试(PHP):
- Redis:$redis = new Redis(); $redis->connect(‘127.0.0.1’, 6379); $redis->set(‘k’,‘v’,3600);
- Memcached:$m = new Memcached(); $m->addServer(‘127.0.0.1’, 11211); $m->set(‘k’,‘v’,3600);
- 扩展选择:PHP 7+ 推荐使用带“d”的 memcached 扩展;老旧的 memcache 扩展不适用于 PHP 7。
三 配置与应用示例
- 会话存储到 Redis/Memcached(php.ini)
- session.save_handler=redis 或 memcached
- session.save_path=tcp://127.0.0.1:6379 或 127.0.0.1:11211
- 框架与 CMS 示例
- WordPress:安装 Redis Object Cache 插件(需已安装 php-redis);多站点建议设置 WP_CACHE_KEY_SALT 隔离缓存命名空间。
- Laravel/Symfony:在 .env 或框架配置中设置缓存驱动为 redis,并配置连接参数(host、port、database、password)。
- HTTP 层缓存示例(Nginx 反向代理缓存)
- 在 http/server/location 中配置:
- proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
- location / { proxy_pass http://127.0.0.1:8080; proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; }
- 浏览器与静态资源缓存(Apache)
- 启用模块:a2enmod expires headers
- 配置示例:
- ExpiresActive On
- ExpiresByType text/css “access plus 1 week”
- ExpiresByType application/javascript “access plus 1 week”
- ExpiresByType image/png “access plus 1 month”
- Header always set Cache-Control “public, max-age=31536000, immutable” env=!NO_CACHE
四 验证与运维要点
- 验证是否生效
- PHP 层:创建 phpinfo.php(),查看 OPcache/APCu/Redis/Memcached 模块与配置;注意 CLI 与 FPM 可能使用不同 php.ini,需分别检查。
- 数据层:运行简单脚本验证 set/get 命中;Memcached 可用 telnet localhost 11211 执行 stats/flush_all 辅助排查。
- HTTP 层:curl -I 检查 Cache-Control/Expires 与 X-Cache/Varnish 等头。
- 多版本 PHP 并存
- 确保扩展安装到正确的版本目录(如 /etc/php/8.1/ 与 /etc/php/8.2/),并分别重启对应服务。
- 安全
- Redis 默认无鉴权,生产环境请启用 requirepass 与绑定内网 IP;Memcached 建议仅监听 127.0.0.1 或内网。
- 监控与容量
- 关注命中率、内存占用与驱逐(evictions);Redis 可用 INFO/慢查询日志,Memcached 用 stats;必要时调大内存或优化 TTL/键设计。
五 参数调优与常见坑
- OPcache 关键参数建议
- opcache.memory_consumption:从 128 MB 起步,视应用体量调至 256 MB 或更高。
- opcache.max_accelerated_files:建议 10000+,大型项目可更高(如 40000)。
- opcache.revalidate_freq:60 s 平衡“变更可见性”与“文件系统检查开销”;频繁发布可临时降低。
- opcache.save_comments=1(保留注释,利于框架/注解与反射)。
- APCu 关键参数建议
- apcu.shm_size:从 64 MB 起步,热点多时可至 128 MB 或更高。
- apcu.ttl:业务允许下设置 7200 s 左右;对强一致数据使用较短 TTL 或主动失效。
- apcu.enable_cli=0(生产 CLI 关闭,避免与 FPM 缓存不一致)。
- 数据库层注意
- MySQL 5.7.20 起弃用查询缓存,8.0 已移除;高读场景请用 Redis/Memcached 做结果缓存,数据库侧优先优化 InnoDB Buffer Pool 等内存结构。