用缓存为网页加速,这是极妙的主意。并且现在有各种缓存可用。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应用时,PHP缓存与静态化扮演着至关重要的角色。它们能够显著提升网站的响应速度,减少服务器资源的消耗,尤其对于高流量的动态网站来说更是如此。下面将详细探讨这两个概念以及如何在PHP中实现...
XML和JSON是当前最广泛使用的数据交换格式,它们的序列化和反序列化是软件开发中的常见需求。本文将详细介绍XML和JSON的序列化和反序列化对象或集合的实现方法。 XML序列化 XML(Extensible Markup Language)是一...
本主题聚焦于在Delphi中实现JSON序列化和反序列化的技术,特别是针对"BaseObject"类的实例。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁性和易读性而被广泛应用。 首先,我们需要了解...
1. **对象到JSON转换**:C#中通常使用Json.NET库进行对象的JSON序列化,而PHP也有自己的json_encode函数处理JSON。类库可能实现了C#对象到JSON的转换,并确保转换后的JSON格式符合PHP的标准。 2. **特殊类型处理**...
在本篇文档中,主题聚焦于“看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇”,探讨了Java语言中JSON处理库的安全问题和防御措施。首先,我们将分析目前主流的JSON处理库,包括Gson、Jackson和Fastjson,并...
**cpp-metajson:非侵入性、高性能的C++17 JSON序列化库** cpp-metajson是一款专为C++17设计的轻量级JSON序列化工具,其核心特性在于非侵入性和高性能。非侵入性意味着该库不会要求你修改原有的数据结构来适应JSON...
《CPU性能与二级缓存容量的关系——Athlon XP 3000 带来的思考》 CPU性能的提升一直是计算机技术发展的重要驱动力之一,其中二级缓存容量的大小对于处理器性能的影响尤为显著。本文将深入探讨二级缓存与CPU性能之间...
在C#编程中,序列化和反序列化是至关重要的技术,它们允许对象的状态被转换为数据格式,以便存储或在网络上传输。本篇将详细探讨C#中的高级序列化和反序列化机制,以及如何在实际项目中有效利用它们。 1. **什么是...
在给定的压缩包中,`JSON Schema 校验库——json-schema-validator(java版本).pdf`可能是该库的使用指南或API文档,可以帮助开发者深入理解如何在Java项目中有效利用`json-schema-validator`进行JSON数据验证。...
在iOS开发中,序列化是一种将对象转换为可存储或传输格式的过程,而反序列化则是将这种格式恢复为原始对象。本项目"AutoEncodeDecode"聚焦于iOS应用中的自动序列化与反序列化技术,这在数据持久化、网络通信等方面...
在Android开发中,数据缓存是一项重要的技术,它能够提高应用程序的性能和用户体验。当用户访问数据时,如果数据已经被缓存,系统可以快速地从本地读取,避免了网络延迟或频繁数据库查询带来的影响。本示例"Android...
本篇文章将深入探讨如何在Spring项目中整合Redis,包括使用Spring模板、连接池、JSON序列化以及设置Redis集群。 1. **Spring模板**: Spring的`RedisTemplate`是操作Redis的主要工具,它提供了一套完整的API来执行...
通过DSL,我们可以清晰地看到对象是如何被序列化以及如何在Redis中被缓存的。 **4. 版本控制与兼容性** 在IFTTT-kashmir-fda505f这个特定版本中,可能包含了针对序列化和缓存策略的改进或修复。开发者应当查看该...
在.NET框架中,可以使用`BinaryFormatter`、`XmlSerializer`、`DataContractSerializer`或`Json.NET`等工具进行序列化。不同的序列化方法有不同的优缺点,例如,二进制序列化通常更紧凑,但可读性较差;XML和JSON...
在C#编程中,序列化和反序列化是两个关键的概念,它们对于数据存储、网络传输和持久化具有重要作用。序列化是指将对象的状态转换为可存储或传输的形式,如XML、JSON或二进制流;反序列化则是将这些形式的数据恢复为...
对于在数据流上工作的流程,在运行过程中将序列化为JSON的对象转储到磁盘很方便,以避免将结果缓存在内存中,直到流程完成为止。 为此,必须能够反序列化JSON流。 jstream提供了一个生成器json_objects ,它为python...
阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下版本中存在反序列化风险。Fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...
在"重建图标缓存——Delphi工具"中,开发者利用Delphi的强大功能创建了一个专门用于解决图标缓存问题的应用程序。 该工具的主要功能是清理并重建系统的图标缓存,以恢复正常显示。在Windows中,这个过程通常涉及...
主要用来缓存处理大量的Json数组的工具类,比如:TCP编程时,客户端或服务端(等等)接收大量Json数据时,由于受到字节数组的长度问题,不能读取一个完整的json字符串,此方法就是用StringBuffer作为缓存处理得到...