캐시 지우기가 캐시 테이블을 지우지 않습니까?


11

캐시 지우기 작업을 완전히 이해하지 못했습니다. 캐시 지우기를 클릭하십시오 : 모든 캐시 지우기 : admin / config / development / performance에서 데이터베이스로 이동하여 모든 cache _... 테이블을 확인하면 비어있는 것이 없습니다.

이것이 정상입니까?
모든 cache _... 테이블을자를 수 있습니까?

사실 나는 cache_form을 지워야합니다. 이 테이블을자를 수 있습니까?

답변:


13

모든 cache _... 테이블을자를 수 있습니까?

"cache_form"테이블은 Drupal에서 유효성을 검사하기 위해 사용하는 데이터를 포함하므로 잘라서는 안됩니다. 해당 테이블을 삭제하면 현재 사용자가 제출 한 양식이 무효화되고 사용자가 양식을 다시 제출해야합니다.

모듈이 이상하게 작동하게하는 다른 캐시 테이블이있을 수 있습니다. 이것이 추가 캐시 테이블을 사용하는 모듈 (일반적으로 "cache_"로 시작하는 모듈)이 Drupal에서 지울 수있는 캐시 테이블을 반환하기 위해 hook_flush_cache () 를 구현 해야하는 이유입니다 . 발 drupal_flush_all_caches () .

  $core = array('cache', 'cache_path', 'cache_filter', 'cache_bootstrap', 'cache_page');
  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all('*', $table, TRUE);
  }

drupal_flush_all_caches()성능 설정 페이지에서 "모든 캐시 지우기"단추를 클릭 할 때 호출되는 제출 양식 핸들러 인 system_clear_cache_submit () 에서 호출 된 함수 입니다.

cron 태스크 중에 system_cron () 은 다음 코드를 사용하여 캐시를 지 웁니다.

  $core = array('cache', 'cache_path', 'cache_filter', 'cache_page', 'cache_form', 'cache_menu');
  $cache_tables = array_merge(module_invoke_all('flush_caches'), $core);
  foreach ($cache_tables as $table) {
    cache_clear_all(NULL, $table);
  }

의 첫 번째 인수로 cache_clear_all은 () 이다 NULL, 실행 코드 DrupalDatabaseCache :: 명확 () (드루팔 7) 다음이다.

if (variable_get('cache_lifetime', 0)) {
  // We store the time in the current user's $user->cache variable which
  // will be saved into the sessions bin by _drupal_session_write(). We then
  // simulate that the cache was flushed for this user by not returning
  // cached data that was cached before the timestamp.
  $user->cache = REQUEST_TIME;

  $cache_flush = variable_get('cache_flush_' . $this->bin, 0);
  if ($cache_flush == 0) {
    // This is the first request to clear the cache, start a timer.
    variable_set('cache_flush_' . $this->bin, REQUEST_TIME);
  }
  elseif (REQUEST_TIME > ($cache_flush + variable_get('cache_lifetime', 0))) {
    // Clear the cache for everyone, cache_lifetime seconds have
    // passed since the first request to clear the cache.
    db_delete($this->bin)
        ->condition('expire', CACHE_PERMANENT, '<>')
        ->condition('expire', REQUEST_TIME, '<')
        ->execute();
    variable_set('cache_flush_' . $this->bin, 0);
  }
}

이 코드는에서 영구적으로 표시되지 않고 행에서 반환 된 테이블 hook_flush_caches()과 "cache_form"을 포함하여 Drupal에서 사용 된 다양한 캐시 테이블에서 만료 된 행만 제거합니다 . "cache_form"에 너무 많은 행이 없어야합니다. 이 경우 cron 태스크를 두 번 연속으로 실행하는 데 걸리는 시간을 줄이거 나 사용자 정의 모듈에서 다음 코드를 실행할 수 있습니다.

cache_clear_all(NULL, 'cache_form');

다른 방법은 Devel 모듈과 표시되는 메뉴 링크를 사용하여 캐시를 수동으로 지우는 것입니다.

스크린 샷


내 문제는 cache_form 테이블의 크기가 63 일 동안 제작 된 웹 사이트의 크기가 63 일입니다. 내 두려움은이 테이블이 통제없이 성장할 것이라는 점이다.
chefnelone

1
cron을 설정 한 경우 모든 캐시 (cache_form 포함)에서 만료 된 항목은 실행될 때마다 지워 져야합니다.
mpdonadio

1
@chefnelone kiamlaluno가 설명했듯이 cron을 올바르게 설정하면이 테이블을 주기적으로 지워야합니다.
아마추어 바리 스타

2
@kiamlaluno,이 답변을 읽는 것은 매우 유익하고 실용적이며 캐시 관련 가시에 대한 편리한 빠른 참조입니다. 1+
아마추어 바리 스타

당신이 말했듯이 cron이 실행되고 테이블이 정리되었습니다. 감사.
chefnelone

6

UI를 통해 캐시를 지우는 경우 페이지가 다시로드되면 캐시가 다시 채워지기 시작합니다. 즉, 해당 페이지를 새로 고치면 Drupal이 사물을 다시 캐시하기 시작합니다 (특히 cache_menu).

DELETE FROM cache다양한 테이블에서 안전하게 할 수 있습니다 .

또한 drush cc all캐시 를 수행하면 캐시 테이블이 완전히 비워집니다.


고맙습니다, 단지 cache_form을 지워야합니다. 이 테이블을자를 수 있습니까?
chefnelone

4
api.drupal.org/api/drupal/includes%21common.inc/function/…에 대한 코드를 읽으면 cache_form이 지워지지 않은 이유와 이유가 표시됩니다. 이것이 좋다고 긍정적 이라면 , 그렇게 할 수있을 것입니다. cache_form이 항목을 만료하지 않고 바인딩되지 않은 몇 가지 역사적인 버그가있었습니다.
mpdonadio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.