当前位置:首页 > 开发 > 编程语言 > PHP > 正文

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

发表于: 2011-01-25   作者:bardo   来源:转载   浏览次数:
摘要:  用缓存为网页加速,这是极妙的主意。并且现在有各种缓存可用。memcahce,memcached,apc,xcache,wincache,还有不依赖于扩展的secache. 然而,缓存中只能保存字串。这就需要将数组,对象进行序列化,或者转换成JSON。 也许你会说,简单的序列化就行了。为什么还要JSON。 现在甚至有人将PHP的序列化当成PHP OBJECT

 用缓存为网页加速,这是极妙的主意。并且现在有各种缓存可用。memcahce,memcached,apc,xcache,wincache,还有不依赖于扩展的secache.
 然而,缓存中只能保存字串。这就需要将数组,对象进行序列化,或者转换成JSON。
 也许你会说,简单的序列化就行了。为什么还要JSON。
 现在甚至有人将PHP的序列化当成PHP OBJECT NOTATION。并简称为PHPON。
 可我们面临的是一个很复杂的问题,或者说是两难的选择。容我向你慢慢公布其中的隐情:
 serialize的结果,并不能如你想象,常会出现大量内存开销。而改用JSON,则它也不是万能,最关键的是:
 PHP自身的JSON函数有BUG,PHP代码的JSON速度不敢想象。
 不过目前,只能发一些牢骚,还没有一个好的折衷的方案。
 你运行一下代码就可以发现了。不过下面的代码,是用的json_encode,没有嵌套问题引发BUG。
 当然这只是演示。

<?php

//缓存,序列化,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 , '<br/>';
//反序列化
$array11=phpon::decode($apon1);
echo '反序列化数组',print_r($array11,true),'<br/>';;

//序列化对象,你会发现,序列化,将浮点数变成了超长的字串。浪费了大量的缓存空间。
$o = new phpon();
$opon1=phpon::encode($o);
echo '序列化对象' ,$opon1 , '<br/>';
//JSON对象。可是,PHP自身的JSON函数有BUG,PHP代码的JSON速度不敢想象
$jo=json_encode($o);
echo 'JSON对象', $jo , '<br/>';

?>

 

 以上代码的输出结果:
 序列化数组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

这一篇文章。

 

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

 

 

 

 

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在web开发中对象的序列化与反序列化经常使用,比较主流的有json格式与xml格式的序列化与反序列化,
导读:JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用J
导读:JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用J
ASP.NET中JSON的序列化和反序列化(转载于http://www.cnblogs.com/dajiang02/archive/2011/01/10/193
导读:JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用J
一、JSON简介 对JAavascript有一定了解的人都知道Json JSON(JavaScript Object Notation,JavaScript
JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的
最近在学习FyiReporting的源码,参考FyiReporting的报表对象定义,结合自己在工作中开发报表的应用
程序代码: <html> <head> <title>AJAX的简单使用</title> </head>
php中常规缓存主要有:"file", "database", "apc", "memcached", "redis", "array"等。 1、 APC 缓
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号