存储 PHP 数组的首选方法(json_encode 与序列化) [英] Preferred method to store PHP arrays (json_encode vs serialize)

查看:14
本文介绍了存储 PHP 数组的首选方法(json_encode 与序列化)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在平面文件中存储一个多维关联数据数组以用于缓存目的.我可能偶尔会遇到需要将其转换为 JSON 以在我的网络应用程序中使用的情况,但绝大多数时间我将直接在 PHP 中使用该数组.

I need to store a multi-dimensional associative array of data in a flat file for caching purposes. I might occasionally come across the need to convert it to JSON for use in my web app but the vast majority of the time I will be using the array directly in PHP.

在此文本文件中将数组存储为 JSON 还是 PHP 序列化数组会更有效吗?我环顾四周,似乎在最新版本的 PHP (5.3) 中,json_decode 实际上比 unserialize 快.

Would it be more efficient to store the array as JSON or as a PHP serialized array in this text file? I've looked around and it seems that in the newest versions of PHP (5.3), json_decode is actually faster than unserialize.

我目前倾向于将数组存储为 JSON,因为我觉得如果有必要,它更容易被人类阅读,它可以在 PHP 和 JavaScript 中使用,只需很少的努力,并且从我读过的内容来看,它解码甚至可能更快(但不确定编码).

I'm currently leaning towards storing the array as JSON as I feel its easier to read by a human if necessary, it can be used in both PHP and JavaScript with very little effort, and from what I've read, it might even be faster to decode (not sure about encoding, though).

有谁知道任何陷阱?任何人都有很好的基准来展示这两种方法的性能优势吗?

Does anyone know of any pitfalls? Anyone have good benchmarks to show the performance benefits of either method?

推荐答案

取决于您的优先事项.

如果性能是您绝对的驾驶特性,那么一定要使用最快的.在做出选择之前,请确保您对差异有充分的了解

If performance is your absolute driving characteristic, then by all means use the fastest one. Just make sure you have a full understanding of the differences before you make a choice

  • serialize() 不同,您需要添加额外的参数以保持 UTF-8 字符不变:json_encode($array, JSON_UNESCAPED_UNICODE)(否则它会转换 UTF-8 字符到 Unicode 转义序列).
  • JSON 不会记住对象的原始类是什么(它们总是作为 stdClass 的实例恢复).
  • 你不能在 JSON 中使用 __sleep()__wakeup()
  • 默认情况下,只有公共属性使用 JSON 进行序列化.(在 PHP>=5.4 你可以实现 JsonSerializable改变这种行为).
  • JSON 更便携
  • Unlike serialize() you need to add extra parameter to keep UTF-8 characters untouched: json_encode($array, JSON_UNESCAPED_UNICODE) (otherwise it converts UTF-8 characters to Unicode escape sequences).
  • JSON will have no memory of what the object's original class was (they are always restored as instances of stdClass).
  • You can't leverage __sleep() and __wakeup() with JSON
  • By default, only public properties are serialized with JSON. (in PHP>=5.4 you can implement JsonSerializable to change this behavior).
  • JSON is more portable

可能还有其他一些我暂时想不出来的区别.

And there's probably a few other differences I can't think of at the moment.

比较两者的简单速度测试

A simple speed test to compare the two

<?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 them
if ($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';
}

这篇关于存储 PHP 数组的首选方法(json_encode 与序列化)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