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

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

我目前倾向于将数组存储为JSON,因为我觉得这样更容易被人读取(如果需要的话),它可以很轻松地在PHP和JavaScript中使用,而且从我读到的内容来看,它的解码速度甚至可能更快(不过,对编码不是很确定).

有人知道有什么trap 吗?有谁有好的基准来展示这两种方法的性能优势?

推荐答案

取决于你的优先级.

如果性能是你的绝对驾驶特征,那么一定要使用最快的.在你做出 Select 之前,确保你充分理解了这些差异

  • 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 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相关问答推荐

如何以编程方式获取eBay API的授权代码?

在不刷新页面的情况下无法使用JQuery更新id

我的docker—compose lamp stack在软件更新后不工作:Containerconfig错误'''

PHP FFI—Convert void * to int

在Woocommerce变量产品中的标签附近显示所选属性选项名称

Msgraph-sdk-php v2如何从返回对象中获取数据?

根据产品类型显示或隐藏WooCommerce管理产品自定义字段

将日期数组排序为年->;月

根据WooCommerce中的客户计费国家/地区更改产品价格

莫德克斯.当我try 使用pThumb为手机压缩图像时,没有任何react

PHP:使用FORT从数据库获取USERS表到AUTH表

如何使用 AJAX、PHP 和 MYSQL 在 Select 项目时在文本框中填充数据

如果在 APIPlatform 3.1 中的同一资源上使用处理器,Messenger 将无法工作

需要以一种形式执行两个操作

PHP向API发送curl请求

使用 wp_footer 挂钩添加一些 CSS 不起作用

在特征中使用类的属性

根据购买产品的自定义字段替换WooCommerce添加到购物车按钮

Laravel的Storage::exists返回false,而file_exists返回true.

用于检测此模式的正则表达式:something;something=something,something=something... 未知次数