এইচটিএমএল স্ট্রিং, বা অবজেক্টটি সঞ্চয় করার জন্য আমার কি ট্রান্সিয়েন্ট API ব্যবহার করা উচিত?


18

আসুন ধরে নেওয়া যাক যে একটি প্লাগইন রয়েছে যা খুব জটিল ক্যোয়ারী সহ 20 টি সম্পর্কিত পোস্ট (প্রতিটি পোস্টের জন্য) প্রদর্শন করে। এবং তারপরে এই ক্যোয়ারী থেকে ডেটা ব্যবহার করে এটি জটিল এইচটিএমএল লেআউট তৈরি করে। এছাড়াও, লক্ষ করা উচিত যে প্লাগইনটি সর্বজনীন, এবং কোনও কনফিগারেশন সহ যে কোনও সার্ভারে ইনস্টল করা যেতে পারে।

কিছুটা এইরকম:

/* complex and large query */
$related_posts = get_posts( ... );

$html_output = '';
foreach($related_posts as $key => $item) {
     /* complex layout rendering logic (but not as slow as the previous query) */   
     $html_output .= ...;
}

সুতরাং আমার প্রশ্নগুলি হ'ল:

  • এই জাতীয় ডেটা ক্যাশে করার নিরাপদ এবং সবচেয়ে সঠিক উপায় কী?
  • ক্যাশে $related_postsঅ্যারে বা $html_outputস্ট্রিংয়ের জন্য আমার কি ট্রান্সিয়েন্ট এপিআই ব্যবহার করা উচিত ? আমি যদি $html_ouputস্ট্রিংকে ক্যাশে দিই , তবে এটি কি কোনও সর্বোচ্চ-আকারের সীমাতে পৌঁছে যাবে? বাঁচানোর আগে আমার কি তা সম্ভবত জিজিপ করা উচিত?
  • আমার কি এখানে ট্রান্সিয়েন্ট এপিআই ব্যবহার করা উচিত?

উত্তর:


18

আমার কি এখানে ট্রান্সিয়েন্ট এপিআই ব্যবহার করা উচিত?

না।

স্টকগুলিতে ওয়ার্ডপ্রেস ইনস্টল ট্রান্সিয়েন্টস ডাব্লুপিওপশন সারণীতে সংরক্ষণ করা হয় এবং কেবলমাত্র মূল আপগ্রেডের সময় পরিষ্কার করা হয়। ধরুন আপনার 50,000 পোস্ট রয়েছে, এটি বিকল্প সারণীতে 50,000 অতিরিক্ত সারি রয়েছে। স্পষ্টতই সেগুলি অটোল্যাড = না তে সেট করা আছে, সুতরাং এটি আপনার সমস্ত স্মৃতি গ্রাস করবে না, তবে আরও একটি সতর্কতা রয়েছে।

অপশন টেবিলের অটোলোয়াড ফিল্ডটিতে একটি সূচক নেই, যার অর্থ কলটি wp_load_alloptions()একটি পূর্ণ টেবিল স্ক্যান করতে চলেছে। আপনার যত বেশি সারি থাকবে, তত বেশি সময় লাগবে। আপনি প্রায়শই অপশন টেবিলটিতে লিখেন, মাইএসকিউএল এর অভ্যন্তরীণ ক্যাশগুলি কম কার্যকর হয়।

যদি ক্যাশেড ডেটা সরাসরি কোনও পোস্টের সাথে সম্পর্কিত হয় তবে আপনি পোস্ট মেটাতে এটি সঞ্চয় করে রাখা ভাল। ক্যাশেড সামগ্রী প্রদর্শন করার জন্য এটি প্রতিবার আপনাকে একটি প্রশ্ন সংরক্ষণ করবে, কারণ পোস্ট মেটা ক্যাশে (সাধারণত) ডব্লিউপি_কিউয়ারিতে পোস্ট পুনরুদ্ধারের সময় প্রাইমড থাকে।

মেটা মানের জন্য আপনার ডেটা কাঠামোটি পরিবর্তিত হতে পারে, ক্যাশেড মানটি যদি পুরানো হয় তবে আপনার একটি টাইমস্ট্যাম্প থাকতে পারে এবং আপনার ব্যয়বহুল ক্যোয়ারি সম্পাদন করতে পারেন, অনেকটা ট্রান্সিয়েন্টের মতো আচরণ করবে।

