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

  1. #1
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 417
    Points : 15 786
    Points
    15 786
    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 892
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 892
    Points : 16 345
    Points
    16 345
    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 éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 417
    Points : 15 786
    Points
    15 786
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    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 éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 417
    Points : 15 786
    Points
    15 786
    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 émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    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

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 417
    Points : 15 786
    Points
    15 786
    Par défaut
    Citation Envoyé par kaymak Voir le message
    As tu essayé cette solution ? :
    oui j'avais essayé "socket_last_error", désolé j'ai oublié de le mettre dans ma liste de tests que j'ai fait

    en plus j'ai plein d'autre problèmes qui me dépasse par exemple sur un site j'ai une image qui ne s'affiche pas alors qu'en surveillant le réseau j'ai la même requête HTTP qu'avec une connexion directe
    je vais commencer à regarder ce qui existe et si je trouve un proxy qui fait ce que je veux, je vais abandonner mon proxy en PHP

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    :\ Je rajouterais qu'au pire on se consolera en se disant qu'au mieux cette fonctionnalité n'aurait permit que d'annuler une tache en devenir, ou qui vient d'être exécutée.
    En effet les tâches ne pouvant être séparées du thread principale c'est <strike>assez compliqué</strike> impossible de l'annuler en cours d'exécution, et donc de gagner réellement en pertinence pour cette fonctionnalité. A moins d'éventuellement utiliser les ticks... Mais j'ai jamais vu d'usage sérieux de cette fonctionnalité en PHP.

    Aussi PHP n'aurait pas était mon premier choix pour faire un proxy, à moins d'avoir voler barbe rouge pour me la jouer guru... Mais dans les faits à parcourir la documentation il semble qu'il y ai pas mal de petits défauts capable de bien vous pourrir la vie. Et puis je trouve la doc et les exemples bien pauvre pour m'adonner à un sujet aussi laborieu que le réseau.

    Mais bon ce n'est pas de l'avis de tout le monde :
    http://www.google.fr/search?rlz=1C1G...-8&q=php+proxy
    http://idea.hosting.lv/a/phpproxy/phpproxy-0.6/

    Fin bon tout sa pour dire que j'aime bien l'exotisme de la chose, et que j'aurais bien aimé connaitre la solution, mais je préfère laisser aux autres le plaisir de se bruler les mains désolé.

    a plus

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 417
    Points : 15 786
    Points
    15 786
    Par défaut
    Citation Envoyé par kaymak Voir le message
    Aussi PHP n'aurait pas était mon premier choix pour faire un proxy, à moins d'avoir voler barbe rouge pour me la jouer guru...
    oui j'en suis conscient ;-) sur mon ordinateur je m'amuse à faire tout mes script en PHP (enregistrement de la radio, traitement de fichiers, ...) donc forcement quand je me suis dit "j'ai besoin d'un proxy" je me suis lancé en PHP

    Citation Envoyé par kaymak Voir le message
    là c'est plus des proxy web, pour ma part j'ai essayé de faire un serveur proxy qu'on peut utiliser dans la configuration du navigateur pour modifier certains contenus de site à la volée

  10. #10
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 417
    Points : 15 786
    Points
    15 786
    Par défaut
    j'ai fini par adopter Privoxy (http://www.privoxy.org/) il permet de modifier le contenu des pages avec des expressions régulières donc il me convient complètement

    merci à tous ceux qui ont participé dans cette discussion, même si je n'ai pas réussi à faire mon proxy, j'ai quand même appris plein de choses sur les sockets et HTTP

+ 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