캐시 폼 테이블 크기가 엄청나 다


13

지난 달 캐시 테이블의 크기가 10GB 이상으로 증가했으며 잘라서 일시적으로 수정했습니다. 마지막으로 확인했을 때 약 1GB였습니다. 몇 달 안에 다시 10GB를 기록 할 것입니다. 이 문제를 어떻게 처리해야합니까?

이 사이트에서 모든 크론 작업을 비활성화했습니다. 이것이 이유 인 경우 어떤 cron을 활성화해야합니까?

답변:


24

{cache_form}테이블은 약간 웃기 며 다른 캐시 테이블과 약간 다른 방식으로 작동합니다.

당신이 보면 drupal_flush_all_caches()당신은 {cache_form}지워지지 않은 것을 볼 수 있습니다. 이것은 진행중인 양식이 손상되지 않도록 보호하기위한 것입니다.

system_cron()함수는 {cache_form}다른 캐시 테이블과 함께 오래된 데이터를 제거합니다 .

모든 Drupal 사이트 에서 cron 을 실행해야합니다 . 당신이 {cache_form}테이블을 풍성하게 여기면, 당신 {watchdog}{session}테이블도 내기를 걸었 습니다. 다른 많은 모듈들은 자체 hook_cron()기능의 일부로 하우스 키핑 활동을 실행 합니다.

이슈 큐를 찌를 수도 있습니다. 에 버그가 발생 {cache_form}했으며 버그가 있을 수 있습니다.


좋아, 지금은 크론을 올바르게 설정했지만 여전히 하루에 2GB로 자랐지 만 1 주일 이후로 일정하다는 것을 알 수있었습니다. 이 표에 무엇이 저장됩니까?
GoodSp33d

1
{cache_form}에 진행중인 양식 제출이 있습니다. {watchdog}에는 로그가 있고 {session}에는 세션 정보 (사용자 별 상태)가 있습니다.
mpdonadio

6

Thumb Rule : 웹 사이트 관리를 위해 Cron을 정기적으로 실행해야합니다.

MPD에 대한 의견에서 cron을 설정하고 정기적으로 실행하더라도 cache_form 테이블이 빠르게 커지고 있다고 언급했습니다.

이에 대한 한 가지 해결책은 cron을 더 자주 실행하는 것입니다. 6 시간 이하로 말하세요? 여유가 없다면 더 읽어보십시오.

대체 솔루션 :

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

Elysia Cron을 설치 하면 이제 모듈의 cron 기능을 별도로 실행할 수 있습니다. 6 시간마다 모듈이 실행되도록 Elysia cron의 빈도를 유지할 수 있습니다. 그래야 당신의 cache_form표는 6 시간마다 제거됩니다.

이 제거 프로세스 동안 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;

의견을 읽으면 그들은 충분해야한다고 가정하고 있으며 귀하의 경우에는 너무 많아지고 있습니다. 따라서 cache_form 테이블을 더 자주 지우고 $ expire 값을 더 낮은 값으로 줄이십시오. cache_form 항목을 기본값 6 6 시간보다 자주 지우려면 TTL을 변경해야합니다. cache_form 항목

cacheboject 를 설치 한 후 hook_cacheobject_presaveTTL을 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 시간 내에 제출하지 않으면 (설정 한 RTL 값) 양식 데이터가 손실되고 양식 만료 문제가 발생할 수 있습니다.



1

작업중인 사이트에서 성능 문제가 발생했을 때 캐싱을 수정 한 후에이 문제가 발생했습니다. 여기에서 기사를 읽을 수 있습니다.https://thinktandem.io/blog/2017/11/22/debugging-with-new-relic-blazemeter-strace-more/

내 블로그 게시물에서 대기열 및 cron 설정을 추가 한 다음 Elysia Cron 과 같은 것을 사용하여 모두 잘 작동하도록 할 수 있습니다.

/**
 * 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

사용 안전의 cache_form 지우기 모듈을 .

먼저 테이블을 적당한 크기로 정리 한 다음 유지 보수 할 수 있습니다.

프로젝트 페이지에서 발췌 한 요약 :

cache_form 테이블에서 제한된 수의 항목을 안전하게 제거하십시오.

모듈이 설치되면 먼저 cache_form을 제거하십시오. drush safe-cache-form-clear 테이블 크기가 일정하게 유지 될 때까지 하여 6 시간보다 오래된 모든 레코드를 제거했음을 나타냅니다.

그런 다음 cron에서 계속 실행됩니다.

이것은 Acquia 가 가입자 를 위해이 목적으로 문서화 한 모듈 입니다. Acquia 문서 페이지는 유용한 추가 정보를 제공합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.