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 :

[Système] Lancer un script sans attendre sa fin ?


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [Système] Lancer un script sans attendre sa fin ?
    Bonjour,

    Dans mon site php, j'ai besoin de lancer une fonction php tres souvent mais de facon aleatoire (parfois je dois le faire 500 fois dans l'heure parfois pas du tout).

    J'ai donc pensé appeller la fonction, si besoin, à chaque fois qu'un utilisateur viens sur une page php de mon script.

    Manque de bol, la fonction prend du temps (jusqu'a 10 secondes parfois) et j'ai pas envie de ralentir tous mes utilisateurs.

    je voulais donc savoir si y avait moyen, quand un utilisateur est sur une page php, que cette page puisse lancer un autre script php et que le script lanceur continue son execution sans attendre que le script lancé finisse.

    Au debut j'avais penser mettre une requette http dans le script principal qui lance l'autre.... mais la commande file attend que le script lancé ai fini de s'executer.

    Que me conseillez vous ?

    merci.

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Peut-etre quand faisant appel à exec ou autre qui t'execute un script sans attendre le retour. du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec('php mapage.php &');

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Mr N.
    Peut-etre quand faisant appel à exec ou autre qui t'execute un script sans attendre le retour. du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec('php mapage.php &');
    Merci.

    Mais voici ce que dit la doc php sur exec :

    Note
    Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution du programme.

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php mapage.php 1>/dev/null 2>&1

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Mr N.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php mapage.php 1>/dev/null 2>&1
    Merci de votre réponse.

    Vous pouvez me donner des précisions sur l'usage de cela (a priori il faudrait le mettre dans un exec) et à quoi sert le 1 et le 2>&1 ?

    Merci

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    pas de réponse?

  7. #7
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    je te propose plus simple qui devrait normalement solutionner ton problème :
    faire 1 frame invisible lançant ton script php et une autre frame principale dans laquelle s'affiche la page consultée par le visiteur.

  8. #8
    Membre habitué Avatar de tony montana
    Profil pro
    Inscrit en
    Février 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 114
    Points : 136
    Points
    136
    Par défaut
    salut,
    Citation Envoyé par parisien
    Citation Envoyé par Mr N.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php mapage.php 1>/dev/null 2>&1
    Vous pouvez me donner des précisions sur l'usage de cela (a priori il faudrait le mettre dans un exec) et à quoi sert le 1 et le 2>&1 ?
    cela permet de rediriger les sorties (affichage) du script . Le 1 redirige les sorties normales, et le 2 correspond au sortie d'erreur. /dev/null étant un fichier "trou noir" ou tout ce qui y rentre est supprimé. Et le &1 permet, je suppose, de faire la meme redirection que la redirection 1 de sortie normale.

    Je ne pensais pas que cela pouvais rendre la main, mais cela semble être le cas avec la fonction passthru :
    Citation Envoyé par [url
    http://fr.php.net/manual/fr/function.passthru.php[/url]]Note : Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution du programme.
    En shell le & placé à la fin de la commande permet que le shell rende la main avant la fin de l'exécution du script, cela peut donc marcher même si tu l'exécute depuis un script php avec exec.

    Il faut que tu teste.
    Par contre un problème est que chez certains (la plupart ?) des hébergeurs, ces fonctions sont interdites car considérées comme potientellement dangereuses .

    Une autre solution serait de passer par un cron qui exécute ton script php.
    si tu ne peux pas utiliser cron sur le serveur, tu peux toujours utiliser webcron. (tu trouvera pas mal d'infos sur cron, webcron, ... en cherchant rapidement dans les docs et sur le forum de developpez.com)

  9. #9
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    oui je confirme, la fonction exec est bloquée chez les hébergeurs gratuits pour des raisons évidentes de sécurité!

  10. #10
    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
    Si exec n'est pas disponible, il est possible d'envoyer un header 200 OK au sript "lanceur" comme défini plus haut. Le script lancé continuera jusqu'à la fin de son exécution (dans les limites de max_execution_time, bien sûr).

    J'ai un peu galéré la dessus mais je pense être arrivé à quelque-chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // envoi d'un header OK
    header("HTTP/1.1 200 OK");   
    header("Content-Length: 0"); 
    flush();                      
     
    // suite du script
    // ...
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/05/2008, 17h41
  2. Réponses: 5
    Dernier message: 13/02/2006, 14h45
  3. Réponses: 6
    Dernier message: 01/02/2006, 15h59
  4. [Système] Lancer un executable sans attendre la fin
    Par raptor70 dans le forum Langage
    Réponses: 1
    Dernier message: 27/10/2005, 14h25
  5. [Dos] Lancer une commande dos sans attendre la fin
    Par MrEddy dans le forum Windows
    Réponses: 4
    Dernier message: 09/06/2005, 17h38

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