静态数组是否存储在 opcache 中?

U00*_*001 1 opcache

假设我有一个相当大的100k 个元素的关联数组,如下所示:

$resources = array(
'stone'=>'current_stone.gif',
'stick'=>'uglystick.jpg',
...
);
Run Code Online (Sandbox Code Playgroud)

存储在一个名为resources.php的文件中,它在运行时永远不会改变

我想在 Zend opcache 中拥有这些数据,以便在所有进程中共享它(节省内存)并可能加快查找速度。

我目前的假设是,在这种形式下,这个数组不会存储在 opcache 中,因为它没有在任何地方定义为静态结构。

我将如何确保这些数据进入 opcache?

Art*_*rty 5

上面的答案是错误的。变量存储在操作码缓存中。

您可以通过创建大量数据、将其存储在 PHP 文件中并使用 opcache_get_status() 检查缓存统计信息来测试它。结果包括列出所有缓存文件和已用内存的“脚本”数组。

我写了几个缓存文件,它们只有一个庞大的数组。其中之一是 24.1Mb

这是转储结果print_r(opcache_get_status())

Array
(
    [opcache_enabled] => 1
    ...
    [scripts] => Array
    (
        ...
        [/test/noto.php] => Array
            (
                [full_path] => /test/noto.php
                [hits] => 3
                [memory_consumption] => 24591120
                [last_used] => Sat Nov 24 21:09:58 2018
                [last_used_timestamp] => 1543086598
                [timestamp] => 1543086378
            )

        ...
    )
)
Run Code Online (Sandbox Code Playgroud)

所以它肯定和所有数据一起存储在内存中。

为了确保确实如此,我制作了几个文件,它们的数据总大小约为 300Mb。如果没有 opcache,加载它们大约需要 1.5 秒。然后在初始加载后它会被缓存,加载所有数据需要 2 毫秒。相差近1000倍。

因此,将缓存存储在将由 Zend OPcache 缓存的 PHP 文件中并使用 include 来包含它(try..catch(\Throwable $e)以避免错误)是迄今为止缓存数据的最有效方法。