Jas*_*vis 14 php serialization
我很好奇,PHP中的序列化是否有大小限制.是否可以使用5,000个键和值序列化数组,以便将其存储到缓存中?
我希望在社交网站上缓存用户朋友列表,缓存需要经常更新,但几乎每个页面加载都需要读取缓存.
在单个服务器设置上,我假设APC会比memcache更好.
Pas*_*TIN 27
正如其他人已经回答的那样,只是为了好玩,这是一个非常快速的基准(我敢称之为?) ; 考虑以下代码:
$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());
Run Code Online (Sandbox Code Playgroud)
我在PHP 5.2.6(与Ubuntu jaunty捆绑的那个)上运行它.
而且,是的,只有价值观; 没钥匙; 而且值非常简单:没有对象,没有子数组,只有字符串.
因为$num = 1,你得到:
float(11.8147978783)
int(1702688)
Run Code Online (Sandbox Code Playgroud)
因为$num = 10,你得到:
float(13.1230671406)
int(2612104)
Run Code Online (Sandbox Code Playgroud)
而且,因为$num = 100,你得到:
float(63.2925770283)
int(11621760)
Run Code Online (Sandbox Code Playgroud)
因此,似乎数组的每个元素越大,所需的时间越长(实际上看起来很公平).但是,对于100倍大的元素,你不需要花费100倍的时间......
现在,使用50000个元素的数组,而不是5000,这意味着这部分代码被更改:
$list = array_fill(0, 50000, str_repeat('1234567890', $num));
Run Code Online (Sandbox Code Playgroud)
有了$num = 1,你得到:
float(158.236332178)
int(15750752)
Run Code Online (Sandbox Code Playgroud)
考虑到花费1的时间,我将不会为$ num = 10或$ num = 100运行此...
是的,当然,在真实的情况下,你不会这样做10000次; 所以让我们尝试只有10次迭代的for循环.
用于$num = 1:
float(0.206310987473)
int(15750752)
Run Code Online (Sandbox Code Playgroud)
用于$num = 10:
float(0.272629022598)
int(24849832)
Run Code Online (Sandbox Code Playgroud)
并为$num = 100:
float(0.895547151566)
int(114949792)
Run Code Online (Sandbox Code Playgroud)
是的,这几乎是1秒 - 并且使用了相当多的内存^^
(不,这不是生产服务器:我在这台开发机器上有一个相当高的memory_limit ^^)
所以,最后,要比那些数字短一点- 是的,你可以让数字说出你想要的任何东西 -我不会说在PHP中的"硬编码"中有一个"限制" ,但你最终会遇到其中一个:
max_execution_time (通常,在网络服务器上,它不会超过30秒)memory_limit (在网络服务器上,它一般不超过32MB)但是,除非你真的在序列化长数据大数据,否则我不确定它会那么重要......
你必须考虑使用该缓存的时间/ CPU负载量可能会帮助你获得;-)
不过,知道的最好方法是自己测试,用真实的数据;-)
你可能还想看看Xdebug在分析时可以做些什么:这种情况是有用的一种情况!