APC 配置:PHP 缓存设置
⚠️ 注意! 如果您的 PHP 版本是 5.5 或更高版本,请不要使用 APC,因为 OPCache 已取代 APC 并默认集成在 PHP 中。
2013 年 3 月 21 日,PHP 5.5 Beta 1 发布,其中包含 “Zend OPCache”。这意味着 OPCache 将正式取代 APC,成为 PHP 核心的一部分,并会随每个新版本 PHP 一同维护。
APC(Alternative PHP Cache)是 PHP 的一种字节码缓存机制。它会将编译后的 PHP 操作码(Opcode)存储在内存中。正如开发者描述的那样:“APC 是一个免费、开源且可靠的 PHP 中间代码缓存与优化系统。”
PHP 是一种高级语言,与其他高级语言类似,可以跨平台编译运行。内容管理系统(如 Drupal)通常由数百甚至上千个 PHP 脚本组成。其模块化架构意味着每次加载页面时,可能需要执行上百个脚本。
与许多语言不同,PHP 是即时编译语言——脚本在执行时才会被解析为字节码。APC 的作用就是将编译后的脚本缓存到内存中,从而在后续请求中直接使用已编译版本,大幅减少资源消耗、提高性能。
(例如,Python 会自动缓存已编译脚本的 .pyc
文件以供后续使用,而 PHP 需要 APC 实现类似效果。)
安装 APC
在 Debian/Ubuntu 系统中,安装命令如下:
sudo apt-get install php-pear
sudo apt-get install php5-dev apache2-prefork-dev build-essential
sudo pecl install apc
然后将课程附带的 apc.php 文件复制到服务器根目录,并重启 Apache:
sudo /etc/init.d/apache2 restart
现在可以访问 http://test/apc.php 查看 APC 状态信息。
如上图所示,如果缓存命中率(HITS)较低、未命中文件(MISS)数量较多,且内存碎片率高,说明 APC 使用效率较差。出现这种情况的常见原因如下:
- 内存不足: 例如为 APC 分配了 8MB 内存,但加载脚本总大小为 12MB,则会频繁出现 MISS。
- 内存碎片化: 假设 APC 分配了 32MB 内存,但脚本总计 40MB,且部分文件很少使用,缓存空间会被低频文件占用,导致高频文件无法缓存。大文件写入缓存时若被拆分为多个块,也会产生碎片。
APC 配置文件
在 Debian/Ubuntu 中,APC 配置文件路径为:
/etc/php5/conf.d/apc.ini
apc.enabled=1
启用 APC。此选项必须开启,否则将影响性能。
apc.shm_segments=1
apc.shm_size=32
设置 APC 使用的共享内存。
apc.shm_segments
表示内存段数量(此处为 1 段),
apc.shm_size
表示内存段大小(此处为 32MB)。
可根据 MISS 数量调整为 64MB、128MB 等,直到 MISS 降至 1% 以下为止。这是最关键的性能参数。
apc.cache_by_default=1
;apc.filters=
为所有 PHP 脚本启用缓存。若需限定缓存范围,可注释 filters。
apc.cache_by_default=0
apc.filters="+drupal6"
此设置表示仅缓存 Drupal 6 相关文件,以避免如 PhpMyAdmin 等工具影响 APC 缓存。
apc.stat=1
此选项直接影响性能。
启用后,APC 在检测到脚本文件更新时会自动重新缓存。禁用后则跳过检查,从而提高性能,但需手动清空缓存。
建议:开发环境开启(便于调试),生产环境关闭以提升速度。
注意: 如果启用了 apc.stat,在更新模块或 Drupal 核心后必须手动清空 APC 缓存。
apc.ttl=0
缓存过期时间(秒)。
设置为 0 表示缓存永久有效(默认 7200 秒,即 2 小时)。推荐设置为 0,防止频繁清空缓存。
apc.rfc1867=1
启用后可通过 APC 显示文件上传进度(适用于 Drupal 文件上传)。
apc.num_files_hint=2048
建议在服务器运行多个 Drupal 站点时调整此参数。单个 Drupal 实例可能缓存 500 个以上文件。默认值为 1024,推荐设置更高以避免缓存冲突。
修改配置后,请重启服务器。理想情况下,APC 状态应如下图所示:
注意:MISS 数量应接近 0,内存碎片率应为 0%。