这些函数的行为受 php.ini 中的设置影响。
虽然默认的 APCu 设置对于许多安装来说已经足够好,但严肃的用户应该考虑调整以下参数。
配置 APCu 需要做出一个决定。要为 APCu 分配多少内存。控制此设置的 ini 指令是 apc.shm_size
,请仔细阅读下面有关此指令的部分。
服务器运行后,应该将与扩展捆绑在一起的 apc.php
脚本复制到文档根目录中的某个位置,并使用浏览器查看,因为它提供了对 APCu 内部工作原理的详细分析。如果 PHP 中启用了 GD,它甚至会显示一些有趣的图表。
如果 APCu 正常工作,Cache full count
数字(左侧)将显示缓存达到最大容量并必须清除条目以释放内存的次数。在清除过程中,如果指定了 apc.ttl
,APCu 将首先尝试删除已过期的条目,即 TTL 已过期或没有设置 TTL 且在过去 apc.ttl
秒内没有访问过的条目。如果未设置 apc.ttl
,或者删除过期条目没有释放足够的内存,APCu 将清除整个缓存。
在一个配置良好的缓存中,清除次数应该很少。如果缓存不断被填充,从而被迫释放,由此产生的波动将对脚本性能产生不利影响。最简单的最小化此数字的方法是为 APCu 分配更多内存。
当 APCu 使用 mmap 支持(内存映射)编译时,它将只使用一个内存段,这与 APCu 使用 SHM(SysV 共享内存)支持构建时使用多个内存段不同。MMAP 没有像 SHM 在 /proc/sys/kernel/shmmax
中那样有最大限制。一般来说,建议使用 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每个共享内存段的大小,由 此 FAQ 中描述的简写符号表示。默认情况下,一些系统(包括大多数 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。
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。