用缓存为网页加速,这是极妙的主意。并且现在有各种缓存可用。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
这一篇文章。
(本文这里是原创。抄袭的不会有以上补充的!)
分享到:
相关推荐
在实际的应用中,用户使用浏览器浏览Web应用,都是在向Web...而大部分用户的请求都很类似,因需要将PHP脚本执行的结果进行缓存或将其放到静态的HTML文件中。这样,用户在访问时就直接访问静态HTML网页,不执行PHP脚本。
CPU性能与二级缓存容量的关系——Athlon XP 3000 带来的思考.pdf
Expression表达式树缓存 Expression表达式树序列化
对于在数据流上工作的流程,在运行过程中将序列化为JSON的对象转储到磁盘很方便,以避免将结果缓存在内存中,直到流程完成为止。 为此,必须能够反序列化JSON流。 jstream提供了一个生成器json_objects ,它为python...
python通过Canal进行数据监控后的数据缓存设计(csdn)————程序
阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下版本中存在反序列化风险。Fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...
将获得的数据以对象的形式缓存到本地,本例中实现了: 1.将登陆用户名和密码缓存到本地 2.将缓存的用户名和密码取出显示 本例仅供参考
主要用来缓存处理大量的Json数组的工具类,比如:TCP编程时,客户端或服务端(等等)接收大量Json数据时,由于受到字节数组的长度问题,不能读取一个完整的json字符串,此方法就是用StringBuffer作为缓存处理得到...
学习机器人缓存 缓存还是不缓存——这是个问题!
重建图标缓存——Delphi工具,恢复图标缓存。
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的...Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景
支持自定义规则,标识或平台等,设置不同的解析线路! 支持接口设置超时时间,超过指定时间无响应自动切换线路! 可以根据自己的接口设置不同的请求超时时间,提高响应速度! 线路从上往下失败自动...自备解析json接口
平台化CDN基础架构——ATS缓存系统
Oracle缓存连接——Timesten体系结构 .docx 内存数据库技术
带有内置缓存的快速Rails JSON序列化。 为什么? 那里有很多Rails序列化器,但是如今维护和性能良好的很少。 那些倾向于将您锁定在如何格式化JSON响应的特定标准中。 至少可以说,向成熟的Rails应用程序全面引入...
安卓异步加载Json缓存优化,一个小Demo,演示安卓异步加载Json缓存优化。
Android之本地缓存——LruCache(内存缓存)与DiskLruCache(硬盘缓存)统一框架 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
作为缓存,用来处理接收的大量Json数据,比如TCPServer或者Client接收到大量Json数据时
Kashmir是一个Ruby DSL使得序列化和缓存对象易如反掌