Détecter arrêt user d'un script PHP ?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par ortolojf, 28 Décembre 2021.

  1. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    Bonjour

    Mon problème :

    J'ai un sémaphore, avec instanciation / démarrage, et désinstanciation / arrêt.

    Le sémaphore est avec une mémoire partagée ( une par ressource ), incrémentée / décrémentée lors des démarrage / arrêts.

    Théoriquement çà marche, mais si le visiteur bloque la page ( et son script php ), il y a un risque que l'arrêt ne se fasse pas, donc que le sémaphore ne se libère pas.

    Comment détecter en PHP, la perte de connexion http ?

    Sinon, j'en serais quitte avec une détection par timestamp.

    Merci.

    Amicalement.
     
  2. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    Bonjour

    J'ai changé/simplifié le sémaphore.

    J'ai vu sur le net, que avant PHP 5.1.0, après un register_shudown_function(arret), la fonction arret() était lancée avant l'arrêt de la connexion http. ( dans le cas d'un stop de l'user ).

    Après PHP 5.0.1 c'est le contraire : l'arrêt de la connexion http a lieu avant le lancement de arret().

    Dans ce cas, si arret() est une méthode d'une classe instanciée dans le script, cette classe est-elle désinstanciée au moment de l'arrêt de la connexion http ?

    Dans ce cas, arret() ne peut pas être lancée ?

    Et, est-ce que c'est possible d'utiliser ignore_user_abort(true) pour résoudre ce problème de séquencement ?

    Merci beaucoup de vos réponses.
     
  3. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    J'ai la réponse :

    Avec ignore_user_abort(1) :

    La fonction Shutdown() se lance avant le destructeur de la classe dans laquelle le register_shutdown_function(Shutdown) a été déclenché.

    Ceci sous PHP 8.0 et ignore_user_abort() à 1 ou 0.

    Si c'est 0, la fonction Shutdown() s'arrête avant "written after a flush()'. La fonction de rappel doit s'arrêter lors d'un flush() et rendre la main à la fonction de rappel suivante d'après la doc.

    Si c'est 1 Shutdown() rend la main avant le destructeur.

    Comme j'ai l'habitude d'utiliser ignore_user_abort(1), je suis soulagé.

    Voici le log :


    Code:
    <---BEGINNING TEST---<br />
    IGNORE_USER_ABORT = TRUE<br />
    Shutdown begin at : 1640790511.358922<br />
    PHP is shutting down. isAborted 1 : 0<br />
    This was written after a flush.<br />
    PHP is shutting down. isAborted 2 : 1<br />
    Shutdown end at : 1640790511.35899<br />
    Destruct begin at : 1640790511.358999<br />
    DestructTester is getting destructed. isAborted: 1<br />
    DestructTester is getting destructed. isAborted: 1<br />
    Destruct end at : 1640790511.359017<br />
    
    
    
     
  4. nicodak
    nicodak WRInaute occasionnel
    Inscrit:
    21 Octobre 2020
    Messages:
    271
    J'aime reçus:
    65
  5. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    Pardon

    D'après le script :

    PHP:

    <?php
    class DestructTester {
        private 
    $fileHandle;
        private 
    $ignoreUserAbort;
        public function 
    __construct($fileHandle$ignore_user_abort false){
            
    // fileHandle that we log to
            
    $this->fileHandle    $fileHandle;
            
    $this->ignoreUserAbort    $ignore_user_abort;
            
    // call $this->onShutdown() when PHP is shutting down.
            
    register_shutdown_function(array($this"onShutdown"));
            return 
    $this;
        }
        public function 
    onShutdown() {
            
    fwrite($this->fileHandle"Shutdown begin at : " microtime(true) . "<br />\n");
            while (
    ob_get_level()){ ob_end_clean(); }
            
    $isAborted connection_aborted();
            
    fwrite($this->fileHandle"PHP is shutting down. isAborted 1 : $isAborted<br />\n");
            
    // NOTE
            // If connection_aborted() AND ignore_user_abort = false, PHP will immediately terminate
            // this function when it encounters flush. This means your shutdown functions can end
            // prematurely if: connection is aborted, ignore_user_abort=false, and you try to flush().
            
    if($this->ignoreUserAbort) {
                
    flush();
            }
            
    fwrite($this->fileHandle"This was written after a flush.<br />\n");
            while (
    ob_get_level()){ ob_end_clean(); }
            
    $isAborted connection_aborted();
            
    fwrite($this->fileHandle"PHP is shutting down. isAborted 2 : $isAborted<br />\n");
            
    fwrite($this->fileHandle"Shutdown end at : " microtime(true) . "<br />\n");
        }
        public function 
    __destruct() {
            
    fwrite($this->fileHandle"Destruct begin at : " microtime(true) . "<br />\n");
            while (
    ob_get_level()){ ob_end_clean(); }
            
    $isAborted connection_aborted();
            
    fwrite($this->fileHandle"DestructTester is getting destructed. isAborted: $isAborted<br />\n");
            echo 
    "newTest.\n";
            
    flush();
        
            while (
    ob_get_level()){ ob_end_clean(); }
            
    $isAborted connection_aborted();
            
    fwrite($this->fileHandle"DestructTester is getting destructed. isAborted: $isAborted<br />\n");
            
    fwrite($this->fileHandle"Destruct end at : " microtime(true) . "<br />\n");
        }
    }
    $ignore_user_abort false;
    if(!empty(
    $_GET['shutdown']) &&
        (
    $_GET['shutdown'] == 1)) {
        
    $ignore_user_abort 1;
    }
    ignore_user_abort($ignore_user_abort);
    // Create a DestructTester
    // It'll log to our file on PHP shutdown and __destruct().
    touch("log.txt");
    $fileHandle fopen("log.txt""w");
    fwrite($fileHandle"---BEGINNING TEST---<br />\n");
    fwrite($fileHandle"IGNORE_USER_ABORT = " . (($ignore_user_abort == 1) ? "TRUE" "FALSE") . "<br />\n");
    $dt = new DestructTester($fileHandle$ignore_user_abort);
    sleep(15);
    exit;
    ?>

    Peut-être le echo "Test." puis flush(); sont inutiles, le flush() éventuel du Shutdown() suffit.

    C'est intéressant de savoir que sous PHP 8, c'est quand même possible d'accéder à la classe dans son destructeur, bien que celui-ci se passe après Shutdown().

    Espérons que celà soit encore le cas dans les futures versions de php.

    Bien à vous.
     
  6. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    Hé bé

    Toutes les pages de mon site sont sans erreur ni warning au W3C.

    Maintenant, je vais tenir compte des arrêts user ( si ce n'est pas déjà le cas ).

    Et après, modification du design des listes de courses, qui ressemblent trop à celles de mon site partenaire.

    Après, au tour de la PWA. ;)

    Amicalement.
     
  7. hapx
    hapx Nouveau WRInaute
    Inscrit:
    4 Septembre 2014
    Messages:
    23
    J'aime reçus:
    9
  8. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    Bonjour hapx

    Quelles sont les urls qui posent problème ?

    C'est le même validator que j'ai utilisé hier soir.

    Merci beaucoup de ton aide.
     
  9. hapx
    hapx Nouveau WRInaute
    Inscrit:
    4 Septembre 2014
    Messages:
    23
    J'aime reçus:
    9
    J'analyse juste ta page d'accueil, je suppose que le CSS est commun à toutes les pages. Il s'agit du CSS W3C validator et non le HTML W3C Validator.
     

    Fichiers attachés:

  10. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 681
    J'aime reçus:
    39
    Super merci hapx ;)

    Problème corrigé.

    Amicalement.
     
