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

Langage PHP Discussion :

[Socket] Détection par le proxy de l'appui sur le bouton "Arrêter" du navigateur


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut [Socket] Détection par le proxy de l'appui sur le bouton "Arrêter" du navigateur
    Bonjour,

    Je suis en train de faire un proxy en PHP et je n'arrive pas détecter l'appui sur le bouton "Arrêter" du navigateur.

    Pour le moment il se passe ces étapes :
    1) lecture de la requête venant du navigateur
    2) envoi de la requête au serveur web
    3) lecture de la réponse
    4) envoi de la réponse au navigateur

    Et pendant l'étape 3, j'aimerai bien savoir si on a appuyé sur le bouton "Arrêter" du navigateur, ça permettrai au proxy d'arrêter de lire la réponse et de libérer des ressources. Le problème est que je ne vois pas du tout comment obtenir cette information.
    J'ai déjà essayé d'écrire une chaine vide avec la fonction http://php.net/socket_write mais la socket reste ouverte même si je ferme l'onglet qui a lancé la requête.
    Idem avec la fonction http://php.net/socket_select que j'utilise à l'étape 1, il ne passe rien quand on appuie sur le bouton "Arrêter".

    Est ce que vous avez une idée de la façon dont je pourrais avoir cette information ?

  2. #2
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Tu peux essayer avec la fonction connection_aborted appelée dans une fonction d'extinction :

    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
    set_time_limit(0);
     
     
    function onExit()
    {
       if ( connection_aborted() ) {
          file_put_contents( 'fichier.log', 'aborted' );
       }
    }
     
    register_shutdown_function( 'onExit' );
     
    for ( $i = 0; $i < 5; $i++ ) {
       sleep(1);
       echo '1 ';
       ob_flush();
       flush();
       ob_flush();
       flush();
    }

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut
    Citation Envoyé par Bisûnûrs Voir le message
    Tu peux essayer avec la fonction connection_aborted appelée dans une fonction d'extinction :
    je ne peux pas utiliser cette fonction, le script est lancé en ligne de commande et écoute un port, il n'est pas lancé par le navigateur

    mais au moins cette fonction prouve bien le navigateur envoie l'information au serveur web, donc il doit bien exister un moyen de détecter ça

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    salut,

    Tas pas une fonction qui enregistre tous ce qui passe par ta socket ? Car avec une telle fonction il sera aisé de détecter des données envoyer par un client pour signifier la fin d'une connexion.


    A moins bien sur que cette information ne relève habituellement que de la couche tcp/ip (enfin en bas dans la pile), et que donc l'information ne soit pas remonté dans les fonctions socket_* de PHP.
    Mais il n y à pas de raisons qu'ils aient fait cela...

    Et puis le connection aborted, à je pense, une signification un peu différente. Je pense que se callback n'est appelé que si le client annule un transfert en cours.
    En gros je vois cela ainsi :
    1 - Dmde cliente
    2 - Réception serveur
    3 - Annulation cliente
    4 - Annulation serveur, de la réponse en cours de préparation !!
    5 - Emission de connection_aborted

    Donc cette événement n'est pas déclenché à la fermeture de la connexion.
    mais plutôt à l'annulation, donc c'est plus un événement de gestion de transaction.


    Edit, en parcourant la doc voici ce qu'un utilisateur à poster :
    http://fr.php.net/manual/fr/function...atus.php#18662
    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
     
    Very very useful!
    I was building a chat and I wanted my script to detect when the browser was closed, so the user could be deleted from the online_users table.
     
    <?
    echo str_repeat(" ",300);
    ignore_user_abort(true); //this way, the user can stop the output, but not the script.
    while (true) {
             echo "test<br>\n";
             flush();
             sleep(2);
             if (connection_status()!=0){
                     include ('dbconnect.inc');
                     $sql="delete from online_users where online_user=$user";
                     $sql_exec=pg_exec($vChatDB, $sql);
                     die(); //kills the script
             }
    }
    ?>
    Donc en fait on cherche à détecter ce qui n'est pas = 0 (0 = NORMAL), Ou bien encore, ce qui est = 1 || 2 donc ABORTED, ou TIMEOUT.

    Donc finalement, en regardant son code, l'information "client déconnecté", ne doit pas exister. Par contre on peut savoir si un client EST connecté. subtile différence qui implique de créer sa propre routine pour avoir un event clientDisconnected.

    a plus

  5. #5
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut
    j'ai refait des nouveaux tests ces derniers jours mais toujours pas de résultats
    j'ai essayé les fonctions socket_select, connection_status, socket_get_status mais aucune fonction ne me donner l'information
    Citation Envoyé par kaymak Voir le message
    A moins bien sur que cette information ne relève habituellement que de la couche tcp/ip (enfin en bas dans la pile), et que donc l'information ne soit pas remonté dans les fonctions socket_* de PHP.
    Mais il n y à pas de raisons qu'ils aient fait cela...
    j'ai écouter le réseau avec ethereal et apparemment j'ai quelque chose au niveau de TCP (je en suis pas sur parce que je n'ai pas trop l'habitude de ce logiciel)
    j'ai l'impression qu'au moment de l'appui sur le bouton "arrêter" le navigateur envoi un FIN ACK suivi de plusieurs RST mais cette information ne me sert pas à grand chose puisque je ne vois pas du tout comment je pourrais récupérer cette information en PHP

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Salut,

    As tu essayé cette solution ? :

    Code
    http://www.php.net/manual/fr/function.socket-read.php#76069 :
    Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    the proper way to detect a closed connection is to check socket_last_error.
     
    //Connection reset by peer is 104 (either use socket_strerror or don't suppress errors for the time being to find these out), sooo.
     
    while($buffer=@socket_read($sock,512,PHP_NORMAL_READ)){
        echo $buffer;
    }
    if(socket_last_error($sock) == 104) {
        echo "Connection closed";
    }

    Qui n'est pas du tout la solution *idéale* qu'on pourrait vouloir mettre en place, mais c'en est une.

    http://www.php.net/manual/fr/sockets.errors.php

    Par contre pas moyen de mettre la main sur la liste de paire code d'erreurs / messages......
    Donc faudra se contenter de l'exemple plus haut.

    bye

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/04/2011, 11h40
  2. VB6 Arret boucle FOR NEXT par appui sur un bouton
    Par obel38 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/01/2011, 16h35
  3. [PHP-JS] Problème de socket, passer par un proxy
    Par Kruggs dans le forum Langage
    Réponses: 1
    Dernier message: 13/07/2007, 01h15
  4. Intercepter l'appuie sur le bouton "Envoyer" d'Outlook
    Par Charette dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 14/10/2005, 14h24
  5. Comment détecter quand un utilisateur appuie sur le bouton Power ?
    Par Millenod dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 22/09/2005, 21h05

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