回答:
{cache_form}テーブルには、ちょっと面白いですし、他のキャッシュテーブルと若干異なるように動作します。
あなたが見て取ればdrupal_flush_all_caches()、あなたはそれが表示されます{cache_form}クリアされません。これは、進行中のフォームが破壊されるのを防ぐためです。
このsystem_cron()関数は{cache_form}、他のキャッシュテーブルとともに古いデータを整理します。
本当にすべてのDrupalサイトでcronを実行する必要があります。あなたならば{cache_form}表がginourmousで、その後、私はあなたを賭ける{watchdog}と{session}テーブルもあります。他の多くのモジュールは、独自のhook_cron()機能の一部としてハウスキーピングアクティビティを実行します。
また、課題キューを確認することもできます。にはいくつかのバグが{cache_form}あり、あなたはそのうちの1つにぶつかる可能性があります。
親指のルール:ウェブサイトの管理のためにCronを定期的に実行する必要があります。
MPDへのコメントで、cronをセットアップして定期的に実行しているにもかかわらず、cache_formテーブルが急速に成長していると述べました。
その解決策の1つは、cronをより頻繁に実行することです。6時間以下ごとに言いますか?あなたがそれを行う余裕がない場合は、さらに読みます。
代替ソリューション:
mymodule_cron() {
    cache_clear_all(NULL, 'cache_form');
}Elysia Cronをインストールすると、モジュールのcron機能を個別に実行できます。モジュールのElysia cronの頻度を6時間ごとに実行するように保つことができます。したがって、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;
  }
}このアプローチの欠点の1つは、フォームが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のドキュメントページには、追加情報があります。