問題描述

在我與 WordPress 的小時代,我看到 WordPress 本身,其友好的插件在許多情況下都使用 PHP serialize()將數據存儲到數據庫。但是在最近的一次搜索中,我發現 json_encode()serialize()的認真的社區支持。

  • 證明 json_encode()的測試優於 serialize() – StackOverflow

  • 為什麼 json_encode()可以使用的原因,為什麼不 – StackOverflow

我親自測試了一個關聯數組,其中顯示:

  • serialize()存儲 342 個字符

  • json_encode()存儲 285 個字符

為什麼我問這個?

我正在一個項目,而我將存儲重複的元字段到一個職位。哪裏:

  • 數據基本上是英文,但有時可以是孟加拉語

  • 數據將是關聯數組,3 級深 (我希望我能正確理解級別):

array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

我已經檢查了 postmeta 表的 meta_value,它是一個 longtextthat means,長度為 4,294,967,295 個字符 (4GB) 。

所以我需要一個強大的解決方案來存儲東西。

最佳解決方案

我認為,不是 100%肯定這是 WP 開發人員採取這種方法的真正原因,但常識告訴我,序列化保留變量類型,並有一個 mini 內置的錯誤檢測,並且 json 只存儲字符串值 { key : value },所以當你回到 PHP 你將不得不猜測格式,或為它做一個解析器。這將迫使您有兩種不同的處理數據的方法:以前,將數據存儲為 json,並且在解碼 json 之後,它將作為完全不同的對象返回。

這是大小差異的主要原因,PHP 不僅存儲數組; 它正在存儲在序列化時數組中有多少元素,它們的類型及其值。

您不僅僅在數據庫中存儲鍵值對,而且還可以存儲具有不同變量類型的對象。

次佳解決方案

PHP 編碼是 PHP 5.2 中引入的,WordPress 的方式已經老化了,它誕生了 (專為 PHP 4 而設計) 。

數據序列化是 WordPress 中普遍存在的一個問題,因此從 PHP 序列化到 JSON 編碼將意味着一個巨大的向後兼容性問題,如果我知道 WordPress 一點,永遠不會發生。

也就是説,如果您認為 JSON 編碼比 PHP 序列化更好,只需使用它。

如果您傳遞一個字符串 (即數據的 JSON-encoded 版本) 發佈元功能 WordPress 不會觸摸它,但是您需要記住檢索到的 JSON-decode 數據。

如果 DB 存儲大小對您來説非常重要,那麼它可能值得額外的工作,否則只需讓 WordPress 使用它所使用的,不關心它。

也許,您可以評估自定義表格來保存數據的情況。

第三種解決方案

我很想把這個看作是 「受意見」,但我認為這個問題有很好的答案。我要和”history” 一起去。

1)json_encode 在 PHP 核心中相對較新。

json_encode

(PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_encode — Returns the JSON representation of a value

http://php.net/manual/en/function.json-encode.php

json_encode 在 WordPress 的初期就不可靠。它只是在 5.2 版中推出了”core” PHP,儘管之前它可以作為 PECL 擴展使用。

其次,如果將 WP_Query 對象等對象提交到 json_encode,則可以在 json_decode 上獲取 stdClass 對象。 serialize /unserialize 將保存對象。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。