php json有缓存,缓存,序列化,JSON————PHP中的隐忧

缓存,序列化,JSON————PHP中的隐痛

用缓存为网页加速,这是极妙的主意。并且现在有各种缓存可用。memcahce,memcached,apc,xcache,wincache,还有不依赖于扩展的secache.

然而,缓存中只能保存字串。这就需要将数组,对象进行序列化,或者转换成JSON。

也许你会说,简单的序列化就行了。为什么还要JSON。

现在甚至有人将PHP的序列化当成PHP OBJECT NOTATION。并简称为PHPON。

可我们面临的是一个很复杂的问题,或者说是两难的选择。容我向你慢慢公布其中的隐情:

serialize的结果,并不能如你想象,常会出现大量内存开销。而改用JSON,则它也不是万能,最关键的是:

PHP自身的JSON函数有BUG,PHP代码的JSON速度不敢想象。

不过目前,只能发一些牢骚,还没有一个好的折衷的方案。

你运行一下代码就可以发现了。不过下面的代码,是用的json_encode,没有嵌套问题引发BUG。

当然这只是演示。

//缓存,序列化,JSON————PHP中的隐痛

class phpon{

var $a=1.2;

var $b='ac';

function encode($data){

return serialize($data);

}

function decode($str){

return unserialize($str);

}

}

$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);

//序列化数组

$apon1=phpon::encode($array1);

echo '序列化数组', $apon1 , '
';

//反序列化

$array11=phpon::decode($apon1);

echo '反序列化数组',print_r($array11,true),'
';;

//序列化对象,你会发现,序列化,将浮点数变成了超长的字串。浪费了大量的缓存空间。

$o = new phpon();

$opon1=phpon::encode($o);

echo '序列化对象' ,$opon1 , '
';

//JSON对象。可是,PHP自身的JSON函数有BUG,PHP代码的JSON速度不敢想象

$jo=json_encode($o);

echo 'JSON对象', $jo , '
';

?>

以上代码的输出结果:

序列化数组a:4:{s:4:"blue";i:1;s:3:"red";i:2;s:5:"green";i:3;s:6:"purple";i:4;}

反序列化数组Array ( [blue] => 1 [red] => 2 [green] => 3 [purple] => 4 )

序列化对象O:5:"phpon":2:{s:1:"a";d:1.1999999999999999555910790149937383830547332763671875;s:1:"b";s:2:"ac";}

JSON对象{"a":1.2,"b":"ac"}

补充一下。如果条件允许,可以使用igbinary这一个未进PECL的扩展。这是memcached所用的序列化函数库。igbinary安装完成后,函数即可用,因为是二进制处理的,所以效率高,字节数占用少。

更多可以参考:http://blog.rebill.info/archives/igbinary-vs-serialize-vs-json_encode.html

这一篇文章。

(本文这里是原创。抄袭的不会有以上补充的!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值