用于大型阵列变量(22MB)的APC内存缓存


APC memory caching for a large array variable (22MB)

我有一个大的2D数组,我将其序列化以存储在文件中。序列化后的文件大约为9.5MB,从磁盘读取大约需要.05秒。要访问数组,取消序列化过程大约需要1.3秒,这太长了。

我想做的是先取消数组的序列化,然后将该数组存储为APC缓存变量。当我使用apc_storeapc_add时,我遇到了服务器超时/找不到错误的问题。如果我注释掉apc_store代码,那么它会很好,但数组不会被缓存。我对缓存1MB左右的较小测试文件/阵列没有问题。从下面的php代码中,我发现有问题的数组的内存大小约为22MB。

以下是我在php.ini 中的apc设置

apc.shm_segments = 1
apc.shm_size = 512M
apc.ttl = 7200
apc.user_ttl = 7200
apc.num_files_hint = 1024
apc.enable_cli = 1
apc.max_file_size = 512M
apc.stat=1

我正在使用xampp在本地机器上测试我的代码。有人能建议我如何解决服务器超时的问题吗?

这只是我的缓存测试例程:

$startunser = microtime(true);
if ($quote = apc_fetch('serialfile')) {
        echo "<br> serfile [cached] ";
} 
else {
    $start_memory = memory_get_usage();
    $sF = "seri.txt";
    $sxx = file_get_contents($sF);
    $pro = unserialize($sxx);
    apc_store('serfile', $pro, 10);
    echo "<br>serfile is NOT cached ";
    echo memory_get_usage() - $start_memory;
}
$elapsedunser = microtime(true) - $startunser;
echo "<p>The unserialize process took $elapsedunser seconds";
return;

对于任何好奇的人来说,还有一个有趣的附带说明,当我回忆起(使用apc_fetch)apc中的一个数组时,该数组是从大约1MB的序列化文件中未序列化的,实际上,fetch过程比从磁盘中读取文件并取消序列化文件要长(.5秒对.4秒)。一开始我也不相信。

TIA

APC并不适合存储那么大的数据。您是否尝试过将数据串行化为PHP代码(例如使用var_dump),并将其写为要包含的.PHP文件?不过,这可能仍然太大,无法处理。