假设我有一个相当大的100k 个元素的关联数组,如下所示:
$resources = array(
'stone'=>'current_stone.gif',
'stick'=>'uglystick.jpg',
...
);
Run Code Online (Sandbox Code Playgroud)
存储在一个名为resources.php的文件中,它在运行时永远不会改变。
我想在 Zend opcache 中拥有这些数据,以便在所有进程中共享它(节省内存)并可能加快查找速度。
我目前的假设是,在这种形式下,这个数组不会存储在 opcache 中,因为它没有在任何地方定义为静态结构。
我将如何确保这些数据进入 opcache?
上面的答案是错误的。变量存储在操作码缓存中。
您可以通过创建大量数据、将其存储在 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)以避免错误)是迄今为止缓存数据的最有效方法。
| 归档时间: |
|
| 查看次数: |
2150 次 |
| 最近记录: |