这些函数的行为受 php.ini 中的设置影响。
尽管默认的 APCu 设置对于许多安装来说都很好,但认真的用户应该考虑调整以下参数。
配置 APCu 需要做一个决定:要为 APCu 分配多少内存。控制此项的 ini 指令是 apc.shm_size
,请仔细阅读下面的相关章节。
服务器运行后,应该将与扩展程序捆绑在一起的 apc.php
脚本复制到 docroot 中的某个位置,并使用浏览器查看,因为它提供了对 APCu 内部工作原理的详细分析。如果 PHP 中启用了 GD,它甚至会显示一些有趣的图表。
如果 APCu 正常工作,则 Cache full count
数字(左侧)将显示缓存达到最大容量并必须驱逐条目以释放内存的次数。在驱逐过程中,如果指定了 apc.ttl
,APCu 将首先尝试删除过期条目,即 TTL 已过期或没有设置 TTL 且在过去 apc.ttl
秒内未访问的条目。如果没有设置 apc.ttl
,或者删除过期条目没有释放足够的内存,APCu 将清除整个缓存。
在一个配置良好的缓存中,驱逐次数应该最少。如果缓存不断被填充,从而强制释放,则由此产生的剧烈变化将对脚本性能产生不利影响。最小化此数字的最简单方法是为 APCu 分配更多内存。
当 APCu 使用 mmap 支持(内存映射)编译时,它将只使用一个内存段,这与使用 SHM(SysV 共享内存)支持构建的 APCu 使用多个内存段不同。与 SHM 在 /proc/sys/kernel/shmmax
中的限制不同,MMAP 没有最大限制。一般推荐使用 MMAP 支持,因为它可以在 web 服务器重启时更快地回收内存,并且总体上减少了启动时的内存分配影响。
名称 | 默认值 | 可更改 | 变更日志 |
---|---|---|---|
apc.enabled | 1 | INI_SYSTEM |
|
apc.shm_segments | 1 | INI_SYSTEM |
|
apc.shm_size | "32M" | INI_SYSTEM |
|
apc.entries_hint | 4096 | INI_SYSTEM |
|
apc.ttl | 0 | INI_SYSTEM |
|
apc.gc_ttl | 3600 | INI_SYSTEM |
|
apc.mmap_file_mask | NULL | INI_SYSTEM |
|
apc.slam_defense | 0 | INI_SYSTEM |
|
apc.enable_cli | 0 | INI_SYSTEM |
|
apc.use_request_time | 0 | INI_ALL |
在 APCu 5.1.19 之前,默认值为 1 。 |
apc.serializer | "php" | INI_SYSTEM |
在 APCu 5.1.15 之前,默认值为 "default" 。 |
apc.coredump_unmap | 0 | INI_SYSTEM |
|
apc.preload_path | NULL | INI_SYSTEM |
以下是配置指令的简短说明。
apc.enabled
bool
可以将 apc.enabled
设置为 0 以禁用 APC。这主要在 APC 静态编译到 PHP 中时有用,因为没有其他方法可以禁用它(当编译为 DSO 时,php.ini
中的 extension
行只需注释掉即可)。
apc.shm_segments
int为编译器缓存分配的共享内存段数。如果 APC 耗尽共享内存,但 apc.shm_size
设置得尽可能高,则提高此值可能会阻止 APC 耗尽其内存。
apc.shm_size
string每个共享内存段的大小,使用 此常见问题解答 中所述的简写表示法指定。默认情况下,某些系统(包括大多数 BSD 变体)对共享内存段的大小有非常低的限制。
apc.entries_hint
int关于可能存储的不同变量数量的“提示”。如果不确定,请设置为零或省略。
apc.ttl
int如果在这么多秒内未访问缓存条目,则认为没有明确 TTL 的缓存条目已过期。实际上,这允许在缓存插入期间或在完全清除之前有机会删除这些条目。请注意,由于删除是机会性的,即使条目比 apc.ttl
秒旧,仍然可以读取它们。此设置对具有明确 TTL 的缓存条目没有影响。
apc.gc_ttl
int缓存条目可以在垃圾收集列表中保留的秒数。此值在服务器进程在执行缓存的源文件时死亡的情况下提供了一种故障保护;如果修改了该源文件,则分配给旧版本的内存将不会被回收,直到达到此 TTL 为止。设置为零以禁用此功能。
apc.mmap_file_mask
string如果使用 --enable-mmap
编译了 MMAP 支持,则这是要传递给 mmap 模块的 mktemp 风格的 file_mask,用于确定映射的内存区域是文件支持的还是共享内存支持的。对于直接文件支持的 mmap,将其设置为类似 /tmp/apc.XXXXXX
的内容(正好 6 个 X
)。要使用 POSIX 风格的 shm_open/mmap,请在掩码中某个位置添加 .shm
,例如 /apc.shm.XXXXXX
。您也可以将其设置为 /dev/zero
以使用内核的 /dev/zero
接口进行匿名 mmap 内存。将其留空将强制进行匿名 mmap。
apc.slam_defense
bool在非常繁忙的服务器上,每当您启动服务器或修改文件时,您都会创建一个竞争,许多进程都会尝试同时缓存同一个文件。将 apc.slam_defense
设置为 1
可以通过引入概率机制来帮助防止多个进程同时缓存同一个文件。如果不同的进程在短时间内尝试缓存相同的键,则它会跳过当前进程的缓存,以减轻潜在的缓存冲击。
apc.enable_cli
int主要用于测试和调试。设置此选项可在 PHP 的 CLI 版本中启用 APC。在正常情况下,在每次 CLI 请求时创建、填充和销毁 APC 缓存并非理想之选,但对于各种测试场景来说,能够轻松地为 PHP 的 CLI 版本启用 APC 非常有用。
apc.serializer
string用于配置 APC 以使用第三方序列化器。
apc.coredump_unmap
bool启用 APC 处理信号(例如 SIGSEGV),这些信号在收到信号时会写入核心文件。当收到这些信号时,APC 将尝试取消映射共享内存段,以便将其从核心文件中排除。当收到致命信号并配置了大型 APC 共享内存段时,此设置可以提高系统稳定性。
此功能可能很危险。在致命信号处理程序中取消映射共享内存段可能会导致未定义的行为,如果发生致命错误。
注意:
尽管某些内核可能提供忽略各种类型的共享内存以生成核心转储文件的工具,但这些实现也可能忽略重要的共享内存段,例如 Apache 记分板。
apc.preload_path
string可以选择设置 APC 在启动时加载缓存数据的目录的路径。
apc.use_request_time
bool使用 SAPI 请求开始时间作为 TTL。