`
bardo
  • 浏览: 378852 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11820
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10127
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9516
社区版块
存档分类
最新评论

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

    博客分类:
  • PHP
阅读更多

 用缓存为网页加速,这是极妙的主意。并且现在有各种缓存可用。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

这一篇文章。

 

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

 

 

 

 

2
9
分享到:
评论

相关推荐

    PHP缓存与静态化——PHP缓存与静态化

    在构建高性能的Web应用时,PHP缓存与静态化扮演着至关重要的角色。它们能够显著提升网站的响应速度,减少服务器资源的消耗,尤其对于高流量的动态网站来说更是如此。下面将详细探讨这两个概念以及如何在PHP中实现...

    关于XML、JSON的序列化、发序列化对象或集合

    XML和JSON是当前最广泛使用的数据交换格式,它们的序列化和反序列化是软件开发中的常见需求。本文将详细介绍XML和JSON的序列化和反序列化对象或集合的实现方法。 XML序列化 XML(Extensible Markup Language)是一...

    delphi_BaseObject_json序列化反序列化1

    本主题聚焦于在Delphi中实现JSON序列化和反序列化的技术,特别是针对"BaseObject"类的实例。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其简洁性和易读性而被广泛应用。 首先,我们需要了解...

    C# 序列化为php序列化格式的类库 for C#

    1. **对象到JSON转换**:C#中通常使用Json.NET库进行对象的JSON序列化,而PHP也有自己的json_encode函数处理JSON。类库可能实现了C#对象到JSON的转换,并确保转换后的JSON格式符合PHP的标准。 2. **特殊类型处理**...

    看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇

    在本篇文档中,主题聚焦于“看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇”,探讨了Java语言中JSON处理库的安全问题和防御措施。首先,我们将分析目前主流的JSON处理库,包括Gson、Jackson和Fastjson,并...

    cpp-metajson非侵入性高性能的C17轻量级JSON序列化工具

    **cpp-metajson:非侵入性、高性能的C++17 JSON序列化库** cpp-metajson是一款专为C++17设计的轻量级JSON序列化工具,其核心特性在于非侵入性和高性能。非侵入性意味着该库不会要求你修改原有的数据结构来适应JSON...

    CPU性能与二级缓存容量的关系——Athlon XP 3000 带来的思考.pdf

    《CPU性能与二级缓存容量的关系——Athlon XP 3000 带来的思考》 CPU性能的提升一直是计算机技术发展的重要驱动力之一,其中二级缓存容量的大小对于处理器性能的影响尤为显著。本文将深入探讨二级缓存与CPU性能之间...

    C#源码序列化与反序列化

    在C#编程中,序列化和反序列化是至关重要的技术,它们允许对象的状态被转换为数据格式,以便存储或在网络上传输。本篇将详细探讨C#中的高级序列化和反序列化机制,以及如何在实际项目中有效利用它们。 1. **什么是...

    JSON Schema 校验库——json-schema-validator(java版本).rar

    在给定的压缩包中,`JSON Schema 校验库——json-schema-validator(java版本).pdf`可能是该库的使用指南或API文档,可以帮助开发者深入理解如何在Java项目中有效利用`json-schema-validator`进行JSON数据验证。...

    IOS应用源码——自动序列化AutoEncodeDecode.rar

    在iOS开发中,序列化是一种将对象转换为可存储或传输格式的过程,而反序列化则是将这种格式恢复为原始对象。本项目"AutoEncodeDecode"聚焦于iOS应用中的自动序列化与反序列化技术,这在数据持久化、网络通信等方面...

    Android缓存——将数据以对象的方式缓存到本地

    在Android开发中,数据缓存是一项重要的技术,它能够提高应用程序的性能和用户体验。当用户访问数据时,如果数据已经被缓存,系统可以快速地从本地读取,避免了网络延迟或频繁数据库查询带来的影响。本示例"Android...

    spring整合redis(spring模板+连接池+json序列化+cluster集群).zip

    本篇文章将深入探讨如何在Spring项目中整合Redis,包括使用Spring模板、连接池、JSON序列化以及设置Redis集群。 1. **Spring模板**: Spring的`RedisTemplate`是操作Redis的主要工具,它提供了一套完整的API来执行...

    Ruby-Kashmir是一个RubyDSL使得序列化和缓存对象易如反掌

    通过DSL,我们可以清晰地看到对象是如何被序列化以及如何在Redis中被缓存的。 **4. 版本控制与兼容性** 在IFTTT-kashmir-fda505f这个特定版本中,可能包含了针对序列化和缓存策略的改进或修复。开发者应当查看该...

    序列化和反序列化

    在.NET框架中,可以使用`BinaryFormatter`、`XmlSerializer`、`DataContractSerializer`或`Json.NET`等工具进行序列化。不同的序列化方法有不同的优缺点,例如,二进制序列化通常更紧凑,但可读性较差;XML和JSON...

    C#序列化与反序列化

    在C#编程中,序列化和反序列化是两个关键的概念,它们对于数据存储、网络传输和持久化具有重要作用。序列化是指将对象的状态转换为可存储或传输的形式,如XML、JSON或二进制流;反序列化则是将这些形式的数据恢复为...

    json-stream:反序列化JSON对象流

    对于在数据流上工作的流程,在运行过程中将序列化为JSON的对象转储到磁盘很方便,以避免将结果缓存在内存中,直到流程完成为止。 为此,必须能够反序列化JSON流。 jstream提供了一个生成器json_objects ,它为python...

    预警事项:Fastjson反序列化远程代码执行漏洞风险预警

    阿里巴巴发布关于Fastjson安全公告,在1.2.80及以下版本中存在反序列化风险。Fastjson是阿里巴巴的开源JSON解析库,可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...

    重建图标缓存——Delphi工具

    在"重建图标缓存——Delphi工具"中,开发者利用Delphi的强大功能创建了一个专门用于解决图标缓存问题的应用程序。 该工具的主要功能是清理并重建系统的图标缓存,以恢复正常显示。在Windows中,这个过程通常涉及...

    Java缓存处理大量Json数组 StringBufferCacheUtil.java

    主要用来缓存处理大量的Json数组的工具类,比如:TCP编程时,客户端或服务端(等等)接收大量Json数据时,由于受到字节数组的长度问题,不能读取一个完整的json字符串,此方法就是用StringBuffer作为缓存处理得到...

Global site tag (gtag.js) - Google Analytics