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 :

[PHP-CLI] équivalent à setInterval


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [PHP-CLI] équivalent à setInterval
    Bonjour,
    Je développe une petite application en PHP avec PHP-CLI.
    J'aimerais savoir si il existe une équivalence au setInterval de Javascript en PHP; je m'explique.

    Mon code tourne en boucle (afin que l'exécution de s'arrête jamais).
    Je me connecte à un serveur (dans ce cas IRC, mais peu importe) et je recois mes données avec fgets().
    C'est bien, lorsque je reçois des données, je peux répondre avec une action adéquate.
    Par contre, lorsque je dois, par exemple, envoyer des données dans exactement une minute (pour protection ou un jeu), ça m'est impossible.

    C'est pourquoi je recherche un moyen d'enregistrer une fonction avec un "timer" de façon régulière. par exemple setInterval(ma_fonction, 500); pour que ma fonction se fasse chaque demi-secondes (par exemple). Cette fonction pourrait vérifier dans une db les actions à faire et les faire, sans devoir attendre une réaction du côté du serveur.

    ------

    Après quelques recherches pendant l'écriture de mon message, j'en suis venu à une autre solution possible à mon problème. J'ai remarqué que l'exécution du script cesse temporairement lorsqu'il tombe sur un fgets() (même un if ($return = fgets()) ).
    Si on pouvait passer par-dessus, ou l'empêcher de bloquer le script sans empêcher son fonctionnement normal, j'aurais ma solution.

  2. #2
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    regardes du coté de pcntl_fork() :
    http://www.php.net/manual/fr/function.pcntl-fork.php

    Je pense que ça pourrait t'aider, mais je n'ai jamais testé

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    PCNTL n'est pas une solution, j'ai oublié de le mentionner, mais je suis sous windows, et "Note : Actuellement, ce module ne fonctionne pas sur les environnements non Unix comme Windows."

    Je voudrais que mon code puisse fonctionner sous windows et sous *unix* sans modification.

    Merci quand même

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Il est possible de faire un fork en trichant un peu avec les headers. Deux scripts: le scriptA, déclencheur du fork et le scriptB qui tournera en arrière-plan.
    • Solution simple (Linux)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      // scriptA
       
      exec ("/usr/local/bin/php /var/www/scriptB.php > /dev/null &");
      Sous Windows, je ne pense pas que ce soit possible (a confirmer, je n'ai pas de serveur Windows...).

    • Multiplateforme
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // scriptA
       
      // on envoie un header au scriptB et on ferme immédiatement la transaction ("Connection: Close")
      $host = 'localhost';
      $fp = fsockopen($host, 80, $errno, $errstr, 10);
      $header  = "GET scriptB.php HTTP /1.1\r\n";
      $header .= "User-Agent: monScriptPHP\r\n";
      $header .= "Connection: Close\r\n\r\n";
      fputs($fp, $header);
      fclose($fp);
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      // scriptB
       
      // on empêche le "Connection: Close" du scriptA de stopper scriptB
       
      ignore_user_abort(true); 
       
      // ici ta fonction en boucle avec temporisation éventuelle sleep()
       
      // veiller à mettre un time_limit sinon le script ne s'arrêtera jamais...


    Ca devrait fonctionner sous Windows également. A tester.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci ripat, ta réponse me semble ingénieuse, mais présentement inutile.
    PHP-CLI est en ligne de commande, donc je ne veux pas avoir besoin de serveur web pour faire fonctionner cela.

    Je cherche toujours.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    et quelquechose de ce genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (true) {
        $rep=fct();
        if ($rep) { sleep($x); } else { break; }
    }
    http://fr2.php.net/manual/fr/function.sleep.php

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci à toi tthierry, mais ce n'est pas possible de cette manière.

    Je vous donne une exemple de mon code, ultra-ultra simplifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $sock = fsockopen($serv, $port);
    if (!$sock) echo "! $errstr ($errno)\n\r";
    else {
    	while(1) {
    		if ($received = fgets($sock)) {
    			//Action à faire avec ce qu'on à reçu
    		}
    		//Fais les actions "en réserve"
    	echo "#\n\r";
    	}
    }
    N.B. : Il se peut qu'il y ait des erreurs dans mon code, mais le code non-simplifié est fonctionnel à 100%.

    Donc, ce que je voudrais, c'est remplacer mon fgets() par quelquechose qui ne bloquera pas. Car, tant que le serveur ne m'a pas envoyé de données (ce qui peut prendre plusieurs secondes, voir des minutes), le script attends. Je ne peux pas modifier le serveur.

    Si fgets() ne bloquait pas, je pourrais mettre un sleep() ou quoi que ce soit et mes "actions en réserve" pourraient donc se dérouler sans que le serveur m'Envoie quelque chose au préalable.

    Merci bien, si vous voulez plus d'information afin de mieux m'aider, ne vous gênez pas.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    par défaut fsockopen agit en mode bloquant.

    il existe un mode non bloquant :
    http://fr2.php.net/manual/fr/functio...t-blocking.php

    et d'autre fonctions pour utiliser les sockets :
    http://fr2.php.net/manual/fr/ref.sockets.php
    http://fr2.php.net/manual/fr/functio...t-nonblock.php

    je n'ai jamais eu à utiliser ce mode et la famille socket_...., donc je ne sais pas si ça résoudra ton problème ou encore la manière gérer ce mode (pour ce que j'en ai compris ça permettrais de se passer d'un système de thread).

    un retour sur la question sera le bienvenue

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tthierry
    par défaut fsockopen agit en mode bloquant.

    il existe un mode non bloquant :
    http://fr2.php.net/manual/fr/functio...t-blocking.php

    un retour sur la question sera le bienvenue
    OUAIS!
    Merci beaucoup tthierry.
    C'est exactement ce qu'il me fallait, maintenant ça ne bloque plus

    Merci merci merci merci merci merci merci merci merci merci merci merci merci merci merci merci merci merci encore.

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

Discussions similaires

  1. [Configuration] limite de temps pour l'éxécution de scripts via php-cli
    Par icer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 28/05/2007, 11h33
  2. Processus PHP CLI ou CGI
    Par Hug0_76 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 06/03/2007, 14h22
  3. [PHP-JS] Équivalent thread en PHP
    Par hiko-seijuro dans le forum Langage
    Réponses: 18
    Dernier message: 20/08/2006, 14h06
  4. [Système] php-cli et header()
    Par DjinnS dans le forum Langage
    Réponses: 6
    Dernier message: 09/06/2006, 11h34
  5. PHP-cli et dessin de lignes, courbes, etc
    Par samoh dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 23/01/2006, 23h38

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