在PHP中序列化一个大型数组?

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)
  • 你的网络服务器将拥有的负载:当其中一个大型序列化循环运行时,我占用了1个CPU; 如果你同时在同一个页面上有很多用户,我会让你想象它会给予什么;-)
  • 你的用户的耐心^^

但是,除非你真的在序列化长数据大数据,否则我不确定它会那么重要......
你必须考虑使用该缓存的时间/ CPU负载量可能会帮助你获得;-)

不过,知道的最好方法是自己测试,用真实的数据;-)


你可能还想看看Xdebug分析时可以做些什么:这种情况是有用的一种情况!


Byr*_*ock 7

序列化()函数只受可用内存的限制.


zom*_*bat 5

PHP没有强制执行限制.Serialize返回序列化结构的字节流表示(字符串),因此您只需获得一个大字符串.