অন্য একটি গুরুত্বপূর্ণ বিষয় মনে রাখা উচিত হ'ল ওয়ার্ডপ্রেস স্থানান্তরগুলি অবিচ্ছিন্ন অবজেক্ট ক্যাচিংয়ের সাথে পরিবেশগুলিতে অস্থির হতে পারে। এর অর্থ হ'ল যদি আপনি আপনার ক্যাশেড ডেটা একটি ট্রান্সিয়েন্টে 24 ঘন্টা সঞ্চয় করে রাখেন তবে এটি 23 ঘন্টা বা 12 বা 5 মিনিটে এমনকি উপলব্ধ হওয়ার কোনও নিশ্চয়তা নেই। অনেকগুলি ইনস্টলের জন্য অবজেক্ট ক্যাশে ব্যাকএন্ড হ'ল রেডিস বা মেমক্যাচের মতো একটি ইন-মেমরি কী-মান স্টোর এবং যদি নতুন অবজেক্টগুলিতে ফিট করার জন্য পর্যাপ্ত বরাদ্দ মেমরি না থাকে তবে পুরানো আইটেমগুলি উচ্ছেদ করা হবে। এটি মেটা স্টোরেজ পদ্ধতির জন্য একটি বিশাল জয়।

অবৈধকরণ আরও স্মার্ট হতে পারে, আপনি কেন X ঘন্টাগুলিতে সম্পর্কিত পোস্ট ক্যাশেগুলিকে অবৈধ করছেন? কিছু বিষয়বস্তু পরিবর্তিত হয়েছে বলেই কি? একটি নতুন পোস্ট যুক্ত করা হয়েছে? একটি নতুন ট্যাগ বরাদ্দ করা হয়েছে? আপনার "জটিল এবং বৃহত ক্যোয়ারী" এর উপর নির্ভর করে আপনি কেবলমাত্র অকার্যকর করতে বেছে নিতে পারেন যদি এমন কিছু ঘটে থাকে যা আপনার প্রশ্নের ফলাফলকে পরিবর্তন করতে চলেছে।

আমার কি ট্রান্সিয়েন্ট এপিআই ব্যবহার করা উচিত $ সম্পর্কিত_পোস্ট অ্যারে, বা $ এইচটিএমএল_আউটপুট স্ট্রিংয়ে? আমি যদি $ html_ouput স্ট্রিংটি ক্যাশে করি, তবে এটি কি কোনও সর্বোচ্চ-আকারের সীমাতে পৌঁছে যাবে? বাঁচানোর আগে আমার কি তা সম্ভবত জিজিপ করা উচিত?

এটি আপনার স্ট্রিংয়ের আকারের উপর অনেক বেশি নির্ভর করে, যেহেতু সেই ডেটা যেটি পিএইচপি, মাইএসকিউএল ইত্যাদির মধ্যে প্রবাহিত হতে চলেছে আপনাকে মাইএসকিউএল এর সীমাতে পৌঁছানোর জন্য খুব চেষ্টা করতে হবে, তবে উদাহরণস্বরূপ প্রতি বস্তুর সীমাবদ্ধ মেমক্যাচড ডিফল্ট মাত্র 1 এমবি।

আপনার "জটিল লেআউটটি রেন্ডারিং লজিক" আসলে কতক্ষণ সময় নেয়? এটি প্রোফাইলারের মাধ্যমে খুঁজে বার করুন। সম্ভাবনা হ'ল এটি খুব দ্রুত কখনই কোনও বাধা হয়ে দাঁড়াবে না।

যদি এটি হয় তবে আমি পোস্ট আইডিগুলি ক্যাশে করার পরামর্শ দেব। ডব্লিউপি_পোস্ট অবজেক্টস নয়, কারণ সেগুলিতে সম্পূর্ণ পোস্টের বিষয়বস্তু থাকবে তবে পোস্ট আইডির কেবল একটি অ্যারে থাকবে। তারপর শুধু একটি ব্যবহার WP_Queryএকটি সঙ্গে post__inযা প্রাথমিক কী দ্বারা একটি খুব দ্রুত মাইএসকিউএল ক্যোয়ারীতে হবে।

এটি বলেছে যে, যদি আইটেম প্রতি প্রয়োজনীয় তথ্য মোটামুটি সহজ হয়, সম্ভবত শিরোনাম, থাম্বনেইল ইউআরএল এবং পারমিলিংক, তবে আপনি মাইএসকিউএল-তে অতিরিক্ত রাউন্ড-ট্রিপের ওভারহেড ছাড়াই এবং কেবল দীর্ঘ এইচটিএমএল-এর ক্যাচিংয়ের ওভারহেড ছাড়াই কেবলমাত্র এই তিনটি সংরক্ষণ করতে পারেন said স্ট্রিং।

