【问题标题】:PHP APC - Why is loading cached array op codes slow?PHP APC - 为什么加载缓存的数组操作码很慢?
【发布时间】:2012-07-03 00:26:18
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 您的意思是硬编码数组,如城市列表、邮政编码等?
  • 我不得不问,为什么每次请求都加载 270 kB 的数组?将这些内容保存在数据库中,或者至少将其拆分为多个类文件并使用自动加载器按需加载它们。
  • 我可能应该使用多个文件。我没有将它放入数据库,因为我的 mysql 服务器和 Web 服务器位于不同的计算机上,并且有 35 毫秒的 ping 时间。很多文件是美国 3000 个县的数组。但有趣的是,最大的数组加载时间并不长。所以我可以把它分成更小的文件,但是知道它们什么时候需要加载是很困难的。
  • 更新:加载大县数组 (180 kb) 需要 4 毫秒。其余常量 (90 kb) 需要 196 毫秒才能加载。
  • 更新:问题在于使用 gettext 库翻译所有内容。当我摆脱大约 1000 个函数调用时,加载时间减少到 6 毫秒。

标签: php apc opcode-cache


【解决方案1】:

您的所有阵列在存储在缓存中时都需要为serialized,然后在从缓存中加载它们时再次为unserialised,这会花费时间并且可能是您遇到的速度损失的重要因素。 (供您参考:Serialisation)

speed up serialisation 的一种方法是使用igbinary,通过将apc.serializer=igbinary 放入 php.ini 或通过 APC 的 ini 文件中,igbinary 可以与 APC 无缝使用。 (注意:这需要 APC >= 3.1.7)

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多