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

WRInaute accro
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.
 
WRInaute accro
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.
 
WRInaute accro
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 />
 
WRInaute accro
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.
 
WRInaute accro
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.
 
WRInaute accro
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.
 
Nouveau WRInaute
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 joints

  • CSS_W3C_validation.jpg
    CSS_W3C_validation.jpg
    156.6 KB · Affichages: 6
Discussions similaires
Haut