বাহ যে অনেক শব্দ, আশা যে সাহায্য করে।


12

সমস্ত ডাব্লুপি কোড পাবলিক কোড নয়

আপনি যদি সর্বজনীন কিছু প্রকাশ করতে চলেছেন তবে কোভসেনিন বলেছে এমন সমস্ত জিনিস পুরোপুরি বৈধ।

যদি আপনি নিজের বা আপনার সংস্থার জন্য ব্যক্তিগত কোড লিখতে চলেছেন তবে বিষয়গুলি আলাদা।

বাহ্যিক অবজেক্ট ক্যাশে হ'ল বড় সুবিধা fit

একটি বাহ্যিক অবিচ্ছিন্ন অবজেক্ট ক্যাশে সেট করার জন্য খুব সুপারিশ করা হয় , যখন আপনি পারেন।

স্থানান্তরকারী এবং মাইএসকিউএল সম্পর্কে কোভেশিনিনের উত্তরে যে সমস্ত কথা বলা হয়েছে তা খুব সত্য এবং ডাব্লুপি নিজেই এবং একগুচ্ছ প্লাগইন অবজেক্ট ক্যাশে ব্যবহার করে ... তারপরে যে পারফরম্যান্স উন্নতি হয়েছে, সেটআপ করার (ছোট) প্রচেষ্টার পক্ষে মূল্যবান রেডিস বা মেমক্যাচের মতো একটি আধুনিক ক্যাশে সিস্টেম।

ক্যাশেড মানগুলি সেখানে নাও থাকতে পারে: এটি দুর্দান্ত

তদুপরি, হ্যাঁ, একটি বাহ্যিক অবজেক্ট ক্যাশে নির্ভরযোগ্য নয় । একটি ক্ষণস্থায়ী সেখানে আসলে কখনও আপনার নির্ভর করা উচিত নয়। আপনি নিশ্চিত এটি কাজ করে যদি ক্যাশে যেখানে তারা না করতে হবে উচিত হবে।

ক্যাশে হ'ল স্টোর, ক্যাশে ক্যাশে।

নির্বাচিতভাবে ক্যাশে ব্যবহার করুন

এই উদাহরণটি দেখুন:

function my_get_some_value($key) {
   // by default no cache when debug and if no external object_cache
   $defUse = ! (defined('WP_DEBUG') && WP_DEBUG) && wp_using_ext_object_cache();
   // make the usage of cache filterable
   $useCache = apply_filters('my_use_cache', $defUse);
   // return cached value if any
   if ($useCache && ($cached = get_transient($key))) {
     return $cached;
   }
   // no cached value, make sure your code works with no cache
   $value = my_get_some_value_in_some_expensive_way();
   // set cache, if allowed
   $useCache and set_transient($key, $value, HOUR_IN_SECONDS);

   return $value;
}

আপনার ব্যক্তিগত সাইটে এই জাতীয় কোড ব্যবহার করে সাইটের পারফরম্যান্স অনেক উন্নতি করতে পারে , বিশেষত আপনার যদি প্রচুর ব্যবহারকারী থাকে।

মনে রাখবেন যে:

  • ডিবাগ চালু হওয়ার সময় ডিফল্টরূপে ক্যাশে ব্যবহৃত হয় না, তাই আশা করি আপনার বিকাশের পরিবেশ নিয়ে on বিশ্বাস করুন, ক্যাশে ডিবাগটিকে নরক করতে পারে
  • ডিফল্টরূপে ক্যাশটি ব্যবহার করা হয় না যখন ডাব্লুপি বহিরাগত অবজেক্ট ক্যাশে ব্যবহার করার জন্য সেট করা থাকে না। এর অর্থ হ'ল মাইএসকিউএলে সংযুক্ত সমস্ত সমস্যার অস্তিত্ব নেই, কারণ আপনি যখন মাইএসকিউএল ব্যবহার করেন তখন আপনি কোনও ক্ষণস্থায়ী ব্যবহার করেন না। সম্ভবত একটি সহজ বিকল্প wp_cache_*ফাংশন ব্যবহার করা হবে , সুতরাং যদি কোনও বাহ্যিক ক্যাশে সেটআপ না করা থাকে, তবে ক্যাশে মেমরিতে ঘটে এবং ডাটাবেস কখনও জড়িত না।
  • আপনার মুখোমুখি হতে পারে এমন কয়েকটি প্রান্তের কেসগুলি পরিচালনা করতে ক্যাশের ব্যবহার ফিল্টারযোগ্য

