2010-10-11 7 views
1

Nous avons une application en PHP. Le problème vient quand nous faisons des mises à jour et des changements dans cette application. Parfois, les utilisateurs ne reçoivent pas la dernière version de l'application (HTML et javascript sont principalement modifiés) en raison du cache du navigateur. Une fois que nous avons réalisé à ce sujet, nous avons pu inclure le code suivant dans notre application (Nous exécutons avant tout HTML est envoyé au navigateur)Problème avec les mises à jour de l'application PHP à cause du cache du navigateur

function clean_cache(){ 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
    header("Cache: no-cache"); 
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); 
    header("Cache-Control: post-check=0, pre-check=0", false); 
    header("Pragma: no-cache"); 
} 

Mais nous avons encore quelques utilisateurs qui ont des versions plus anciennes de notre application . Nous lisons qu'une solution possible est d'utiliser un javascript demandant au serveur via ajax s'il y a une mise à jour. Si oui, forcez un rechargement. Si c'est la meilleure façon de résoudre notre problème: Comment pouvons-nous implémenter cette solution? Si vous avez d'autres solutions possibles, nous serons très heureux de le savoir.

Merci

+1

Ma conjecture est que les utilisateurs qui consultent la "vieille" version de votre programme ont IE. Par conséquent ajax serait mon choix aussi parce que IE n'essaie pas parfois de recharger la page si vous cliquez sur le bouton de rechargement afin que le changement ne soit pas remarqué. – ITroubs

+0

Définir "la dernière version de l'application". Cela concerne-t-il le code HTML, les ressources JavaScript ou CSS, ou les images? –

+0

Je l'ai édité. Mais surtout, cela peut être n'importe quel changement que nous devons faire: HTML ou javascrpt, mais nous prévoyons aussi d'ajouter des images, et cela peut être un problème dans les prochaines semaines. – pepersview

Répondre

0

magasin la dernière mise à jour dans une ajax variable et utiliser pour faire une demande de paiement ajax chaque minute et de vérifier wheterh le temps de mise à jour est différent du temps de mise à jour stockée dans la variable. si c'est le cas, rechargez avec window.location = "le nouvel emplacement";

EDIT:

il devrait ressembler à ceci: (mais je ne l'ai pas testé donc je ne garantis pas à travailler)

var updateTime = '<?php echo $lastUpdateTime;?>'; 
$(document).laod(function(){ 
    var reload = window.setInterval("request()", 60000); 
}); 

function request(){ 
    $.get("last_update.php", function(data){ 
     if(updateTime != date) window.location = "redirect_to.php"; 
    }); 
} 

EDIT 2: Ce est HTML pour y compris jquery:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 

ce "redirect_to.php" est le fichier que vous redirigez la fenêtre. donc si vous voulez rester sur le même site il suffit de mettre l'URL du site là.

<?php $lastUpdateTime;?> était un peu en ligne PHP. je l'ai corrigé à <?php echo $lastUpdateTime;?>

last_update.php est juste une page qui renvoie la dernière mise à jour. comment vous suivez la dernière mise à jour est à vous.

+0

Je ne comprends pas bien comment faire ça. – pepersview

+0

voir mon édition. btw vous devez inclure la source de jquery pour utiliser mon exemple! – ITroubs

+0

Merci beaucoup pour clarifier mes doutes. Qu'est-ce que last_update.php est supposé avoir à l'intérieur? Nous ne gardons pas trace des mises à jour, nous faisons juste les changements dans l'application qui sont demandés. – pepersview

0

IE cache les fichiers de la même URL, disons que vous chargez des fichiers js à partir de votre en-tête html, vous pouvez essayer de randomiser un numéro de requête dans l'URL, juste pour forcer IE à interpréter cela comme une nouvelle URL et rechargez-le.

Exemple:

<?php 
    $random = rand(1, 100000); 

?> 
<head> 
<script type="javascript/text" src="../js/foo.js?v=<?php echo $random;?>"></script> 
</head> 
... 

Ceci affichera quelque chose comme

<script type="javascript/text" src="../js/foo.js?v=5"></script> 

si vous que l'URL est IE "dynamique" sera obligé de le recharger.

+0

Le problème n'est pas seulement avec IE, nous l'avons aussi dans Mozilla – pepersview

+0

Je pense qu'il est préférable d'attacher le descripteur de temps actuel au lieu d'un nombre aléatoire.Les nombres aléatoires prennent plus de temps à générer et parfois vous avez des collisions, l'heure actuelle est toujours nouvelle (incluez le temps jusqu'à la milliseconde). –