为了账号安全,请及时绑定邮箱和手机立即绑定

存储PHP数组的首选方法(json_encode vs序列化)

存储PHP数组的首选方法(json_encode vs序列化)

PHP
一只斗牛犬 2019-06-26 15:04:58
存储PHP数组的首选方法(json_encode vs序列化)为了缓存的目的,我需要将多维关联数组数据存储在一个平面文件中。我偶尔会发现需要将其转换为JSON,以便在我的Web应用程序中使用,但大部分时间我将直接使用PHP中的数组。在这个文本文件中将数组存储为JSON还是PHP序列化数组会更有效吗?我环顾四周,似乎在PHP(5.3)的最新版本中,json_decode实际上比unserialize.目前,我倾向于将数组存储为JSON,因为我觉得如果有必要的话,它更容易被人读取,它可以在PHP和JavaScript中使用,只需花费很少的努力,而且从我所读到的内容来看,解码速度甚至可能更快(不过,对编码不太确定)。有人知道有什么陷阱吗?有谁有很好的基准来显示这两种方法的性能优势?
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

取决于你的轻重缓急。

如果性能是你绝对的驾驶特点,那么一定要使用最快的。在做出选择之前,一定要充分理解这些差异。

  • 不像

    serialize()

    您需要添加额外的参数以保持UTF-8字符不受影响:

    json_encode($array, JSON_UNESCAPED_UNICODE)

    (否则,它会将UTF-8字符转换为Unicode转义序列)。
  • JSON将没有对象的原始类的内存(它们总是被还原为stdClass的实例)。
  • 你不能利用

    __sleep()

    __wakeup()

    用JSON
  • 默认情况下,只有公共属性使用JSON序列化。(在

    PHP>=5.4

    你可以实现

    JsonSerialable

    若要更改此行为,请执行以下操作。
  • JSON更便携

而且可能还有一些其他的差异,我现在无法想象。

一种简单的速度测试来比较这两种情况

<?php

ini_set('display_errors', 1);error_reporting(E_ALL);// Make a big, honkin test array// You may need to adjust this depth to avoid memory limit errors$testArray = fillArray(0, 5);// Time json encoding$start = microtime(true);json_encode($testArray);$jsonTime = microtime(true) - $start;echo "JSON encoded in $jsonTime seconds\n";// Time serialization$start = microtime(true);serialize($testArray);$serializeTime = microtime(true) - $start;echo "PHP serialized in $serializeTime seconds\n";// Compare themif ($jsonTime < $serializeTime) {
    printf("json_encode() was roughly %01.2f%% faster than serialize()\n", ($serializeTime / $jsonTime - 1) * 100);}else if ($serializeTime < $jsonTime ) {
    printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);} else {
    echo "Impossible!\n";}function fillArray( $depth, $max ) {
    static $seed;
    if (is_null($seed)) {
        $seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
    }
    if ($depth < $max) {
        $node = array();
        foreach ($seed as $key) {
            $node[$key] = fillArray($depth + 1, $max);
        }
        return $node;
    }
    return 'empty';}


查看完整回答
反对 回复 2019-06-26
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

杰森比PHP的序列化格式更简单和更快,应该使用除非:

  • 您正在存储深度嵌套数组:

    json_decode()

    :“如果JSON编码的数据深于127个元素,此函数将返回false。”
  • 您正在存储需要非序列化为正确类的对象
  • 您正在与不支持json_decode的旧PHP版本交互


查看完整回答
反对 回复 2019-06-26
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我写了一篇关于这个主题的博客:“缓存一个大数组:json、序列化还是var_export?“.在这篇文章中,序列化是从小到大数组的最佳选择,对于非常大的数组(>70 MB),JSON是更好的选择。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 818 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信