Para um site de grande instituição, com caches pesados, eu gostaria de gerar caches o mais rápido possível, para que nenhum usuário possa chegar na geração de cache ...
Eu tenho um cron definido todos os minutos para isso, executando algumas funções e solicitando páginas críticas, mas o que estou procurando é uma maneira de saber quando o cache acabou de ser limpo , de preferência um gancho, para que eu possa iniciar isso. funções geradoras.
Qualquer ideia ?
Respostas:
Não existe no Drupal 7.x, mas isso foi adicionado como um gancho central, hook_rebuild no Drupal 8.x, depois que um número suficiente de pessoas solicitou. Porém, pode haver uma maneira melhor de resolver seu problema no 7.x - você está tentando iniciar algum tipo de funcionalidade de aquecimento do cache logo após o cron limpar o cache, correto? Outra maneira de abordar isso seria usar o Elysia cron, que possui várias melhorias significativas na forma como o cron opera, mas duas que podem ser relevantes para o seu caso de uso são:
Você pode usar este módulo para ter um controle mais refinado sobre como o cron é executado para ajudar a resolver o problema de cache obsoleto. Especificamente, você pode adicionar um gancho às funções de reconstrução do cron e, em seguida, usando o Elysia cron, defina essas operações para serem executadas imediatamente após a operação de limpeza de cache.
Também parece que você pode estar tendo problemas com o cron em execução, o que frequentemente leva à recriação do cache com muita frequência. Se for esse o caso, você pode definir a operação específica de limpeza de cache no Elysia cron para ser executada em uma taxa diferente do restante das operações cron, portanto, por exemplo, a indexação da pesquisa será atualizada a cada 5 minutos, mas a limpeza completa do cache será executada apenas a cada 6 horas, etc.
fonte
Não, não existe. Na verdade não. Pelo menos não em 6 ou 7. Supondo 7:
Se você olhar
drupal_flush_all_caches()
, verá que ele chamahook_flush_caches()
. Este gancho é destinado a:Seria tentador simplesmente fazer o gancho do seu módulo durar e escrever o código lá. Mas vamos olhar novamente
drupal_flush_all_caches()
. A exclusão real ocorre assim:Isso significa que todos os ganchos são disparados antes que algo seja realmente limpo. Há apenas uma função chamada após a exclusão real,
_system_update_bootstrap_status()
mas ele só chamahook_boot
,hook_exit
,hook_watchdog
ehook_language_init
- conecta você não deseja implementar apenas para fornecer a funcionalidade de cache-claro-dependente.fonte
A maneira de fazer isso é usar
hook_flush_caches
em combinação comregister_shutdown_function
. Código de exemplo:Usar
register_shutdown_function
significa que nossa função de reconstrução de cache será chamada após a limpeza dos caches. Estamos abusandohook_flush_caches
de uma maneira que nunca foi planejada para ser usada, mas isso deve fazer exatamente o que você precisa.fonte
Traços gerais aqui:
Embora não exista um gancho disponível no pré-D8, você pode escrever seu próprio back-end do banco de dados com base no padrão
DrupalDatabaseCache
e, em seguida, gravar todo ou qualquer tipo de lógica em suaclear()
função. Uma rápida olhada sugeriria que isso é razoavelmente simples no D7 (basta copiar a classe para o seu nome personalizado e modificá-lo etc., lançando ummodule_invoke_all()
conforme apropriado) e com o módulo cache_backport funcionaria no D6. Em seguida, aponte as caixas de cache que você deseja que fiquem claras e você deve estar a caminho.fonte
Se você procurar a fonte para
drupal_flush_all_caches()
eclear_cache_all()
, verá que nenhum gancho é chamado após a limpeza, o que é uma chatice de bug.É muito difícil garantir que um usuário nunca precise esperar que algumas entradas de cache sejam criadas, por isso tento evitar o máximo possível de limpezas completas de cache.
Um método que realmente ajuda é alterar a página de desempenho para conectar um manipulador de envio que apenas limpa os caches voltados para a frente e não toca nos menus, no registro e nos caches principais semelhantes. Eu tive bons resultados com isso, pois a reconstrução de menus e registros leva cerca de metade do tempo para uma reconstrução completa do cache.
A outra coisa que eu tenho um script drush que faz um
drupal_http_request()
em todos os meus URLs (não apenas os importantes) para que tudo fique em cache. Como isso é feito varia de acordo com o site. Às vezes, posso apenas EFQ os nós publicados e criar URLs dessa maneira. Outras vezes, você pode consultar as tabelas do sitemap XML para obter seu URL. Eu chamo isso do meu sistema cron quantas vezes eu precisar.fonte
Duas opções:
https://www.drupal.org/project/cache_graceful pode ser exatamente o que você deseja.
https://www.drupal.org/project/apdqc possui 2 ganchos que disparam em uma limpeza de cache, permitindo alterar a limpeza
drupal_alter('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);
e depois permitir que você reaja à limpezamodule_invoke_all('apdqc_cache_clear', $cid, $wildcard, $this->bin, $caller);
. Faça com que o APDQC funcione corretamente e defina$conf['apdqc_call_hook_on_clear'] = TRUE;
no arquivo settings.php e os ganchos devem ser chamados sempre que uma limpeza de cache for feita.fonte
Isso pode não ser adequado para todos e pode não ser rápido o suficiente para o OP - pois é acionado apenas na inicialização da próxima página. No entanto, isso me ajudou a acionar o código logo após um "cache limpar tudo" que não era sensível ao tempo.
Se você tiver um compartimento específico que precisa segmentar, o acima pode ser modificado para suportar isso, desde que o compartimento inteiro seja esvaziado no ponto em que o cache está limpo.
hook_init
é executado apenas para páginas não armazenadas em cache. Embora como uma limpeza completa do cache não deva significar páginas em cache, isso não deve causar problemas. No entanto, sistemas de armazenamento em cache externos como o Varnish atrapalharão esse acionamento e significarão que só ocorrerá quando a próxima solicitação adequada retornar ao Drupal.fonte
Eu tinha uma necessidade semelhante, em que um cliente queria liberar os caches Drupal e Varnish ao pressionar o botão "liberar todos os caches". Eu roubei esse item de menu para fazer isso.
Isso não atingirá nenhuma limpeza de cache no cron ou em qualquer outro lugar - apenas no link do menu.
fonte
Você pode tentar https://www.drupal.org/project/recacher - ele usa o módulo Expiração de cache para detectar páginas expiradas e, em seguida, re-armazenar em cache somente essas páginas usando o excelente HTTPRL.
fonte