IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

$().load d'un fichier non actualisé - comment charger la nouvelle version du fichier ?


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai Avatar de stonedbike
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2020
    Messages : 5
    Par défaut $().load d'un fichier non actualisé - comment charger la nouvelle version du fichier ?
    Bonjour,

    J'ai créé un petit chat tout con pour pouvoir aider les élèves qui font mes exercices (je suis prof en collège).
    Les élèves ouvrent une session et on donc un login récupéré en javascript et php.
    Le message écrit par un interlocuteur est envoyé dans un fichier texte ("dialogues/"+login+"DIAL.txt") par un script php ("testspeechenvoyer.php").

    Le problème est que $().load ne charge pas la dernière version du fichier texte du dialogue,
    SAUF si ce fichier est ouvert dans un onglet du navigateur... J'aimerais éviter à avoir à faire ça.

    Le dialogue s'affiche dans la div "divdialogue", et l'élève écrit dans l'input "monecrit".

    Voici mon code javascript (j'ai gardé l'essentiel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    function refresh()
    	{$("#divdialogue").load("dialogues/"+login+"DIAL.txt");
    	//j'ai aussi tenté avec les deux lignes qui suivent, mais ça ne charge pas la dernière version du fichier texte non plus...)
    	//$.get("dialogues/"+login+"DIAL.txt", function( data )
    	//	{$("#divdialogue").html( data );
    	// 	});
    	}
    setInterval(refresh, 1000);
     
    // Les 2 lignes suivantes sont liées à l'alternative (chargement du fichier texte dans un onglet...)
    var windowObjectReference;
    var strWindowFeatures = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes";
     
    function onenvoie(){
    	texte=document.getElementById('monecrit').value;
    	document.getElementById('monecrit').value = '';
    	$.get("testspeechenvoyer.php", { "monecritjs": texte , "logineleve": login } ); // (le login est récupéré ailleurs)
     
    	//... l'alternative que je voudrais éviter :
    	windowObjectReference = window.open("dialogues/"+login+"DIAL.txt", "le dialogue", strWindowFeatures);
    	return false;
    	}
    Voici le code php de "testspeechenvoyer.php" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    include("recupidsession.php");
    $monspeech = $_GET['monecritjs'];
    $monnouveaufichier = fopen('dialogues/'.$_GET['logineleve']."DIAL.txt", 'a+');
    fputs($monnouveaufichier, $monspeech);
    fclose($monnouveaufichier);
    ?>
    Merci de votre lecture, et infini merci de votre réponse !
    Pierre

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    Par défaut
    Bonjour et bienvenue sur DVP.
    A vérifier que tu n'as pas un problème de cache ou alors passe par du POST, non repris du cache.

  3. #3
    Membre à l'essai Avatar de stonedbike
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2020
    Messages : 5
    Par défaut
    Merci beaucoup pour ta réponse !
    Bon avec un POST tout seul ça n'affiche plus rien, mais en combinant un POST et un GET ça marche - la plupart du temps (quand il y a eu un échange complet entre les 2 personnes c'est bon).
    Je vais attendre un peu avant de marquer "résolu", histoire de voir si ça fonctionne avec les interfaces des élèves.
    Merci encore, en tous cas !

  4. #4
    Membre à l'essai Avatar de stonedbike
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2020
    Messages : 5
    Par défaut
    Bon bin ça marche dans l'ensemble.
    Le 1er message met toujours un certain temps à arriver, de manière étrange, et puis après ça fonctionne bien...

    Merci encore pour ton aide NoSmoking !

  5. #5
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par défaut
    Citation Envoyé par stonedbike Voir le message
    ça marche - la plupart du temps
    Citation Envoyé par stonedbike Voir le message
    Bon bin ça marche dans l'ensemble.
    Je pense qu’il y a moyen d’aller un peu plus loin
    À moins que tu ne veuilles pas investir trop de temps là-dedans, une décision que je respecterais, en tant que prof tu dois avoir d’autres trucs à faire.

    Mais sinon, voici quelques pistes d’amélioration.

    La technique simple dite cache buster : il s’agit d’ajouter un paramètre GET qui change tout le temps (généralement un Math.random() ou une valeur liée au temps comme Date.now()). La présence de ce paramètre GET fait que la requête dans son ensemble est différente, et le cache ne s’applique pas. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $("#divdialogue").load("dialogues/"+login+"DIAL.txt", { "cachebuster": Date.now() });
    Le cache busting c’est pratique, mais c’est pas la meilleure façon de faire. À mesure que le fichier de chat va grossir, le volume des transferts de données va croître également et ça va finir par se ressentir dans les temps de réponse. On a envie de tirer partie du cache quand c’est possible, par exemple si personne ne parle pendant une minute, le serveur ne devrait pas être obligé de renvoyer 60 fois (une fois par seconde) le fichier entier alors qu’il n’a pas changé.

    Actuellement, si ton script reçoit une version périmée du fichier, c’est sans doute parce que le navigateur tente de deviner comment employer le cache en fonction de l’extension du fichier. Généralement, les fichiers .txt sont rarement amenés à changer, le navigateur suppose donc qu’il peut le garder dans son cache pour une durée relativement longue.

    Un moyen d’améliorer la précision du cache est d’envoyer certains en-têtes HTTP depuis le serveur. Un simple en-tête Cache-Control suffit à rendre les échanges client-serveur plus malins.

    Puisque tu codes ton serveur en PHP, je vais supposer que le logiciel serveur est Apache. Ce type de serveur offre un moyen flexible de le configurer au moyen de fichiers .htaccess. En l’occurence, je te propose de placer un fichier .htaccess (sans extension) dans le dossier dialogues/, et d’y écrire ce code :
    Code apache : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <FilesMatch "DIAL\.txt$">
      <IfModule headers_module>
        Header set "X-Htaccess-Test" "Ok"
        Header set "Cache-Control" "must-revalidate"
      </IfModule>
    </FilesMatch>

    Petite explication :
    • FilesMatch est une expression rationnelle indiquant que la configuration doit s’appliquer aux fichiers se terminant ($) par DIAL.txt ;
    • IfModule teste la présence du module headers dans l’installation Apache. Ce test est nécessaire car, en l’absence du module, Apache ne comprendrait pas les directives suivantes et renverrait une erreur 500 ;
    • l’en-tête X-Htaccess-Test, je l’ai rajouté simplement pour tester que le htaccess fonctionne bien et que le module headers est installé (tu pourras retirer cette ligne ou la mettre en commentaire une fois que tu auras vu que ça marche). J’ai bon espoir que le module headers est installé sur ton serveur, mais on ne sait jamais.
    • enfin, je définis l’en-tête Cache-Control avec la directive must-revalidate qui indique que le navigateur doit toujours vérifier la fraîcheur du fichier auprès du serveur. Si le serveur confirme que le fichier n’a pas changé, le navigateur le sert alors depuis son propre cache.


    Enfin, pour voir les en-têtes HTTP des requêtes, utilise l’onglet réseau (ou networking) de la console F12. Dans cet onglet, chaque ligne représente une requête faite par le client (et la réponse du serveur). Tu peux voir les détails d’une requête en cliquant dessus.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  6. #6
    Membre à l'essai Avatar de stonedbike
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2020
    Messages : 5
    Par défaut
    Quelle réponse !!
    Merci beaucoup Watilin pour cette proposition bien détaillée !

    Effectivement je tiens beaucoup à ne pas surcharger le serveur de demandes, car je tiens beaucoup à ce site et n'aimerais pas qu'on se serve de cette excuse pour le rendre inactif.

    L'ajout du fichier .htaccess semble bloquer la récupération du fichier texte (mais visiblement pas sa modification, car après avoir supprimé le .htaccess, il m'affiche bien les messages envoyés pendant sa présence).
    Et quand je tente d'accéder au fichier texte à l'aide du navigateur, en présence du fichier .htaccess je reçois une erreur 500.

    Je suis chez free, il me semble que leurs serveurs tournent bien sous Apache, mais je ne sais pas si le module headers est bien installé.

    En tous cas, je te remercie encore vivement pour ta réponse particulièrement détaillée.
    Bon week-end !
    Pierre
    PS : pour l'instant je cherche surtout à faire avancer le reste du site : en ce moment c'est l'envoi de caractère spéciaux en GET sur lequel je me prend la tête, mais c'est une autre affaire, un autre sujet - et mes copies ne semblent pas s'être corrigées beaucoup toutes seules depuis tout à l'heure !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MediaWiki] [1.28] Comment installer la nouvelle version
    Par tintinux dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 13/12/2017, 12h52
  2. [Forms6i] Comment charger les fichiers du client ?
    Par patmaba dans le forum Forms
    Réponses: 10
    Dernier message: 31/01/2005, 16h17
  3. [Dexplore] Comment charger des fichiers d'aide ?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 5
    Dernier message: 04/01/2005, 17h38
  4. Réponses: 1
    Dernier message: 06/04/2004, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo