সর্বত্র ক্যাশে অবজেক্ট
ওয়ার্ডপ্রেস যতটা সম্ভব ডাটাবেস প্রশ্নের সংখ্যা হ্রাস করার চেষ্টা করে।
উদাহরণস্বরূপ, যে কোনও সময় আপনি একটি মেটা ক্ষেত্র বা ট্যাক্সোনমি ক্ষেত্র পাবেন, ডাটাবেস অনুসন্ধানের আগে, ওয়ার্ডপ্রেস দেখায় যে এটি ইতিমধ্যে অনুসন্ধানে এবং ক্যাশে সঞ্চিত ছিল এবং এটি সেখান থেকে ডাটাবেস অনুসন্ধানের পরিবর্তে ফিরিয়ে দেয়।
"ক্যাশে কাজ" WP_Object_Cacheক্লাস এবং wp_cache_*ফাংশনগুলির মাধ্যমে সম্পন্ন হয় (যা সেই শ্রেণীর পদ্ধতিতে মোড়ক থাকে))
যেখানে ক্যাশে থাকে
ডিফল্টরূপে, "ক্যাশে" পিএইচপি গ্লোবাল ভেরিয়েবল ছাড়া আর কিছুই নয়। এর অর্থ এটি স্মৃতিতে রয়েছে তবে এর অর্থ এটি প্রতিটি অনুরোধে অদৃশ্য হয়ে যায়।
তবে ড্রপিনস ( advanced-cache.phpএবং / অথবা object-cache.php) এর মাধ্যমে এই ক্যাশে পরিচালনা করার জন্য কাস্টম পদ্ধতিতে সেটআপ করা সম্ভব।
সাধারণত, এই ড্রপিনগুলি এক ধরণের ক্যাশিং প্রক্রিয়া সেটআপ করতে ব্যবহৃত হয় যা একক অনুরোধগুলি "বেঁচে থাকে"।
এই কারণে, ডব্লিউপি লোকগুলির মধ্যে, এগুলি "পার্সেন্টিভ ক্যাশে" প্লাগইন হিসাবে পরিচিত (বুদবুদের বাইরেও "ক্যাশে" এবং "ধ্রুবক" শব্দগুলি একসাথে খুব একটা বোঝায় না)।
আজকাল জনপ্রিয় পছন্দগুলি মেমক্যাচড বা রেডিস ।
সুতরাং "অবিচ্ছিন্ন ক্যাশে" প্লাগইন ব্যবহার করে আপনি ডাটাবেস প্রশ্নের সংখ্যাকে মারাত্মকভাবে হ্রাস করতে পারেন, কারণ প্রতিটি অনুরোধে ক্যাশে আপডেট হয় না।
কিছু উদাহরণ
$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 টি ডাটাবেস কোয়েরি ট্রিগার করবে।
প্রকৃতপক্ষে, আপনি যখন কোনও কাস্টম ক্ষেত্র অনুসন্ধান করেন, সেই পোস্টের জন্য সমস্ত ক্ষেত্র ডাটাবেস থেকে পুনরুদ্ধার করা হয়, অবজেক্ট ক্যাশের মাধ্যমে ক্যাশে করা হয় এবং পরবর্তী অনুরোধগুলি ক্যাশে থেকে ডেটা টানবে এবং ডিবি থেকে নয়।
বিভাগীয় শর্তাদির ক্ষেত্রেও একই ঘটনা ঘটে, ওয়ার্ডপ্রেস একবার সমস্ত বিভাগের জন্য সমস্ত শর্তাদি টান দেয়, তারপরে সেগুলি ক্যাশে থেকে ফিরিয়ে দেয়।
ওয়ার্ডপ্রেসে অবজেক্ট ক্যাশে খুব বেশি ব্যবহৃত হয়। কেবল পোস্ট, মেটা মান এবং করশোণীর জন্যই নয়, ব্যবহারকারী, মন্তব্য, থিম ডেটা ...
এসবের WP_Queryসাথে কী করার আছে?
যখন আপনি কিছু পোস্ট WP_Queryডিফল্টরূপে জিজ্ঞাসা করেন , ওয়ার্ডপ্রেস কেবল সেগুলি কেবল ডাটাবেস থেকে (বা যদি তারা ক্যাশে থাকে তবে ক্যাশে থেকে) টানতে পারে না তবে সমস্ত কাস্টম ক্ষেত্র এবং টানা পোস্টগুলির সাথে সম্পর্কিত সমস্ত বিভাগের জন্য ক্যাশে আপডেট করে ।
সুতরাং আপনি যখন কল করবেন, উদাহরণস্বরূপ, get_the_terms()বা get_post_meta()লুপিং পোস্টগুলি যখন পেয়েছেন WP_Query, আপনি আসলে কোনও ডাটাবেস কোয়েরি ট্রিগার করবেন না, তবে ক্যাশে থেকে তথ্য টানুন।
ভাল, তাই না?
হ্যাঁ, তবে এটি একটি ব্যয় নিয়ে আসে।
ক্যাশে আপডেট "ম্যাজিক" ওয়ার্ডপ্রেস করে যে যখন টান পোস্ট মাধ্যমে WP_Queryঘটতে update_meta_cacheমেটা জন্য এবং update_object_term_cachetaxonomies জন্য।
যদি আপনি এই ফাংশনগুলির উত্স কোডটি লক্ষ্য করেন তবে আপনি দেখতে পাবেন যে সেখানে ওয়ার্ডপ্রেস প্রতিটি ফাংশনে কেবলমাত্র একটি ডিবি কোয়েরি সম্পাদন করে তবে প্রচুর প্রক্রিয়াজাতকরণও করে। উদাহরণস্বরূপ, মধ্যে update_object_term_cacheআছে 7 নেস্টেডforeach ... যদি আপনি taxonomies অনেক আছে, এবং প্রতি পাতায় পোস্ট সংখ্যা বেশি, এর ফলে খুব performant নয়।
এই WP_Queryযুক্তি সম্পর্কে , অবশেষে
কী 'update_post_meta_cache'এবং 'update_post_term_cache'সেট করার সময় falseযথাক্রমে কাস্টম ফিল্ড এবং ট্যাক্সনোমির জন্য ক্যাশে আপডেট করার জন্য ওয়ার্ডপ্রেসকে প্রতিরোধ করা।
সেক্ষেত্রে প্রথমবারের মতো কোনও কাস্টম ক্ষেত্র বা বিভাগের কোয়েন থেকে কোনও ডাটাবেস ক্যোয়ারী ট্রিগার করা হয় এবং ডেটা ক্যাশে করা হয়।
এটা কি মূল্য?
যথারীতি উত্তরটি নির্ভর করে । বেশিরভাগ সময় এই মানগুলিকে সেট করার জন্য false, একটি ভাল পছন্দ, কারণ এটি প্রয়োজন না হলে অপ্রয়োজনীয় প্রক্রিয়াজাতকরণ এবং ডাটাবেস অনুসন্ধানগুলি প্রতিরোধ করে এবং প্রথমবারের মতো কাস্টম ফিল্ড / ট্যাক্সনোমির শর্তাদি আবশ্যক হলে ক্যাশে আপডেট করা হয়।
তবে, আপনি যদি একবার get_post_meta()লুপ করতে চলেছেন, এমনকি একবার লুপ চলাকালীন এবং আপনি get_the_terms()পোস্ট দ্বারা সমর্থিত সকল ট্যাক্সনোমির জন্য (বা বেশিরভাগ) কল করতে চলেছেন , তবে ক্যাশে আপডেট করা যেকোনো উপায়েই ট্রিগার করা হয়েছে, এবং এর কোনও প্রকৃত সুবিধা নাও থাকতে পারে এই ক্যোয়ারী যুক্তিগুলিতে সেট করে false।
wp_reset_postdata()সেট করাglobal $postএবং পুনরায় সেট করার কারণ ? দেখে মনে হচ্ছে যদি আমি একটি কাস্টম ডাব্লুপিউকিউয়ারি করি তবে এটি একটি নতুন ক্যাশেযুক্ত বস্তু তৈরি করবে তবে এটি পুনরায় সেট করাতেও মূল ক্যাশে পাওয়ার জন্য প্রয়োজনীয় কাজ করতে হবে। অথবা হতে পারে আমি এই প্রশ্নের প্রসঙ্গে খুব বেশি দূরে আছি।