कैश फॉर्म टेबल का आकार बहुत बड़ा है


13

कैश टेबल का आकार पिछले महीने बढ़कर 10+ जीबी हो गया था, और मैंने इसे अस्थायी रूप से छोटा कर दिया था। पिछली बार मैंने जाँच की थी कि यह लगभग 1GB है। इसलिए कुछ महीनों में यह फिर से 10GB पर पहुंच जाएगा। इससे कैसे निपटा जाना चाहिए?

ध्यान दें कि मैंने इस साइट पर सभी क्रोन नौकरियों को निष्क्रिय कर दिया है। यदि यह कारण है, तो किस क्रोन को सक्षम किया जाना चाहिए?

जवाबों:


24

{cache_form}तालिका अन्य कैश तालिकाओं की तुलना में थोड़े अलग तरीके से में एक छोटे से अजीब है, और बर्ताव करता है।

यदि आप एक नज़र डालते हैं drupal_flush_all_caches()तो आप देखेंगे कि {cache_form}साफ़ नहीं किया गया है। यह इन-प्रोग्रेस प्रपत्रों को नुक्कड़ होने से बचाने के लिए है।

system_cron()समारोह से पुराने डेटा बाहर छंटाई का ले देखभाल करता है {cache_form}अन्य कैश तालिकाओं के साथ।

आपको वास्तव में सभी ड्रुपल साइटों पर क्रोन चलाना चाहिए । यदि आप {cache_form}तालिका ginourmous है, तो मुझे यकीन है अपने {watchdog}और {session}तालिकाओं कर रहे हैं, भी। कई अन्य मॉड्यूल अपने स्वयं के hook_cron()कार्यों के तहत हाउसकीपिंग गतिविधि चलाते हैं ।

तुम भी मुद्दे कतार के आसपास प्रहार करना चाहते हो सकता है। के साथ कुछ कीड़े हो गए हैं {cache_form}, और आप एक में चल रहे हो सकते हैं।


ठीक है, मैंने अभी ठीक से क्रोन की स्थापना की थी, लेकिन फिर भी मैं देख सकता था कि यह एक दिन में 2 जीबी तक बढ़ गया है, लेकिन एक सप्ताह से निरंतर है। इन तालिकाओं में क्या संग्रहीत किया जाएगा?
GoodSp33d

1
{cache_form} में प्रगति प्रपत्र प्रस्तुतियाँ हैं। {watchdog} में लॉग हैं, और {सत्र} में सत्र की जानकारी (प्रति-उपयोगकर्ता स्थिति) है।
mpdonadio

6

अंगूठा नियम: क्रोन को नियमित रूप से आपकी वेबसाइट के हाउसकीपिंग के लिए चलाया जाना चाहिए।

आपने एमपीडी को अपनी टिप्पणी में उल्लेख किया है कि क्रोन की स्थापना और उन्हें नियमित रूप से चलाने के बावजूद आपका कैश_फॉर्म टेबल जल्दी से बढ़ रहा है।

इसका एक समाधान यह है कि आप अपने क्रोन को अधिक बार चलाएं। हर छह घंटे या उससे कम कहें? यदि आप इसे आगे पढ़ने का जोखिम नहीं उठा सकते हैं।

वैकल्पिक समाधान:

mymodule_cron() {
    cache_clear_all(NULL, 'cache_form');
}

एलिसिया क्रोन स्थापित करें और अब आप अपने मॉड्यूल के क्रोन फ़ंक्शन को अलग से चला सकते हैं। आप हर छह घंटे चलाने के लिए आप मॉड्यूल के लिए एलिसिया क्रोन की आवृत्ति रख सकते हैं। ताकि cache_formहर छह घंटे में आपकी टेबल छंट जाए।

इस प्रूनिंग प्रक्रिया के दौरान जो प्रविष्टियाँ 6 घंटे से अधिक पुरानी नहीं हैं, उन्हें हटाया नहीं जाएगा। कारण, यदि सभी प्रविष्टियाँ हटा दी जाती हैं, तो प्रविष्टियों को हटाने के समय प्रस्तुत किए जाने वाले किसी भी रूप में अजीब व्यवहार हो सकता है।

Https://api.drupal.org/api/drupal/includes .form.inc/function/ form_set_cache/7 में कोड देखें

