Tại sao WordPress chọn tuần tự hóa dữ liệu qua json_encode?


13

Trong thời đại nhỏ của tôi với WordPress, tôi đã thấy chính WordPress và các plugin thân thiện của nó đang sử dụng PHP serialize()trong việc lưu trữ dữ liệu vào db trong nhiều trường hợp. Nhưng trong một tìm kiếm gần đây tôi đã tìm thấy một sự hỗ trợ cộng đồng nghiêm túc cho json_encode()hơn serialize().

Và cá nhân tôi đã thử nghiệm một mảng kết hợp với cả hai, cho thấy:

  • serialize() cửa hàng 342 ký tự
  • json_encode() cửa hàng 285 ký tự

Tại sao tôi hỏi điều này?

Tôi đang thực hiện một dự án trong khi tôi sẽ lưu trữ các trường meta lặp lại cho một bài đăng. Ở đâu:

  • Dữ liệu về cơ bản là bằng tiếng Anh, nhưng đôi khi có thể là tiếng Bengal
  • Dữ liệu sẽ là mảng kết hợp, sâu 3 cấp (tôi hy vọng tôi hiểu chính xác các cấp ):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

Tôi đã kiểm tra trường của postmetabảng meta_valueđó là a longtext, có nghĩa là chiều dài 4.294.967.295 chars (4GB).

Vì vậy, tôi cần một giải pháp mạnh mẽ để lưu trữ mọi thứ.


Trong một từ, Di sản. WordPress có trước việc áp dụng JSON rộng rãi và kết quả là, hàng tấn trang web phụ thuộc vào API, do đó, ở đây sẽ gây nhầm lẫn cho các nhà phát triển mới, những người không đọc rằng nó bị phản đối ....
Nate Symer

Câu trả lời:


13

Tôi nghĩ, không chắc chắn 100% rằng đây là lý do thực sự khiến các nhà phát triển WP thực hiện phương pháp này, nhưng thông thường cho tôi biết rằng tuần tự hóa bảo tồn các loại biến và có một phát hiện lỗi nhỏ và json chỉ lưu trữ các giá trị chuỗi { key : value } , vì vậy khi bạn Quay trở lại PHP bạn sẽ phải đoán định dạng hoặc tạo một trình phân tích cú pháp cho nó. Điều này sẽ buộc bạn phải có hai cách khác nhau để xử lý dữ liệu của mình: trước đó, để lưu trữ dữ liệu dưới dạng json và sau khi giải mã json, nó sẽ trở lại như một đối tượng hoàn toàn khác.

Đây là lý do chính của sự khác biệt về kích thước, PHP không chỉ lưu trữ một mảng; nó đang lưu trữ có bao nhiêu phần tử trong mảng khi nó được tuần tự hóa, kiểu của chúng và giá trị của chúng.

Bạn không chỉ lưu trữ các cặp giá trị khóa trên cơ sở dữ liệu mà còn có thể lưu trữ một đối tượng với các loại biến khác nhau.


Tôi thích câu trả lời nhất. Điểm thực sự hữu ích.
Mayeenul Hồi giáo

1
Cuối cùng, những gì nghe có vẻ tích cực trong câu trả lời này với dữ liệu được tìm kiếm chỉ làm cho nó phức tạp hơn (và không an toàn) hơn là với việc tuần tự hóa đơn giản hơn với JSON. Chỉ cần nói. Lý do thực tế được đưa ra trong câu trả lời khác rằng thời điểm tính năng được giới thiệu, chỉ có chức năng tuần tự hóa PHP, JSON vẫn chưa có.
hakre

6

Mã hóa JSON được giới thiệu trong PHP 5.2, WordPress đã cũ hơn và nó được sinh ra (và được thiết kế cho) PHP 4.

Tuần tự hóa dữ liệu là một điều phổ biến trong WordPress, do đó, việc chuyển từ tuần tự hóa PHP sang mã hóa JSON có nghĩa là một vấn đề tương thích ngược rất lớn và nếu tôi biết một chút về WordPress, điều đó sẽ không bao giờ xảy ra.

Điều đó nói rằng, nếu bạn nghĩ rằng mã hóa JSON tốt hơn cho bạn so với tuần tự hóa PHP, chỉ cần sử dụng nó.

Nếu bạn chuyển một chuỗi (đó là phiên bản dữ liệu được mã hóa JSON của bạn) để đăng các hàm meta, WordPress sẽ không chạm vào chuỗi đó, nhưng sau đó bạn cần nhớ để giải mã dữ liệu JSON khi truy xuất.

Nếu kích thước lưu trữ DB rất quan trọng đối với bạn, thì nó có thể xứng đáng với công việc bổ sung, nếu không hãy để WordPress sử dụng những gì nó sử dụng và không quan tâm đến nó.

Có lẽ, bạn có thể đánh giá nếu đó là trường hợp của các bảng tùy chỉnh để lưu dữ liệu của bạn.


3

Tôi muốn đóng cái này là "chủ đề cho ý kiến" nhưng tôi nghĩ có một vài câu trả lời hay cho câu hỏi. Tôi sẽ đi với "lịch sử".

1) json_encodetương đối mới trong lõi PHP.

json_encode

(PHP 5> = 5.2.0, PECL json> = 1.2.0) json_encode - Trả về biểu diễn JSON của một giá trị

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

json_encodesẽ không đáng tin cậy trong những ngày đầu của WordPress. Nó chỉ được đưa vào PHP "cốt lõi" trong 5.2, mặc dù nó đã có sẵn như là một phần mở rộng PECL từ lâu trước đó.

Thứ hai, nếu bạn cho một đối tượng như một WP_Queryđối tượng vào, json_encodebạn sẽ có được một stdClassđối tượng json_decode. serialize/ unserializesẽ bảo tồn đối tượng.


+1. Nhưng tôi phản đối "chủ đề cho ý kiến", bởi vì tôi có bằng chứng liền kề. Và vấn đề cuối cùng: liên quan đến lớp: Tôi đã đề cập đến điều đó trên liên kết thứ hai (lý do tại sao không phải là json_encode).
Mayeenul Hồi giáo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.