[解決済み] PHP の配列を保存するための好ましい方法 (json_encode vs serialize)
2022-03-16 09:14:05
質問
キャッシュ目的で多次元連想配列のデータをフラットファイルに保存する必要があります。時々、ウェブアプリケーションで使用するためにJSONに変換する必要があるかもしれませんが、大部分の時間は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';
}
関連
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】未定義のメソッド mysqli_stmt::get_result を呼び出す。
-
[解決済み】chromeの「net : Failed to load resource: net::ERR_SPDY_PROTOCOL_ERROR" は何がおかしいのか?
-
[解決済み】Wordpressの子テーマのstyle.cssが効かない。
-
[解決済み] Uncaught Error: 未定義の関数 mysql_escape_string() の呼び出し。
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。
-
[解決済み] PHPで、連想配列の配列を指定されたキーの値でソートする方法は?
-
[解決済み] PHP の定数には配列が含まれますか?
-
[解決済み] PHP - 2つの配列が等しいかどうかを確認する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み】php, mysql - データベースへの接続数が多すぎるエラー
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み] Uncaught SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み] 致命的なエラーです。mysqli_result 型のオブジェクトを使用できません [終了] 。
-
[解決済み] 多次元配列の MD5 を行う PHP の最良の方法とは?