แคชวัตถุทุกที่
WordPress พยายามลดจำนวนการสืบค้นฐานข้อมูลให้มากที่สุด
ตัวอย่างเช่นเมื่อใดก็ตามที่คุณได้รับเขตข้อมูลเมตาหรือเขตข้อมูล taxonomy ก่อนทำการสืบค้นฐานข้อมูล WordPress จะตรวจสอบว่ามีการสอบถามและเก็บไว้ในแคชแล้วและคืนค่าจากที่นั่นแทนที่จะทำการสืบค้นฐานข้อมูล
"งานแคช" จะทำผ่านWP_Object_Cache
คลาสและwp_cache_*
ฟังก์ชั่น (ที่เป็น wrapper กับวิธีการเรียนนั้น)
ที่ ๆ แคชอาศัยอยู่
โดยค่าเริ่มต้น "แคช" ไม่มีอะไรมากไปกว่าตัวแปรทั่วโลกของ PHP มันหมายความว่ามันอยู่ในความทรงจำ แต่ก็หมายความว่ามันจะหายไปในทุกคำขอ
อย่างไรก็ตามผ่านทาง dropins ( advanced-cache.php
และ / หรือobject-cache.php
) คุณสามารถตั้งค่าวิธีที่กำหนดเองเพื่อจัดการกับแคชนี้
โดยปกติแล้ว dropins นี้จะใช้ในการตั้งค่ากลไกการแคชบางอย่างที่ "เอาตัวรอด" คำขอเอกพจน์
ด้วยเหตุผลนี้ในหมู่คน WP สิ่งเหล่านี้รู้ว่าเป็น "แคชถาวร" (แม้ว่าจะอยู่นอกกรอบคำว่า "แคช" และ "ถาวร" ก็ไม่ได้ทำให้รู้สึกเข้ากันมากนัก)
ทางเลือกที่เป็นที่นิยมในปัจจุบันก็MemcachedหรือRedis
ดังนั้นการใช้ปลั๊กอิน "แคชถาวร" คุณสามารถลดจำนวนการสืบค้นฐานข้อมูลลงได้อย่างมากเนื่องจากแคชไม่ได้รับการอัพเดตในทุกคำขอ
ตัวอย่างบางส่วน
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
โค้ด 2 บรรทัดด้านบนจะทริกเกอร์สูงสุด 1 คิวรีฐานข้อมูล
ในความเป็นจริงเมื่อคุณค้นหาเขตข้อมูลที่กำหนดเองเขตข้อมูลทั้งหมดสำหรับโพสต์นั้นจะถูกดึงจากฐานข้อมูลแคชผ่านแคชวัตถุและคำขอที่ตามมาจะดึงข้อมูลจากแคชไม่ใช่จาก db
สิ่งเดียวกันนี้เกิดขึ้นกับเงื่อนไขอนุกรมวิธาน WordPress ดึงเงื่อนไขทั้งหมดสำหรับอนุกรมวิธานหนึ่งครั้งจากนั้นส่งคืนพวกเขาจากแคช
แคชวัตถุนั้นใช้กันอย่างแพร่หลายใน WordPress ไม่เพียง แต่สำหรับโพสต์ค่าเมตาและ taxonomies แต่ยังสำหรับผู้ใช้ความคิดเห็นข้อมูลชุดรูปแบบ ...
สิ่งที่WP_Query
จะทำอย่างไรกับทั้งหมดนี้?
เมื่อคุณค้นหาบางโพสต์WP_Query
โดยค่าเริ่มต้น WordPress จะไม่เพียงดึงจากฐานข้อมูล (หรือจากแคชหากถูกแคช) แต่ยังอัพเดตแคชสำหรับฟิลด์ที่กำหนดเองทั้งหมดและ taxonomies ทั้งหมดที่เกี่ยวข้องกับโพสต์ที่ดึง
ตัวอย่างเช่นเมื่อคุณโทรget_the_terms()
หรือget_post_meta()
ขณะที่วนลูปโพสต์ผ่านWP_Query
คุณจะไม่เรียกคิวรีฐานข้อมูลใด ๆ แต่ดึงข้อมูลจากแคช
ดีใช่มั้ย
ใช่ แต่มันมาพร้อมกับราคา
การปรับปรุงแคช "เวทย์มนตร์" ที่ WordPress ทำเมื่อดึงโพสต์ผ่านWP_Query
เกิดขึ้นในupdate_meta_cache
เมตาดาต้าและupdate_object_term_cache
สำหรับ taxonomies
หากคุณดูซอร์สโค้ดของฟังก์ชั่นเหล่านั้นคุณจะเห็นว่า WordPress มีการสืบค้น db เพียงหนึ่งแบบสอบถามในแต่ละฟังก์ชั่น แต่ยังทำการประมวลผลจำนวนมาก ตัวอย่างเช่นในupdate_object_term_cache
มี7 ซ้อนกันforeach
... ถ้าคุณมี taxonomies จำนวนมากและจำนวนการโพสต์ต่อหน้าสูงนี่ไม่ใช่ประสิทธิภาพมากนัก
เกี่ยวกับWP_Query
ข้อโต้แย้งเหล่านั้นในที่สุด
อะไร'update_post_meta_cache'
และ'update_post_term_cache'
ทำอย่างไรเมื่อตั้งค่าfalse
เพื่อป้องกันไม่ให้ WordPress เพื่ออัปเดตแคชสำหรับเขตข้อมูลที่กำหนดเองและ taxonomies ตามลำดับ
ในกรณีดังกล่าวครั้งแรกที่มีการสอบถามฟิลด์ที่กำหนดเองหรืออนุกรมวิธานการสืบค้นฐานข้อมูลจะถูกเรียกใช้และข้อมูลจะถูกแคช
มันคุ้มค่ากับปัญหาหรือไม่
ตามปกติคำตอบคือมันขึ้นอยู่กับ เวลาส่วนใหญ่ในการตั้งค่าเหล่านั้นfalse
เป็นตัวเลือกที่ดีเพราะจะช่วยป้องกันการประมวลผลที่ไม่จำเป็นและการสืบค้นฐานข้อมูลหากไม่ต้องการและแคชจะถูกปรับปรุงอยู่เสมอจำเป็นต้องใช้ข้อกำหนดฟิลด์ / taxonomy ที่กำหนดเองเป็นครั้งแรก
อย่างไรก็ตามหากคุณกำลังจะโทรถึงแม้ครั้งเดียวget_post_meta()
ระหว่างลูปและคุณจะโทรหาget_the_terms()
taxonomies ทั้งหมด (หรือส่วนใหญ่) ที่สนับสนุนโดยโพสต์ดังนั้นการอัปเดตแคชจะถูกเปิดใช้งานและอาจไม่มีผลประโยชน์จริงใน false
การตั้งค่าการขัดแย้งแบบสอบถามเหล่านั้นไป
wp_reset_postdata()
คือต้องรีเซ็ตglobal $post
และรีเซ็ต Object Cache ดูเหมือนว่าถ้าฉันทำ WP_Query แบบกำหนดเองมันจะสร้างวัตถุแคชใหม่ แต่การรีเซ็ตมันจะต้องทำแบบสอบถามใหม่เพื่อรับแคชต้นฉบับ หรือบางทีฉันอาจจะไกลเกินไปในบริบทของคำถามนี้