我将大块日志数据存储在memcache中,以便稍后将其扔入数据库。在对服务器的每个请求中,我使用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()从根本上不兼容?
你可以尝试下划线'_',只是因为它自然不是一个分隔符,所以可能工作...没有测试过,但没有做过,但probs值得一试。 – AdamJeffers
当我说二进制数据包含换行符时,我有点不确切;因为它是二进制的,它根本没有字符。但是explode()会将任何'0A'解释为换行符。我想我的问题归结为:'是否有任何字节组合不在我可以爆炸的二进制数据中?或者也许除了爆炸()用来检索离散数据块的方法? – Jerry