Chargement...
Similar Threads - Détecter arrêt user Forum Date
Sirdata comment détecter permission cookies ? Développement d'un site Web ou d'une appli mobile Vendredi à 10:23
[PHP] Détecter le navigateur / bot en fonction du HTTP_USER_AGENT Développement d'un site Web ou d'une appli mobile 14 Septembre 2019
Astuce Détecter un bot qui fausse vos stats Google Analytics 1 Mars 2019
Comment détecter des noms de domaines pourris dans les mails ? Problèmes de référencement spécifiques à vos sites 30 Mai 2018
Outil pour détecter le contenu dupliqué Débuter en référencement 1 Août 2017
Détecter le premier slash URL Rewriting et .htaccess 5 Juillet 2017
[PHP] Détecter le navigateur / bot en fonction du HTTP_USER_AGENT Développement d'un site Web ou d'une appli mobile 12 Janvier 2017
Comment détecter les sites satellites Netlinking, backlinks, liens et redirections 5 Avril 2016
script qui détecterait quand l'internaute se connecte avec un telephone et le rediregeré Développement d'un site Web ou d'une appli mobile 5 Juin 2015
Pourquoi analytics pourrait avoir de la difficulté à détecter l'acquisition d'un site? Google Analytics 3 Juillet 2014
[Idée ?] Détecter la présence de cookies Développement d'un site Web ou d'une appli mobile 5 Décembre 2013
Détecter les articles à faible contenu Wordpress ! Développement d'un site Web ou d'une appli mobile 30 Avril 2013
détecter la position sur Google Débuter en référencement 28 Février 2013
Détecter le Javascript peut-il nuire au référencement ? Problèmes de référencement spécifiques à vos sites 10 Janvier 2013
Commente détecter les copieurs ? Administration d'un site Web 22 Octobre 2012
Quel outil pour détecter le duplicate content? Référencement Google 13 Mai 2012
Achat de lien ? Partenariat croisé ? Comment Google peut le détecter ? Netlinking, backlinks, liens et redirections 16 Avril 2012
Détecter les visiteurs Iphone et Android en PHP Développement d'un site Web ou d'une appli mobile 6 Mars 2012
Détecter les liens absolus (externes) d'un site Débuter en référencement 5 Mars 2012
[PHP] Détecter l'OS, le navigateur et la langue [Résolu] Développement d'un site Web ou d'une appli mobile 4 Mars 2012