Drupal - Limpar tabelas de cache automaticamente

Drupal - Limpar tabelas de cache automaticamente

Por Daniel
- Atualizado 11 months atrás
0 comments

Script e instruções para limpar manualmente ou automaticamente as tabelas de cache do Drupal 8.x: cache_config, cache_container, cache_data, cache_default, cache_discovery, cache_dynamic_page_cache, cache_entity, cache_menu, cache_render e cache_toolbar.

O Drupal 8 possui uma falha/defeito que em algumas instalações, leva as tabelas de cache do banco de dados a um crescimento infinito podendo chegar a centenas de MB ou GB por dia. Este tamanho dificulta o backup e, no pior cenário, o site sai do ar por falta de espaço no servidor.

A solução proposta aqui é temporária, até que a equipe do Drupal solucione o problema. Ela não requer a instalação de nenhum módulo ou complemento, apenas a configuração de um pequeno script PHP que pode ser executado manualmente, através de uma tarefa CRON ou a partir do Agendador de Tarefas do Windows em qualquer computador.

Por que não um módulo para o Drupal? Porque esta alternativa permite limpar as tabelas mesmo quando o Drupal já está offline. Esta solução ainda permite executar o comando de limpeza de fora do servidor, a partir de qualquer computador.

O script PHP para limpar as tabelas de cache

Alterar as configurações para os dados de acesso ao seu banco de dados (nome do db, endereço, user e password) e salvar com a extensão .php em qualquer pasta acessível do servidor (Exemplo: http://www.mywebpage.com/myCleanCacheScript.php). O script pode ser executado manualmente acessando esta URL ou automaticamente, através de uma ação agendada conforme instruções abaixo (recomendado).

<?php
/* =============================================================
/   * Remote Drupal Cache Cleaner
	* Version 1.1 (25/03/2019)
	* 
	* Developed by Daniel BP - [email protected]
	* http://www.danbp.org
	* Copyright 2019 - Daniel BP
	*
	* This software is distributed under the MIT License.
	* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
	*
	* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
	*
	* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
	*
	*
/* =============================================================*/

$servername = "localhost";
$username = "seu_drupal_db_username";
$password = "seu_drupal_db_password";
$dbname = "seu_drupal_db_nome";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Conexão falhou: " . $conn->connect_error ."<BR>");
}

//Tables to truncate
$sqltbl[0] = "cache_config";
$sqltbl[1] = "cache_container";
$sqltbl[2] = "cache_data";
$sqltbl[3] = "cache_default";
$sqltbl[4] = "cache_discovery";
$sqltbl[5] = "cache_dynamic_page_cache";
$sqltbl[6] = "cache_entity";
$sqltbl[7] = "cache_menu";
$sqltbl[8] = "cache_render";
$sqltbl[9] = "cache_toolbar";
$sqltbl[10] = "cache_page";

//Run the command
for($i=0;$i<count($sqltbl);$i++){
    if ($conn->query("TRUNCATE ".$sqltbl[$i]) === TRUE) {
        echo "Limpeza concluída na tabela <i>". $sqltbl[$i] ."</i> .<BR>";
    } else {
        echo "Erro limpando a tabela de cache <i>".$sqltbl[$i].": ". $conn->error ."</i><BR>";
    }
}

$conn->close();
?> 

O comando CRON

Este comando permite a execução de tarefas agendadas em sistemas Linux/Unix. Ele pode ser executado a partir do mesmo servidor em que o Drupal está instalado ou a partir de qualquer computador com acesso à internet. Substituir mywebpage com a URL do script PHP no servidor e depois configurar o CRON para executar o comando abaixo a cada dia, semana, mês ou quando desejar a limpeza.

wget -O - -q -t 1 http://www.mywebpage.com/myCleanCacheScript.php > /dev/null

VB Script para o Agendador de Tarefas do Windows

Substituir a mywebpage pelo endereço do script PHP e salvar no formato Visual Basic Script (Exemplo: runDrupalClear.vbs). O script pode estar em qualquer computador com conexão à internet, não necessariamente no servidor. Configurar o Agendador de Tarefas do Windows para executar este script a cada dia, semana, mês ou quando desejar a limpeza.

On Error Resume Next

Dim objRequest
Dim URL

Set objRequest = CreateObject("Microsoft.XMLHTTP")
URL = "http://www.mywebpage.com/myCleanCacheScript.php"

objRequest.open "GET", URL , false
objRequest.Send
Set objRequest = Nothing