存储PHP数组的首选方法(json

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

将数组作为JSON或PHP序列化数组存储在此文本文件中效率更高吗? 我环顾四周,似乎在最新版本的PHP(5.3)中, json_decode实际上比反unserialize更快。

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

有谁知道任何陷阱? 任何人都有良好的基准来展示任一方法的性能优势?


取决于你的优先事项。

如果性能是你绝对的驾驶特性,那么通过一切手段使用最快的一个。 在做出选择之前,请确保您充分了解差异

  • serialize()不同,您需要添加额外的参数以保持UTF-8字符不变: json_encode($array, JSON_UNESCAPED_UNICODE) (否则它会将UTF-8字符转换为Unicode转义序列)。
  • JSON将无法记忆对象的原始类是什么(它们总是作为stdClass的实例来恢复)。
  • 您无法利用带有JSON的__sleep()__wakeup()
  • 默认情况下,只有公共属性使用JSON序列化。 (在PHP>=5.4您可以实现JsonSerializable来更改此行为)。
  • 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 secondsn";
    
    // Time serialization
    $start = microtime(true);
    serialize($testArray);
    $serializeTime = microtime(true) - $start;
    echo "PHP serialized in $serializeTime secondsn";
    
    // 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';
    }
    

    JSON比PHP的序列化格式简单快捷,应该使用JSON, 除非

  • 您正在存储深度嵌套数组: json_decode() :“如果JSON编码数据比127个元素更深,则此函数将返回false。”
  • 您正在将需要反序列化的对象存储为正确的类
  • 您正在与不支持json_decode的旧版PHP进行交互

  • 我写了一篇关于这个主题的博文:“缓存大数组:JSON,序列化或var_export?”。 在这篇文章中,它显示了serialize是小型到大型阵列的最佳选择。 对于非常大的数组(> 70MB),JSON是更好的选择。

    链接地址: http://www.djcxy.com/p/9895.html

    上一篇: Preferred method to store PHP arrays (json

    下一篇: Bitwise operations in PHP?