কোনও ওয়েবসাইট না হলে ক্যাশে নেই ale

আপনার ক্যাশে দিয়ে গতির সমস্যাগুলি সমাধান করার চেষ্টা করা উচিত নয়। আপনার যদি গতির সমস্যা হয় তবে আপনার কোডটি পুনরায় চিন্তা করা উচিত।

কিন্তু ওয়েবসকেলে কোনও ওয়েবসাইট স্কেল করতে ক্যাশেটি বেশ প্রয়োজনীয়

এবং অনেক বার (তবে সর্বদা নয়) খণ্ড, প্রসঙ্গ-সচেতন ক্যাশে আক্রমণাত্মক পূর্ণ পৃষ্ঠার ক্যাচিংয়ের চেয়ে অনেক বেশি নমনীয় এবং উপযুক্ত।

তোমার প্রশ্নগুলো:

আমার কি এখানে ট্রান্সিয়েন্ট এপিআই ব্যবহার করা উচিত?

এটা নির্ভর করে

আপনার কোডটি কি প্রচুর সংস্থান গ্রহণ করে? যদি তা না হয় তবে ক্যাশের দরকার নেই। যেমনটি বলা হয়েছে, কেবল গতির বিষয় নয়। যদি আপনার কোডটি দ্রুত চালিত হয় তবে এটিতে দু'জন ব্যবহারকারীদের জন্য একগুচ্ছ সিপিইউ এবং মেমরি দরকার ... আপনি যখন 100 বা 1000 সমবর্তী ব্যবহারকারী রয়েছেন তখন কী ঘটবে?

যদি আপনি বুঝতে পারেন ক্যাশে একটি ভাল ধারণা হবে ..

... এবং এটি সর্বজনীন কোড: সম্ভবত না । আপনি ক্যাশে নির্বাচন করে বিবেচনা করতে পারেন যেমন আমার সার্বজনীন কোডে আমার উদাহরণের মতো, তবে আপনি যদি এই ধরনের সিদ্ধান্ত প্রয়োগকারীদের উপর ছেড়ে দেন তবে সাধারণত ভাল।

... এবং এটি ব্যক্তিগত কোড: খুব সম্ভবত হ্যাঁ । এমনকি প্রাইভেট কোডের জন্যও, নির্বাচিতভাবে ক্যাশে দেওয়া এখনও ভাল জিনিস, উদাহরণস্বরূপ ডিবাগের জন্য।

মনে রাখবেন, যাইহোক, সেই wp_cache_*ফাংশনগুলি আপনাকে দূষিত ডাটাবেসের ঝুঁকি ছাড়াই ক্যাশে অ্যাক্সেস দিতে পারে।

আমার কি ট্রান্সিয়েন্ট এপিআই ব্যবহার করা উচিত $ সম্পর্কিত_পোস্ট অ্যারে, বা $ এইচটিএমএল_আউটপুট স্ট্রিংয়ে?

এটি অনেক কিছুর উপর নির্ভর করে। স্ট্রিং কত বড়? আপনি কোন বাহ্যিক ক্যাশে ব্যবহার করছেন? আপনি যদি ক্যাশে পোস্টে যাচ্ছেন তবে অ্যারে হিসাবে আইডি সংরক্ষণ করা ভাল ধারণা হতে পারে, তাদের আইডি দ্বারা একটি শালীন সংখ্যা জিজ্ঞাসা করা খুব দ্রুত।

চূড়ান্ত নোটস

ট্রান্সিয়েন্ট এপিআই সম্ভবত ওয়ার্ডপ্রেসের অন্যতম সেরা জিনিস। যে কোনও ধরণের ক্যাশে সিস্টেমের জন্য আপনি যে প্লাগিনগুলি খুঁজে পেতে পারেন তার জন্য ধন্যবাদ, এটি হুডের নিচে কাজ করতে পারে এমন একটি দুর্দান্ত সংখ্যক সফ্টওয়্যারের বোকা সহজ এপিআই হয়ে ওঠে।

ওয়ার্ডপ্রেসের বাইরে, এমন বিমূর্ততা যা বিভিন্ন ক্যাচিং সিস্টেমের একটি গোছা সহ বাক্সের বাইরে কাজ করে এবং কোনও প্রচেষ্টা ছাড়াই আপনাকে একটি সিস্টেম থেকে অন্য সিস্টেমে স্যুইচ করার অনুমতি দেয় এটি খুঁজে পাওয়া খুব কঠিন।

