preferred方法来存储PHP数组(json_en code VS连载) [英] Preferred method to store PHP arrays (json_encode vs serialize)

查看:108
本文介绍了preferred方法来存储PHP数组(json_en code VS连载)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要存储数据的多维关联数组中用于缓存目的的平面文件。我可能偶尔会遇到需要将其转换为JSON用于我的web应用程序,但绝大多数的时候,我会直接使用数组中的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_de code 实际上快于反序列化

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中使用很少的努力,从我读过,它甚至可能更快脱code(不知道编码,虽然)。

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


  • 默认情况下, json_en code() UTF-8字符转换为统一code转义序列,而连载()没有。 注意::要离开UTF-8字符不变,则可以使用该选项 JSON_UNESCAPED_UNI code 作为PHP 5.4

  • JS​​ON不会有任何的对象的原班是什么内存(他们总是还原为stdClass的实例)。

  • 您不能利用 __睡眠() __唤醒()使用JSON

  • 只有公共属性被序列化使用JSON。 注意:在PHP 5.4,可以实现 JsonSerializable 更改此行为

  • JS​​ON是更便携

  • By default, json_encode() converts UTF-8 characters to Unicode escape sequences while serialize() does not. Note: To leave UTF-8 characters untouched, you can use the option JSON_UNESCAPED_UNICODE as of PHP 5.4.
  • 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
  • Only public properties are serialized with JSON. Note: As of 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);
}
elseif ($serializeTime < $jsonTime ) {
    printf("serialize() was roughly %01.2f%% faster than json_encode()\n", ($jsonTime / $serializeTime - 1) * 100);
} else {
    echo "Unpossible!\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';
}

这篇关于preferred方法来存储PHP数组(json_en code VS连载)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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