কাস্টম ক্যাচিং বাস্তবায়নের জন্য সেরা অনুশীলন?


17

প্রতিটি ধরণের সত্তার প্রতিটি উদাহরণের জন্য, আমি বেশ কয়েকটি ক্যাশে উত্পন্ন করি, যার নাম দেওয়া হয়েছে: [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]

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

এই ক্যাশেগুলি কীভাবে সংরক্ষণ / পরিষ্কার করব?

বর্তমানে আমি কেবল ক্যাশে_সেট () করছি তবে আমি যখন সাফ করতে চাই তখন এটি একটি সমস্যা উপস্থাপন করে, কারণ আমি সমস্ত প্রাসঙ্গিক ক্যাশের নাম জানি না। Db_delete () দিয়ে ক্যাশে এন্ট্রিগুলি ফেলে রাখা কি নিরাপদ?


আপনি যদি সমস্ত প্রাসঙ্গিক ক্যাশের নাম জানেন না, আপনি কীভাবে ব্যবহার করতে পারেন db_delete()?
কিমলালুনো

উত্তর:


6

ক্যাশে থেকে এন্ট্রি মোছার জন্য আপনার ক্যাশে_স্কিয়ার_সর্বস্ব () ব্যবহার করা উচিত । কারণটি হ'ল ব্যবহৃত ক্যাশে বাস্তবায়ন সক্রিয় ডাটাবেসে ডাটাবেস টেবিলটি ব্যবহার করতে পারেনি। ড্রুপাল ডেটাবেস ক্যাশে ক্লাসের সাথে এটিই ঘটে তবে প্রতিটি শ্রেণীর ক্ষেত্রে এটি সত্য হওয়া উচিত নয়।

আপনি যদি _ ক্যাশে_জেট_বজেক্ট () ( ক্যাশে_জেট () এবং ক্যাশে_সেট () দ্বারা ডাকা ফাংশন ) দেখেন তবে লক্ষ্য করবেন যে এটিতে নীচের কোড রয়েছে।

  static $cache_objects; 
  if (!isset($cache_objects[$bin])) {
    $class = variable_get('cache_class_' . $bin);
    if (!isset($class)) {
      $class = variable_get('cache_default_class', 'DrupalDatabaseCache');
    }
    $cache_objects[$bin] = new $class($bin);
  }
  return $cache_objects[$bin];

প্রতিটি ক্যাশে বিন স্টোরের জন্য ক্যাশে বাস্তবায়নের শ্রেণি আলাদা হতে পারে এবং এমনকি ডিফল্টটিকেও পরিবর্তন করা যেতে পারে।

প্রাইভেট আপডেটের স্ট্যাটাস ক্যাশে সিস্টেম ঠিক কীভাবে _update_cache_clear () , _update_cache_get () এবং _update_cache_set () এ সাধারণ ক্যাশে ফাংশন ব্যবহার করে না তা ব্যাখ্যা করে । (জোর আমার।)

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

আপডেট ম্যানেজার মডিউল এখনও {cache_update} টেবিল ব্যবহার করে, কিন্তু এর পরিবর্তে ব্যবহার cache_set(), cache_get()এবং cache_clear_all()বেসরকারী সাহায্যকারী ফাংশন যে এই একই প্রাথমিক কাজ বাস্তবায়ন কিন্তু নিশ্চিত করুন যে ক্যাশে অকালে সাফ করা হবে না আছে, এবং তথ্য সবসময় মধ্যে সংরক্ষিত হয় যে ডাটাবেস, এমনকি মেমক্যাস বা অন্য কোনও ক্যাশে ব্যাকএন্ড ব্যবহার করা হলেও।

আপডেট ম্যানেজারের সুনির্দিষ্ট প্রয়োজন রয়েছে যা প্রয়োজনীয় তথ্য প্রয়োজন কারণ খুব ঘন ঘন আপডেট তথ্য আনার চেষ্টা করলে দ্রুপাল.আর সার্ভারগুলির সাথে সমস্যা দেখা দিতে পারে, এই বিষয়টি বিবেচনা করে যে আপডেট ম্যানেজারটি কোনও ড্রপাল চলমান কোনও সাইট থেকে আপডেট তথ্য আনতে পারে।

আপনার ক্ষেত্রে, আপনি [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]একটি একক ক্যাশে বিন স্টোরের জন্য ক্যাশে আইডি হিসাবে ব্যবহার করতে পারেন । সত্তার জন্য আপনাকে সমস্ত এন্ট্রি মুছতে হবে, আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন।

cache_clear_all("{$module}__{$entity_type}__{$entity_id}__", $bin, TRUE);

আপনি $moduleযখন ক্যাশে সাফ করার সময় নির্ধারিত মানটি যদি না পেয়ে থাকেন বা আপনি যে মডিউলটির জন্য ডেটা ক্যাশে করেছেন তা থেকে স্বাধীনভাবে ক্যাশে এন্ট্রি মুছতে চান, তবে আপনি আলাদা ক্যাশে আইডি ব্যবহার করতে পারেন, যেমন [entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from], বা [entity_type]__[entity_id]__[module_name]__[string_depending_on_where_the_cache_came_from]cache_clear_all()স্ট্রিং আর্গুমেন্ট হিসাবে পাস, দিয়ে শুরু একটি ক্যাশে আইডি যখন এমন সমস্ত ক্যাশে এন্ট্রি মুছে ফেলা $wildcardহয় TRUE, এবং ক্যাশে ID নয় '*'। এই ক্ষেত্রে, নিম্নলিখিত কোডটি দিয়ে ক্যাশে সাফ হবে।

cache_clear_all("{$entity_type}__{$entity_id}__", $bin, TRUE);

8

ম্যানুয়ালি এন্ট্রিগুলি বাদ দেওয়ার কারণে আমি কোনও ভাল কারণ ভাবতে পারি না। এটি অবশ্যই ধরে নিয়েছে যে আপনি মাইএসকিউএলকে আপনার নির্দিষ্ট ক্যাশের ব্যাকএন্ড হিসাবে ব্যবহার করছেন; যদিও আমি মনে করি এটি একইরকম অন্য কোনও ধরণের ক্যাশে ব্যাকএন্ডের ক্ষেত্রে প্রযোজ্য, কেবল সাফ করার পদ্ধতিটি অগত্যা একটি ডেটাবেস কোয়েরি হবে না।

আপনি যদি উদাহরণ হিসাবে মূল আপডেট মডিউলটি নেন তবে এটি cache_*ফাংশনগুলি বাইপাস করে এবং এর ক্যাশে নিজেই সাফ করে:

function _update_cache_clear($cid = NULL, $wildcard = FALSE) {
  if (empty($cid)) {
    db_delete('cache_update')
      // Clear everything except fetch task information because these are used
      // to ensure that the fetch task queue items are not added multiple times.
      ->condition('cid', 'fetch_task::%', 'NOT LIKE')
      ->execute();
  }
  else {
    $query = db_delete('cache_update');
    if ($wildcard) {
      $query->condition('cid', $cid . '%', 'LIKE');
    }
    else {
      $query->condition('cid', $cid);
    }
    $query->execute();
  }
}

আমি সবসময় মনে করি "যদি এটি কোরের পক্ষে যথেষ্ট ভাল হয় তবে এটি আমার পক্ষে যথেষ্ট ভাল" :)

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