আপনি খুব কমই আমাকে শুনতে পেয়েছেন যে ওয়ার্ডপ্রেস অন্যান্য আধুনিক জিনিসের চেয়ে ভাল, তবে আমি যখন ওয়ার্ডপ্রেসের সাথে কাজ না করি তখন আমি মিস করি এমন কয়েকটি জিনিসের মধ্যে ক্ষণস্থায়ী এপিআই হ'ল।

অবশ্যই ক্যাশে শক্ত, কোড সংক্রান্ত সমস্যাগুলি সমাধান করে না এবং এটি কোনও রূপালী বুলেট নয়, তবে এটি একটি উচ্চ ট্র্যাফিক সাইট তৈরি করার দরকার যা কাজ করে।

ক্যাশে করার জন্য একটি আন্ডার-অপ্টিমাইজড মাইএসকিউএল টেবিল ব্যবহার করার ওয়ার্ডপ্রেস ধারণাটি যথেষ্ট উন্মাদ, তবে কেবলমাত্র ওয়ার্ডপ্রেস, ডিফল্টরূপে এটি করার কারণে নিজেকে ক্যাশে থেকে দূরে রাখা ভাল নয়।

আপনার কীভাবে জিনিসগুলি কাজ করে তা বুঝতে হবে, তারপরে আপনার পছন্দটি বেছে নিন।


2

পূর্ববর্তী উত্তরগুলি ইতিমধ্যে বাধ্যতামূলক " এটি নির্ভর করে " হাইলাইট করেছে , যার সাথে আমি পুরোপুরি একমত।

আমি উপরে একটি সুপারিশ যুক্ত করতে চাই, আমি উপরের বর্ণনার যে দৃশ্যে আমি এটি " অনুমান " করব তার উপর ভিত্তি করে ।

আমি সেক্ষেত্রে ট্রান্সিয়েন্টগুলি ব্যবহার করব না , বরং পোস্ট মেটা ব্যবহার করব , কারণ পরেরটির একটি সুবিধার কারণে: নিয়ন্ত্রণ করুন

আপনার প্রতি পোস্টের ভিত্তিতে ডেটা ক্যাশে করার দরকার পড়ে আপনি যে পরিমাণ ডেটা ক্যাশে করবেন সেটি পোস্টের সংখ্যার উপর নির্ভর করে এবং সময়ের সাথে সাথে বৃদ্ধি পাবে। আপনি একবার নির্দিষ্ট সংখ্যক পোস্টকে ছাড়িয়ে গেলে, আপনার অজানা ক্যাশে ব্যবহারের অনুমতি দেওয়া মেমরির সীমাতে আঘাত হানতে পারে এবং এটি মেয়াদ শেষ হওয়ার আগেই মেমরি থেকে আগের ক্যাশেড ডেটা মুছতে শুরু করবে। এটি এমন পরিস্থিতির দিকে নিয়ে যেতে পারে যেখানে আপনার দর্শনার্থীদের প্রচুর পরিমাণে আগমন ঘটে, যেখানে প্রতিটি দর্শক প্রতিটি পৃষ্ঠার অনুরোধের ভিত্তিতে "অতিরিক্ত জটিল এসকিউএল" ট্রিগার করে এবং আপনার সাইটটি পুরোপুরি ডুবে যাবে।

আপনি যদি আপনার পোস্ট মেটাতে ডেটা ক্যাশে করেন তবে আপনি কেবল এটি কীভাবে সঞ্চয় এবং পুনরুদ্ধার করা হয় তা নিয়ন্ত্রণ করতে পারবেন না, তবে এটি কীভাবে আপডেট হয় তাও আপনি ঠিক নিয়ন্ত্রণ করতে পারেন। আপনি এটির জন্য ক্রোন জব যুক্ত করবেন যা কেবলমাত্র সময়সীমার দিকে চালিত হয় যেখানে সাইটের কোনও ট্রাফিক কম নেই। সুতরাং, "স্লো ক্যোয়ারী" কখনই সাইটের প্রকৃত ব্যবহারকারীদের দ্বারা মুখোমুখি হয় না এবং আপনি এটি প্রাক লোডও করতে পারেন, যাতে প্রথম দর্শক হিট হওয়ার পরে কাজটি ইতিমধ্যে হয়ে যায়।

মনে রাখবেন যে সমস্ত ক্যাচিং একটি বাণিজ্য বন্ধ! এজন্য স্বাভাবিক উত্তরটি "এটি নির্ভর করে।" এবং কেন কোনও "পবিত্র ক্যাচিং গ্রেইল" নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.