我很好奇,在 PHP 中序列化是否有大小限制。是否可以序列化一个包含 5,000 个键和值的数组,以便将其存储到缓存中?
我希望在社交网站上缓存用户好友列表,缓存需要经常更新,但几乎每次页面加载都需要读取。
在单个服务器设置上,我假设 APC 会比 memcache 更好。
最佳答案
正如许多其他人已经回答的那样,只是为了好玩,这里有一个非常快速的基准测试(我敢这么调用它吗?);考虑以下代码:
$num = 1;
$list = array_fill(0, 5000, str_repeat('1234567890', $num));
$before = microtime(true);
for ($i=0 ; $i<10000 ; $i++) {
$str = serialize($list);
}
$after = microtime(true);
var_dump($after-$before);
var_dump(memory_get_peak_usage());
我在 PHP 5.2.6(与 Ubuntu jaunty 捆绑在一起的版本)上运行它。
而且,是的,只有值;没有 key ;值非常简单:没有对象,没有子数组,只有字符串。
对于$num = 1
,你得到:
float(11.8147978783)
int(1702688)
对于$num = 10
,你得到:
float(13.1230671406)
int(2612104)
并且,对于 $num = 100
,您会得到:
float(63.2925770283)
int(11621760)
因此,似乎数组的每个元素越大,花费的时间就越长(实际上看起来很公平)。但是,对于大 100 倍的元素,您不会花费 100 倍的时间...
现在,有了 50000 个元素的数组,而不是 5000,这意味着这部分代码已更改:
$list = array_fill(0, 50000, str_repeat('1234567890', $num));
使用$num = 1
,你得到:
float(158.236332178)
int(15750752)
考虑到 1 所花费的时间,我不会为 $num = 10 或 $num = 100 运行它...
是的,当然,在真实情况下,您不会这样做 10000 次;所以让我们尝试仅对 for 循环进行 10 次迭代。
对于 $num = 1
:
float(0.206310987473)
int(15750752)
对于 $num = 10
:
float(0.272629022598)
int(24849832)
对于 $num = 100
:
float(0.895547151566)
int(114949792)
是的,这将近 1 秒——并且占用了相当多的内存 ^^
(不,这不是生产服务器:我在这台开发机器上有相当高的 memory_limit ^^)
所以,最后,要比那些数字短一点 -- 是的,你可以让数字说出你想要的任何东西-- 我不会说有一个“限制”与 PHP 中的“硬编码”一样,但您最终将面临其中之一:
max_execution_time
(通常,在网络服务器上,它永远不会超过 30 秒)memory_limit
(在网络服务器上,一般不超过 32MB)- 您的网络服务器将承受的负载:当那些大序列化循环中的 1 个正在运行时,它占用了我的 1 个 CPU;如果您同时在同一页面上有很多用户,我让您想象一下它会带来什么;-)
- 用户的耐心 ^^
但是,除非您真的要序列化大数据的长数组,否则我不确定它是否重要...
并且您必须考虑使用该缓存的时间/CPU 负载量可能会帮助您获得 yield ;-)
不过,最好的了解方式还是自己用真实数据进行测试 ;-)
关于php - 在 PHP 中序列化一个大数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1256949/