PHP APC - 为什么加载缓存的数组操作码很慢


PHP APC - Why is loading cached array op codes slow?

我正在使用APC来减少PHP文件的加载时间。 我的文件加载速度非常快,除了一个文件,我定义了 100 多个数组。 此 270 kb 文件需要 200 毫秒才能加载。 其余文件充满了对象、方法和函数。

我想知道:OP 代码缓存对数组不起作用吗?

我的 APC 缓存应该足够大,可以处理我的所有类。 目前我的缓存中有 40% 是空闲的。 我的命中率是99%。

apc.shm_size=32 M
apc.max_file_size = 1M
apc.shm_segments= 1

APC 3.1.6

我使用的是PHP 5.2,Apache 2和Windows Vista。

所有数组在存储在缓存中时都需要序列化,然后在从缓存加载它们时再次取消序列化,这需要时间,并且可能是您遇到的速度损失的重要因素。(供参考:序列化)

加快

序列化速度的一种方法是使用igbinary,igbinary可以通过apc.serializer=igbinary放在php中或通过APC.ini放在通过APC的ini文件中与APC无缝使用。(注意:这需要 APC>= 3.1.7)

您也可以将 apc.stat(在同一个 ini 文件中)作为 0 放置,这样它只检查文件修改一次,而不是每次。

关于操作码缓存的一件事是,除非您正确配置了它,否则它将继续统计每个文件以查找更改。如果您需要解析许多文件并将其转换为操作码,这可能会导致大量开销。

您通常可以通过设置apc.stat = 0来获得性能的巨大提升。 但是,请注意,为了更改代码,您需要调用apc_clear_cache()或重新启动 apache。

http://www.php.net/manual/en/apc.configuration.php#ini.apc.stat

问题是使用 gettext 库来翻译所有内容。当我摆脱大约 1000 个函数调用时,加载时间从 200 毫秒减少到 6 毫秒。

我的猜测是,数据的序列化也是一个问题,但它是次要的。