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

标签 php serialization

我很好奇,在 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 ;-)

不过,最好的了解方式还是自己用真实数据进行测试 ;-)


您可能还想看看 Xdebug 在涉及到 profiling 时可以做什么:这种情况是它有用的情况之一!

关于php - 在 PHP 中序列化一个大数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1256949/

相关文章:

c# - 无法使序列化信息出现在 XML 中

c# - XmlSerializer.Deserialize 方法可以抛出哪些类型的异常?

java - 在Java中,除了jdk序列化之外,还有其他方法来序列化类信息吗?

java - 如何不将组合对象包含到 json 中?

PHP 无法从表中删除

php - 从中选择 $x(php 变量)

php - Prestashop 后台加载为问号

c++ - 指针 vector C++ Boost 序列化错误

php - 我无法在本地主机上运行任何 PHP 文件(使用 IIS 时出现 HTTP 404.3 错误)

javascript - $_REQUEST ['id' ] 从 javascript 调用的 php 文件内的页面到另一个 php 页面