如何在不序列化它们的情况下存储我的非常复杂的对象,或者如何使我的反序列化更快?
如果您需要不是的 PHP 对象stdClass
(您在数据成员旁边有类定义),您需要使用任何类型的 PHP 兼容序列化。
独立于 PHP 语言,序列化是有代价的,因为它是数据转换和映射。如果您有大量数据需要从字符串(二进制)信息转换为字符串(二进制)信息,则会占用其处理和内存。
默认情况下,您可以使用 PHP 的内置序列化serialize
和unserialize
. PHP 提供了两种默认的序列化类型。其他扩展提供类似的东西。相关问题:
正如您所说,您需要某种序列化并且反序列化是瓶颈,您可以考虑选择另一个序列化程序,例如igbinary。
但是,将 PHP 存储在平面文件中也可以。见var_export
:
// storing
file_put_contents(
'name-of-data.php', '<?php return ' . var_export($data, true) . ';'
);
此示例以 PHP 可以读取文件的格式存储数据。对于 stdClass 对象和数组形式的结构化数据很有用。读回来很简单:
// reading
$data = include('name-of-data.php');
如果将 PHP 代码放入数据库,则不需要<?php
前缀:
// storing
$string = 'return ' . var_export($data, true) . ';';
$db->store($key, $string);
// reading
$string = $db->read($key);
$data = eval($string);
使用的好处var_export
是您可以使用 PHP 本身来解析数据。它通常比serialize
/快,unserialize
但是对于您的情况,您无论如何都需要对其进行度量。
我建议你尝试var_export
一下它在文件大小和速度方面的表现。还有 igbinary。那就比较吧。收集时将更新的信息与您的问题一起留下,以便在这不能解决您的问题的情况下提供额外的建议。
想到的另一件事是使用 Json 格式。一些数据存储针对它进行了优化,因此您可以直接查询存储。此外,map-reduce 方法可以与这些数据存储中的许多一起使用,因此您可以扩展数据的处理。这是你无法直接理解的东西serialize
/unserialize
因为它总是一次处理一大块数据,你不能有所不同。