2010-04-12 6 views
1

Je construis une application iphone avec jqtouch et j'utilise un cachemanifest pour mettre en cache tous les fichiers statiques (images, css, javascript) afin de les charger plus rapidement. Cependant, la page utilise php pour le contenu dynamique et je ne veux pas le mettre en cache. Je suis donc générer le cachemanifest avec ce script php (manifest.php):Comment ne pas mettre en cache un fichier php lorsqu'un cache-événement est appelé?

<?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"; 
?> 

Cela fonctionne vraiment bien fait, sauf pour une chose irritante:

D'après ce que je l'ai lu quelque part le fichier qui appelle la cachemanifest est automatiquement inclus dans le manifeste et est en cache. Ce qui veut dire que ma page d'accueil index.php, où j'appelle le cachemanifest, est en cache. Cela conduit à des problèmes très irritants.

est-il un moyen de faire face à cette solution de contournement ou une solution de contournement intelligente? La page est dans le cache-list répertorié comme NETWORK, mais il semble que cela soit annulé par le fait que le cachemanifest est appelé à partir du fichier.

Répondre

2

L'idée de futta est correcte, mais ce que vous découvrirez probablement est qu'une seule section de votre page d'accueil est souvent modifiée. Laissez vide, laissez le reste de la page en cache et ne vous inquiétez pas. Lorsque vous visitez la page, la version en cache est appelée instantanément et vous pouvez exécuter un script pour extraire le fragment de page dynamique du serveur et le définir avec innerHTML pour terminer la page. L'effet est qu'il y a toujours une requête HTTP (plus une pour le manifeste), donc ce n'est pas plus lent, et en plus vous pouvez montrer une partie de votre application pendant que la section dynamique est en cours de téléchargement. Si vous souhaitez actualiser la page entière, ajoutez un commentaire dans le manifeste qui marque la version, puis incrémentez-le pour recharger toute l'application.

Propre et propre. Je pense que c'est la façon dont le système est destiné à être utilisé, sans essayer d'éviter un peu de javascript, car c'est après tout la seule façon de jouer avec le hors ligne et faire des choses utiles avec l'application hors ligne.

+0

sonne comme une façon intelligente de le faire! va l'essayer et faire un rapport ici .. – Volmar

2

J'ai la même expérience, mais ont la solution de contournement possible après ma todo-list:

  • créer un manifeste avec tous les actifs statiques
  • font référence à ce manifeste en une seule page html (buildCache.php)
  • vérifier si window.applicationCache est pris en charge et si oui:
    • redirect une fois par session cache.html pour créer/vérifier/mettre à jour le cache
    • ont buildCache.php afficher quelques informations sur ce qui est fait (en utilisant les EventListeners applicationCache)
    • ont buildCache.php redirect retour à l'index normal (où le manifeste n'est pas défini)

I espérons (and someone claimed this is the case in a comment on my blog) que toutes les pages du même domaine utiliseront les ressources statiques dans l'applicationCache, même si le manifeste n'est pas référencé dans chacune d'entre elles.

+0

merci pour votre contribution. J'ai essayé de créer un amnifest avec uniquement le contenu statique, mais cela n'a pas fonctionné si je n'incluais pas toutes les pages du fichier manifeste. et il inclura automatiquement le fichier qui le demande, ce qui est le problème principal. essayé de faire une page spéciale pour mettre en cache le contenu, mais il n'a pas fonctionné comme je le voulais encore, continuera à expérimenter sur celui-ci. – Volmar

+0

ok, tenez-nous au courant, je suis très intéressé par le résultat! :) – futtta

0

Une autre solution serait de garder votre index.php comme une page de chargement vide ou un écran de démarrage de quelque sorte, puis rediriger l'utilisateur vers la page php dynamique réelle. Puisque le manifeste est dans index.php et qu'index.php redirige vers real-index.php, le problème pourrait être moins anoying.

Questions connexes