【发布时间】:2015-10-26 21:33:47
【问题描述】:
我将日志数据块存储在内存缓存中,以便稍后放入数据库。在对服务器的每个请求中,我使用 memcached::append() 保存一组数据,并使用换行符来分隔块。简化版本如下所示:
$myCache->append('log', serialize($myArray)."\n");
稍后当我想构建可能查询时,我将所有行从数据库中拉出并反序列化每一行:
$dataToInsert = explode("\n", $myCache->get('log'));
$dataToInsert = array_map(function($row) {
return unserialize($row);
}, $dataToInsert);
这适用于内置的 serialize() 和 unserialize(),但我想利用 igbinary 的明显优势 - 大小和速度。不幸的是,当我替换函数的 igbinary 版本时,我得到了错误。
似乎 igbinary 序列化数据可以包含“\n”字符,所以当我分解隐藏的数据时,它会创建部分行,当然会失败。
除了换行符之外,我是否可以使用分隔符来分隔 igbinary 数据块,或者 igbinary 和 append() 根本不兼容?
【问题讨论】:
-
您可以尝试使用下划线
_,因为它自然不是分隔符,因此可能会起作用...未经测试,之前未做过,但值得一试。 -
当我说二进制数据包含换行符时,我有点不精确;因为它是二进制的,所以它根本没有字符。但是explode() 会将任何
0A解释为换行符。我想我的问题归结为,'是否有任何字节组合不会出现在我可以爆炸的 igbinary 数据中?或者也许是除了explode() 之外的方法来检索离散数据块?