แคชวัตถุทุกที่
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 แบบกำหนดเองมันจะสร้างวัตถุแคชใหม่ แต่การรีเซ็ตมันจะต้องทำแบบสอบถามใหม่เพื่อรับแคชต้นฉบับ หรือบางทีฉันอาจจะไกลเกินไปในบริบทของคำถามนี้