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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top