PHP用APCu缓存怎防内存溢出_APCu防溢出设置法【安全】-php教程

APCu 缓存本身不会直接导致内存溢出,但配置不当或滥用会加速内存耗尽;其共享内存独立于 memory_limit,需合理设置 apcu.shm_size、apcu.ttl 和 apcu.gc_ttl,并限制单条缓存大小、监控使用率及主动清理。

APCu 缓存本身不会直接导致内存溢出,但配置不当或滥用会加速内存耗尽

APCu 是用户级内存缓存(apcu_store / apcu_fetch),它把数据存在 PHP 进程共享内存里,不经过序列化、无网络开销,快是真快——但它的内存是“吃进去就不吐”的。一旦你缓存了 10 万个 2MB 的数组,哪怕只存 1 分钟,也立刻压爆 memory_limit。这不是 APCu 的 bug,而是你没给它划边界。

  • APCu 不受 memory_limit 管控:它用的是独立共享内存段(由 apc.shm_size 或 apcu.shm_size 控制),PHP 脚本的内存限制对它无效
  • 默认配置极危险:很多发行版预装 APCu 时设 apcu.shm_size=32M,但没配 apcu.ttl 和 apcu.gc_ttl,缓存永不回收
  • 缓存键爆炸式增长:比如用时间戳+用户ID拼 key:"user_{$uid}_{$time}",每秒生成新 key,旧 key 永不淘汰 → 内存只增不减

必须改的三个 APCu 配置项(php.ini)

别只调 memory_limit,那是治脚痛医头。真正要动的是 APCu 自己的“胃容量”和“消化规则”:

  • apcu.shm_size=64M:共享内存总大小,建议 64M–256M(根据服务器总内存按 5%–10% 设)。超过此值写入失败,但不会报错,apcu_store() 返回 false —— 很多代码没判这个,就默默失效
  • apcu.ttl=3600:每个缓存项默认存活时间(秒)。设为 0 表示永不过期,等于埋雷;生产环境务必设合理值(如 10 分钟=600,1 小时=3600)
  • apcu.gc_ttl=3600:垃圾回收触发间隔(秒)。APCu 不是实时删过期 key,而是每 gc_ttl 秒扫一次内存。若 gc_ttl > ttl,过期 key 可能卡住内存数小时

改完记得重启 PHP-FPM 或 Apache:APCu 共享内存段在进程启动时分配,热加载不生效。

代码层防溢出:存之前先问“值够小吗?”

APCu 存的是原始 PHP 变量,大数组、对象、资源句柄全照单全收。一个 file_get_contents('big.log') 直接塞进去,30MB 内存瞬间占满。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PHP用APCu缓存怎防内存溢出_APCu防溢出设置法【安全】-php教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4029780+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4029780+
  • 本周更新: 0+
  • 最后更新: 2026-03-16