คำอธิบายของ update_post_ (meta / term) _cache


23

ฉันได้อ่านแนวทางปฏิบัติที่ดีที่สุดตั้งแต่ 10up ขึ้นไปและพวกเขากล่าวถึงการตั้งค่าสถานะทั้งสองนี้เป็นเท็จใน WP_Query (ขึ้นอยู่กับสิ่งที่คุณกำลังสอบถาม):

  • 'update_post_meta_cache' => false: มีประโยชน์เมื่อโพสต์เมตาจะไม่ถูกใช้
  • 'update_post_term_cache' => false: มีประโยชน์เมื่อไม่มีการใช้ข้อกำหนดเรื่องอนุกรมวิธาน

ฉันสมมติว่ามันใช้ประโยชน์บางอย่างupdate_post_caches()แต่ฉันไม่แน่ใจ 100% ว่ามันหมายความว่าอย่างไร ใครช่วยอธิบายความหมายของธงทั้งสองนี้ในWP_Queryและมีประโยชน์อย่างไร ข้อมูลที่มากขึ้นดีกว่าเพราะฉันไม่รู้มากเกี่ยวกับว่า WordPress เก็บสิ่งต่าง ๆ อย่างไร

คำตอบ:


30

แคชวัตถุทุกที่

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การตั้งค่าการขัดแย้งแบบสอบถามเหล่านั้นไป


เรียบร้อย! ความเข้าใจของคุณจะได้รับการชื่นชมเสมอ GM สถานะชั่วคราวจะถูกพิจารณาว่าเป็น "แคชถาวร" หรือไม่? ถ้าจะไปเพิ่มเติมในระหว่าง WP_Query เหตุผลwp_reset_postdata()คือต้องรีเซ็ตglobal $postและรีเซ็ต Object Cache ดูเหมือนว่าถ้าฉันทำ WP_Query แบบกำหนดเองมันจะสร้างวัตถุแคชใหม่ แต่การรีเซ็ตมันจะต้องทำแบบสอบถามใหม่เพื่อรับแคชต้นฉบับ หรือบางทีฉันอาจจะไกลเกินไปในบริบทของคำถามนี้
Howdy_McGee

1
@Howdy_McGee Object แคชและวัตถุที่โพสต์ไม่เกี่ยวข้อง ดังนั้นwp_reset_postdata()อย่าทำเรื่องแคชวัตถุwp_reset_postdata()รีเซ็ตเฉพาะโพสต์ออบเจ็กต์ทั่วโลกนั่นคือตัวแปรระดับโลกอีกตัวที่ไม่เคยถูกแคช ... Transients เป็นสิ่งที่มีลูกผสม: เมื่อคุณติดตั้งปลั๊กอินแคชถาวรให้ใช้ชั่วคราวนั้น แต่ถ้าคุณไม่มีปลั๊กอินแคชถาวร ใช้ฐานข้อมูล
gmazzap

อ่าฉันพึ่งเข้ากันแล้ว global variableเชื่อในความคิดและคิดว่ามันเป็นวัตถุglobal $postระดับโลกหรือ$wp_queryขอบคุณสำหรับการชี้แจง!
Howdy_McGee

บนsidenote , ชุดแคชทั้งfields => 'ids' falseฉันคิดว่ามันสมเหตุสมผลที่ Object Cache นั้นใช้งานได้เฉพาะกับ Objects แต่ฉันคิดว่าฉันจะกล่าวถึง: D
Howdy_McGee

3

จุดสำคัญที่น่าสนใจที่นี่คือupdate_post_cachesฟังก์ชั่น มันถูกเรียกหลังจาก WP_Query ได้รับโพสต์ทั้งหมดจากฐานข้อมูล โดยปกติแล้วเหตุผลที่คุณต้องการให้โพสต์ในสถานที่แรกคือการแสดงพวกเขาซึ่งมักจะหมายถึงการแสดงคำและสิ่งที่อยู่บนพื้นฐานของเมตาดาต้าสำหรับ WP_Query ก็จะโดยแบบสอบถามเริ่มต้น DB สำหรับ meta และข้อมูลคำที่เกี่ยวข้องกับการโพสต์ และเก็บไว้ในแคช * ข้อมูลนี้ไม่สามารถใช้ได้อย่างชัดเจนในข้อมูลที่ส่งคืนจาก WP_Query แต่เมื่อคุณจะเรียก API ที่เกี่ยวข้องเพื่อรับข้อมูลคำและเมตาของโพสต์ที่เฉพาะเจาะจงจะมีอยู่ในหน่วยความจำแล้วและไม่จำเป็นต้องส่งใหม่ แบบสอบถามไปยังฐานข้อมูล

วิธีนี้ช่วยให้ wordpress ลดค่าใช้จ่ายที่เกี่ยวข้องกับการส่งคำขอไปยังฐานข้อมูลโดยส่งคำขอเพียงครั้งเดียวเพื่อรับข้อมูลสำหรับโพสต์ทั้งหมดแทนที่จะส่งคำขอต่อแต่ละโพสต์

ตอนนี้ฉันไม่สามารถหาตัวอย่างเล็ก ๆ น้อย ๆ ที่ไม่ใช่เมื่อไหร่ที่คุณไม่ต้องการให้แคชอัปเดต แต่สิ่งเล็ก ๆ น้อย ๆ อาจเป็นได้ถ้าคุณต้องการรายชื่อหนังสือทั้งหมดของโพสต์ เพื่อที่คุณไม่ต้องการข้อมูลคำหรือข้อมูลเมตา

* cache - ที่สำคัญที่สุดคือแคชตามหน่วยความจำซึ่ง WP เก็บทุกอย่างที่ได้รับจาก DB แม้จะไม่มีปลั๊กอินแคชวัตถุใด ๆ ที่ทำงานอยู่ เห็นได้ชัดว่าเมื่อคุณมีวัตถุแคชข้อมูลจะถูกเก็บไว้ที่นั่นเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.