当前位置: 首页 > 面试题库 >

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

卢元龙
2023-03-14
问题内容

我需要在平面文件中存储多维关联数据数组以进行缓存。我可能偶尔会遇到需要将其转换为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的实例还原)。
  • 你不能充分利用__sleep(),并__wakeup()与JSON
  • 默认情况下,仅公共属性使用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';
}


 类似资料:
  • 问题内容: 使用ruby-on-rails,我想存储3个元素的数组:帖子的最后3条评论。我知道我可以将Comment表加入Post 1,但是我会避免出于扩展目的而进行大量的请求。 所以我想知道什么是存储这三个元素的最佳方法,因为我想在每次发表新评论时轻松地更新它们:删除最后一条评论并添加新评论。 正确的方法是什么?将其存储在序列化数组还是JSON对象中? 问题答案: 您可以使用ActiveReco

  • 问题内容: 我有一个PHP代码,需要将数据库表数据编码为json。所以我使用了json_encode()。 我使用此处给出的表格-http: //www.geekality.net/2011/08/21/country-names-continent- names-and-iso-3166-codes-for- mysql/ 对于不同的输入,此代码的行为似乎有所不同。 查询- 不返回任何json值

  • 主要内容:多维数组查找指定元素数组作为一种 线性存储结构,对存储的数据通常只做查找和修改操作,因此 数组结构的实现使用的是顺序存储结构。 要知道,对数组中存储的数据做插入和删除操作,算法的效率是很差的。 由于数组可以是多维的,而顺序存储结构是一维的,因此数组中数据的存储要制定一个先后次序。通常,数组中数据的存储有两种先后存储方式: 以列序为主(先列后行):按照行号从小到大的顺序,依次存储每一列的元素 以行序为主(先行后序):按

  • 问题内容: 好的,我想我需要帮助!我搜索了我可以考虑的所有关键字,但仍然无法找出答案,请帮忙。我更多地是一个php家伙,而我刚开始使用jQuery。 基本上,我想做的是从click函数发送一个jQuery帖子。根据我的php函数返回的值,显示/隐藏2个div。我的php函数返回一个带有2个简单值的“ json_encode”数组,例如: // ================= PHP代码====

  • 我试图将mysql查询的结果作为json返回,但是json_encode函数总是返回空白,尽管数组包含元素。 检索查询并转换为php数组: 然后返回结果: 这不返回任何内容,而我在回显以下语句时确实得到了结果: 返回“数组” 返回“Youreka!demo” 你知道我做错了什么吗? ID:2,名字:尤瑞卡!演示,地址:Italiëlei 26,邮政编码:2000,城市:Antwerpen,国家:B

  • 问题内容: 此代码生成一对公钥/私钥: 我想知道的是您通常如何存储公钥: 选项1:存储字节 我不喜欢将代码绑定到诸如和的具体实现。 选项2:存储模数和指数 第二个选项更易于实现,但是我不知道它是否可能性能较低。 有什么建议吗? 问题答案: 在我们的应用程序中,我们以DER格式存储公钥和私钥,以便可以在Java外部更轻松地使用和操纵它们。在我们的情况下,私钥上没有密码。 要将私钥转换为在Java中更