답변:
이 {cache_form}
테이블은 약간 웃기 며 다른 캐시 테이블과 약간 다른 방식으로 작동합니다.
당신이 보면 drupal_flush_all_caches()
당신은 {cache_form}
지워지지 않은 것을 볼 수 있습니다. 이것은 진행중인 양식이 손상되지 않도록 보호하기위한 것입니다.
이 system_cron()
함수는 {cache_form}
다른 캐시 테이블과 함께 오래된 데이터를 제거합니다 .
모든 Drupal 사이트 에서 cron 을 실행해야합니다 . 당신이 {cache_form}
테이블을 풍성하게 여기면, 당신 {watchdog}
과 {session}
테이블도 내기를 걸었 습니다. 다른 많은 모듈들은 자체 hook_cron()
기능의 일부로 하우스 키핑 활동을 실행 합니다.
이슈 큐를 찌를 수도 있습니다. 에 버그가 발생 {cache_form}
했으며 버그가 있을 수 있습니다.
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_presave
TTL을 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 값) 양식 데이터가 손실되고 양식 만료 문제가 발생할 수 있습니다.
이 문제에 대한 해결책으로 https://www.drupal.org/project/session_cache_form 모듈을 만들었습니다.
작업중인 사이트에서 성능 문제가 발생했을 때 캐싱을 수정 한 후에이 문제가 발생했습니다. 여기에서 기사를 읽을 수 있습니다.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();
}
먼저 테이블을 적당한 크기로 정리 한 다음 유지 보수 할 수 있습니다.
프로젝트 페이지에서 발췌 한 요약 :
cache_form 테이블에서 제한된 수의 항목을 안전하게 제거하십시오.
모듈이 설치되면 먼저 cache_form을 제거하십시오. drush safe-cache-form-clear
테이블 크기가 일정하게 유지 될 때까지 하여 6 시간보다 오래된 모든 레코드를 제거했음을 나타냅니다.
그런 다음 cron에서 계속 실행됩니다.
이것은 Acquia 가 가입자 를 위해이 목적으로 문서화 한 모듈 입니다. Acquia 문서 페이지는 유용한 추가 정보를 제공합니다.