function form_set_cache($form_build_id, $form, $form_state) {
  // 6 hours cache life time for forms should be plenty.
  $expire = 21600;

जैसा कि टिप्पणी पढ़ती है कि वे मान रहे हैं कि यह बहुत होना चाहिए और आपके मामले में यह आपके लिए बहुत अधिक हो रहा है। इसलिए ट्रिक या तो कैश_फॉर्म टेबल को अधिक बार क्लियर करना है और $ एक्सपायर की वैल्यू को कम मूल्य पर कम करना है, यदि आप कैशे_फॉर्म एंट्रीज को 6 बार के डिफ़ॉल्ट मूल्य से अधिक बार क्लियर करना चाहते हैं तो आपको टीटीएल को बदलने की आवश्यकता है cache_form प्रविष्टियाँ।

आप ऐसा कर सकते हैं कि कैशेबोजेक्ट स्थापित करके और फिर उसे लागू करके hook_cacheobject_presaveआप टीटीएल को 2 या 3 घंटे में बदल सकते हैं।

mymodule_cacheobject_presave()($object, $cid, $bin) {
  // Extend the expiry period for prototype forms used in ajax enabled forms.                                                                  
  $cache_ttl = 1 ; // Change it to any number of hours
  if ($bin == 'cache_form') {
    $object->expire = REQUEST_TIME + $cache_ttl * 3600;
  }
}

इस दृष्टिकोण का एक पहलू यह है कि यदि फॉर्म 2 घंटे के भीतर जमा नहीं किए जाते हैं (आपके द्वारा निर्धारित आरटीएल मान) फॉर्म का डेटा खो सकता है और आपको कुछ फॉर्म की समय सीमा समाप्त हो सकती है।



1

जब मैं जिस साइट पर काम कर रहा था, उसमें प्रदर्शन के मुद्दे थे, मैंने कैशिंग तय करने के बाद इसमें भाग लिया। आप यहां लेख पढ़ सकते हैं: https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

मेरे ब्लॉग पोस्ट से, आप एक कतार और क्रोन सेटअप जोड़ सकते हैं, फिर एलीसिया क्रोन जैसी किसी चीज़ का उपयोग करके इसे एक साथ बना सकते हैं:

/**
 * Implements hook_cron_queue_info()
 */
function THE MODULE_cron_queue_info() {
  // Set up the worker queue.
  $queues['THE MODULE_queue'] = array(
    'worker callback' => 'THE MODULE_queue_process',
    'time' => 600,
  );
  return $queues;
}

/**
 * Implements hook_cron()
 */
function THE MODULE_cron() {
  // Load up our worker queue.
  $queue = DrupalQueue::get('THE MODULE_queue');

  // Set up the query for expired results.
  $sql = "SELECT cid FROM {cache_form} WHERE expire < :time";
  $query = db_query($sql, array(':time' => REQUEST_TIME));
  $results = $query->fetchAll(PDO::FETCH_ASSOC);

  // Split this into chunks for safety and speed.
  $chunks = array_chunk($results, 5000);
  foreach ($chunks as $chunk) {
    // Add the chunk to the queue worker.
    $queue->createItem($chunk);
  }
}

/**
 * Worker callback defined in hook_cron_queue_info().
 *
 * @param array $data
 *   The array of cids we want to delete.
 */
function THE MODULE_queue_process($data) {
  db_delete('cache_form')
    ->condition('cid', $data, 'IN')
    ->execute();
}

1

सेफ कैश_फॉर्म क्लियर मॉड्यूल का इस्तेमाल करें ।

यह आपको तालिका को पहले उचित आकार देने देगा, फिर इसे बनाए रखेगा।

परियोजना पृष्ठ से उत्कीर्ण सारांश:

कैशलीफॉर्म टेबल से सीमित संख्या में आइटम को सुरक्षित रूप से हटा दें।

एक बार मॉड्यूल स्थापित हो जाने के बाद, पहले prune cache_form: drush safe-cache-form-clearतब तक चलाएं जब तक कि तालिका आकार सुसंगत न हो जाए, यह दर्शाता है कि आपने 6 घंटे से अधिक पुराने सभी रिकॉर्ड हटा दिए हैं।

यह फिर क्रोन पर चलना जारी रखेगा।

यह अपने ग्राहकों के लिए एक्विआ द्वारा इस उद्देश्य के लिए दस्तावेजित मॉड्यूल है । Acquia प्रलेखन पृष्ठ अच्छी अतिरिक्त जानकारी प्रदान करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.