Como não armazenar em cache um arquivo php onde um cachemanifest é chamado?
-
26-09-2019 - |
Pergunta
Estou construindo um aplicativo para iPhone com JQTouch e uso um Cachemanifest para armazenar em cache todos os arquivos estáticos (imagens, CSS, JavaScript) para torná -lo mais rápido. No entanto, a página usa o PHP para o conteúdo dinâmico e não quero cache isso. Então, estou gerando o Cachemanifest com este php-script (manifest.php):
<?php
header('Content-Type: text/cache-manifest');
echo "CACHE MANIFEST\n";
$hashes = "";
$lastFileWasDynamic = FALSE;
$dir = new RecursiveDirectoryIterator(".");
foreach(new RecursiveIteratorIterator($dir) as $file) {
if ($file->IsFile() && $file != "./manifest.php" &&
substr($file->getFilename(), 0, 1) != ".") {
if(preg_match('/.php$/', $file)) {
if(!$lastFileWasDynamic) {
echo "\n\nNETWORK:\n";
}
$lastFileWasDynamic = TRUE;
} else {
if($lastFileWasDynamic) {
echo "\n\nCACHE:\n";
$lastFileWasDynamic = FALSE;
}
}
echo $file . "\n";
$hashes .= md5_file($file);
}
}
echo "\nNETWORK:\nhttp://chart.apis.google.com/\n\n# Hash: " . md5($hashes) . "\n";
?>
Isso realmente funciona muito bem, exceto por uma coisa irritante:
Pelo que li em algum lugar, o arquivo que chama de Cachemanifest é incluído automaticamente no manifesto e está em cache. O que significa que meu índice de página inicial.php, onde eu chamo de Cachemanifest, está em cache. Isso leva a problemas muito irritantes.
Existe alguma maneira de lidar com essa ou qualquer solução alternativa inteligente? A página está no Cachemanifest listada como rede, mas parece que isso é o que está sendo anulado pelo fato de o Cachemanifest ser chamado do arquivo.
Solução
A ideia de Futta está certa, mas o que você provavelmente encontrará é que apenas uma seção da sua página frontal muda com frequência. Deixe isso vazio, depois deixe o resto da página ser armazenado em cache e não se preocupe com isso. Quando você visita a página, a versão em cache é chamada instantaneamente e você pode executar um script para pegar o fragmento de página dinâmica do servidor e defini -lo com o InnerHTML para concluir a página. O efeito é que ainda existe uma solicitação HTTP (mais uma para o manifesto); portanto, não é mais lento e você pode mostrar parte do seu aplicativo enquanto a seção dinâmica está sendo baixada. Se você deseja atualizar a página inteira, faça um comentário no manifesto marcando a versão e incremente isso para recarregar o aplicativo inteiro.
Limpo e arrumado. Eu acho que é assim que o sistema pretende ser usado, sem tentar evitar um pouco de JavaScript, já que isso é depois de toda a única maneira que você pode brincar com o offline e fazer coisas úteis com o aplicativo quando offline.
Outras dicas
Tenho a mesma experiência, mas tenho a seguinte solução alternativa na minha lista de tarefas:
- Crie um manifesto com todos os ativos estáticos
- Inclua uma referência a esse manifesto em apenas uma página html (BuildCache.php)
- Verifique se o Window.ApplicationCache é suportado e se sim:
- Redirecionar uma vez por sessão para cache.html para criar/verificar/atualizar o cache
- Faça com que o BuildCache.php exiba algumas informações sobre o que está sendo feito (usando o ApplicationCache EventListeners)
- tem o Redirecionamento BuildCache.php de volta ao índice normal (onde o manifesto não está definido)
Espero (E alguém alegou que esse é o caso em um comentário no meu blog) que todas as páginas no mesmo domínio usarão os ativos estáticos no ApplicationCache, mesmo que o manifesto não seja referenciado em todos eles.
Outra solução seria manter seu índice.php como uma página de carregamento em branco ou uma tela de respingo de algum tipo e redirecionar o usuário para a página dinâmica de php dinâmica real. Como o manifesto está em index.php e index.php redireciona para real-index.php, o problema pode ser menor.