ทำไม WordPress ถึงเลือกเป็นอันดับข้อมูลมากกว่า json_encode


13

ในอายุน้อยของฉันกับ WordPress ฉันได้เห็น WordPress และปลั๊กอินที่เป็นมิตรกำลังใช้ PHP serialize()ในการจัดเก็บข้อมูลลงในฐานข้อมูลในหลาย ๆ กรณี แต่ในการค้นหาล่าสุดผมพบว่าการสนับสนุนจากชุมชนอย่างรุนแรงสำหรับมากกว่าjson_encode()serialize()

และฉันได้ทดสอบอาเรย์แบบเชื่อมโยงกับ 'em' ซึ่งแสดง:

  • serialize() ร้านค้า 342 ตัวอักษร
  • json_encode() ร้านค้า 285 ตัวอักษร

ทำไมฉันถามสิ่งนี้

ฉันอยู่ในโครงการในขณะที่ฉันกำลังจะจัดเก็บเขตข้อมูล meta ที่ซ้ำไปยังโพสต์ ที่ไหน:

  • ข้อมูลจะเป็นภาษาอังกฤษ แต่บางครั้งอาจเป็นภาษาเบงกาลี
  • ข้อมูลจะเป็นอาเรย์แบบเชื่อมโยง 3 ระดับ (ฉันหวังว่าฉันเข้าใจในระดับที่ถูกต้อง):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

ฉันตรวจสอบฟิลด์postmetaของตารางmeta_valueว่า a longtextแล้วนั่นหมายถึงความยาว 4,294,967,295 ตัวอักษร (4GB)

ดังนั้นฉันจึงต้องการโซลูชันที่แข็งแกร่งในการจัดเก็บสิ่งต่าง ๆ


ในคำมรดก WordPress มีการยอมรับ JSON อย่างแพร่หลายและด้วยเหตุนี้ไซต์จำนวนมากขึ้นอยู่กับ API ดังนั้นจึงเป็นเรื่องที่สร้างความสับสนให้กับนักพัฒนาใหม่ที่ไม่ได้อ่านว่าเลิกใช้แล้ว ....
Nate Symer

คำตอบ:


13

ฉันคิดว่าไม่แน่ใจ 100% ว่านี่คือเหตุผลที่แท้จริงที่นักพัฒนา WP ใช้แนวทางนี้ แต่สามัญสำนึกบอกฉันว่าการทำให้เป็นอนุกรมรักษาประเภทตัวแปรและมีมินิในตัวตรวจจับข้อผิดพลาดและ json เก็บค่าสตริงเท่านั้น{ key : value }ดังนั้นเมื่อคุณ กลับไปที่ PHP คุณจะต้องเดารูปแบบหรือทำ parser วิธีนี้จะบังคับให้คุณมีสองวิธีในการจัดการข้อมูลของคุณ: ก่อนหน้านี้เพื่อเก็บข้อมูลเป็น json และหลังจากถอดรหัส json มันจะกลับมาเป็นวัตถุที่แตกต่างกันโดยสิ้นเชิง

นี่คือเหตุผลหลักที่แตกต่างกันในขนาด PHP คือการจัดเก็บไม่เพียง แต่อาร์เรย์ มันคือการจัดเก็บจำนวนองค์ประกอบที่อยู่ในอาร์เรย์เมื่อมันต่อเนื่องประเภทของพวกเขาและค่าของพวกเขา

คุณไม่ได้จัดเก็บเฉพาะคู่ของค่าคีย์ในฐานข้อมูล แต่คุณอาจเก็บวัตถุที่มีประเภทตัวแปรที่แตกต่างกัน


ฉันรักคำตอบมากที่สุด จุดที่เป็นประโยชน์จริงๆ
Mayeenul Islam

1
สิ่งที่ฟังดูเป็นบวกในคำตอบนี้กับข้อมูลที่มีการลดทอนเฉพาะทำให้มีความซับซ้อนมากขึ้น (และไม่ปลอดภัย) กว่าด้วยการทำให้เป็นอนุกรมที่ง่ายขึ้นด้วย JSON แค่พูด. เหตุผลที่แท้จริงตามที่ระบุไว้ในคำตอบอื่น ๆ ว่าเวลาที่คุณลักษณะถูกนำเสนอมีเพียงฟังก์ชั่น PHP เป็นอันดับ JSON ยังไม่ได้มี
hakre

6

การเข้ารหัส JSON ถูกนำมาใช้ใน PHP 5.2, WordPress นั้นเก่ากว่าและมันเกิด (และออกแบบมาสำหรับ) PHP 4

การจัดลำดับข้อมูลเป็นสิ่งที่แพร่หลายใน WordPress ดังนั้นการเปลี่ยนจากการเป็นอนุกรม PHP ไปเป็นการเข้ารหัส JSON จะหมายถึงปัญหาความเข้ากันได้ย้อนหลังอย่างมากและถ้าฉันรู้ WordPress เพียงเล็กน้อยนั่นจะไม่เกิดขึ้นเลย

ที่กล่าวว่าถ้าคุณคิดว่าการเข้ารหัส JSON นั้นดีกว่า PHP ต่อเนื่องให้ใช้มัน

หากคุณผ่านสตริง (นั่นคือรุ่นที่เข้ารหัสข้อมูล JSON ของคุณ) เพื่อโพสต์ฟังก์ชั่นเมตา WordPress จะไม่แตะต้องมัน แต่คุณต้องจำข้อมูล JSON ที่ถอดรหัสเพื่อเรียกใช้

หากขนาดพื้นที่เก็บข้อมูลของ DB มีความสำคัญมากสำหรับคุณนั่นอาจคุ้มค่ากับการทำงานเพิ่มเติมมิฉะนั้นให้ WordPress ใช้สิ่งที่ใช้และไม่สนใจ

บางทีคุณสามารถประเมินได้ว่าเป็นกรณีของตารางที่กำหนดเองเพื่อบันทึกข้อมูลของคุณหรือไม่


3

ฉันถูกล่อลวงให้ปิดสิ่งนี้ในฐานะ "ขึ้นอยู่กับความคิดเห็น" แต่ฉันคิดว่ามีคำตอบที่ดีสำหรับคำถามนี้ ฉันจะไปกับ "ประวัติศาสตร์"

1) json_encodeค่อนข้างใหม่ในแกน PHP

json_encode

(PHP 5> = 5.2.0, PECL json> = 1.2.0) json_encode - ส่งคืนการแทนค่า JSON ของค่า

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

json_encodeคงไม่น่าเชื่อถือในวันแรก ๆ ของ WordPress มันถูกรีดเป็น PHP "หลัก" ใน 5.2 เท่านั้นแม้ว่าจะพร้อมใช้งานเป็นส่วนขยาย PECL นานก่อนหน้านั้น

ประการที่สองถ้าคุณฟีดวัตถุเช่นWP_Queryวัตถุเข้ามาjson_encodeคุณจะได้รับวัตถุบนstdClass / จะรักษาวัตถุjson_decodeserializeunserialize


+1 แต่ฉันคัดค้าน "ขึ้นอยู่กับความคิดเห็น" เพราะฉันอยู่ติดกับบทพิสูจน์ และอันสุดท้าย: ปัญหาที่เกี่ยวข้องกับคลาส: ฉันได้พูดไปแล้วว่าในลิงค์ที่สอง (เหตุผลที่ไม่ใช่ json_encode)
Mayeenul Islam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.