Para todas as instâncias de todo tipo de entidade, eu gero vários caches, chamados algo como: [module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]
Agora, sempre que uma entidade é atualizada, desejo descartar todos os caches começando com o tipo e o ID da entidade relevante.
Como devo armazenar / limpar esses caches?
Atualmente, apenas cache_set () , mas isso apresenta um problema quando quero limpar, pois não sei os nomes de todos os caches relevantes. É seguro descartar entradas de cache com um db_delete ()?
db_delete()
?Respostas:
Para excluir entradas de um cache, você deve usar cache_clear_all () . O motivo é que a implementação de cache usada não pôde usar uma tabela de banco de dados no banco de dados ativo. É o que acontece com a classe DrupalDatabaseCache , mas não deve ser verdadeira para todas as classes.
Se você olhar para _cache_get_object () (a função chamada cache_get () e cache_set () ), você notará que ele contém o seguinte código.
A classe para a implementação do cache pode ser diferente para cada armazenamento na lixeira, e mesmo o padrão pode ser alterado.
O sistema de cache de status de atualização particular explica exatamente por que as funções normais de cache não são usadas em _update_cache_clear () , _update_cache_get () e _update_cache_set () . (A ênfase é minha.)
O Update Manager tem necessidades específicas necessárias, porque tentar obter informações de atualização com muita freqüência causaria problemas nos servidores Drupal.org, considerando que o Update Manager pode buscar informações de atualização em qualquer site que esteja executando o Drupal.
No seu caso, você pode usar
[module_name]__[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]
como ID de cache para um único armazenamento de bin de cache. No caso de você precisar excluir todas as entradas de uma entidade, você pode usar o seguinte código.Se você não conseguir obter o valor a ser atribuído ao
$module
limpar o cache ou desejar excluir a entrada do cache independentemente do módulo para o qual os dados foram armazenados em cache, poderá usar um ID de cache diferente, como[entity_type]__[entity_id]__[string_depending_on_where_the_cache_came_from]
, ou[entity_type]__[entity_id]__[module_name]__[string_depending_on_where_the_cache_came_from]
.cache_clear_all()
exclui todas as entradas de cache com um ID de cache começando com a cadeia passada como argumento, quando$wildcard
forTRUE
, e o ID de cache não'*'
. Nesse caso, o cache seria limpo com o seguinte código.fonte
Não consigo pensar em uma boa razão pela qual a exclusão manual das entradas causaria um problema. Isso pressupõe, é claro, que você esteja usando o MySQL como back-end para seu cache específico; Embora eu ache que o mesmo se aplica a qualquer outro tipo de back-end de cache, o método para limpar não seria necessariamente uma consulta ao banco de dados.
Se você usar o módulo de atualização principal como exemplo, ele ignora as
cache_*
funções e limpa seu cache manualmente:Eu sempre penso "se é bom o suficiente para o núcleo, é bom o suficiente para mim" :)
fonte