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 :

Comment lancer une fonction de façon asynchrone ?


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut Comment lancer une fonction de façon asynchrone ?
    Bonjour,

    Je suis entrain de développer une application, notamment une méthode étant amener à prendre beaucoup de ressources.
    Afin de ne pas bloquer l’exécution de l'ensemble, je désires lancer cette méthode en tâche de fond, de façon asynchrone...

    Cette méthode peut-être appelé depuis une interface cliente (navigateur) ou par un programme externe, à travers une URL.

    1- Auriez-vous des méthodes afin d’exécuter une fonction de façon asynchrone ? Des exemples ?

    Par avance merci
    ++

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonsoir,

    Une fois la page chargé, tu lances son exécution via AJAX.

    A+.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Bonsoir,

    Une fois la page chargé, tu lances son exécution via AJAX.

    A+.
    Bonjour,

    J'ai pensé à utiliser AJAX !

    Seulement, certaines applications feront directement appel au serveur, afin de récupérer le contenu d'un fichier généré par cette méthode.
    Si c'était des interface web classique ça serait bien. Ce ne sera pas toujours le cas...


    Voilà ce que j'aimerais faire:
    Apel du client : Génére moi le fichier
    Reponse du serveur : tout va bien, j'exécute ta demande, rappel moi (de temps en temps) une fois que j'ai terminé. Je te redonne la main..."

    J'ai pensé à EXEC.

    • Si je ne mets pas "DOS/Windows" le script continue. Je suis en mode synchrone...
    • Si je mets "DOS/WINDOWS" le client reprend la main. le script ne s'exécute pas...


      Une idée peut être ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		$filedir = 'E:\Documents\xxxxx\MesDocuments\xxxxx\FMXML\xxxxxx\script\scriptXML.php';
    		//$lockfile = $filedir;
    		$last_line = exec('php ' .$filedir . "> DOS/Windows &", $retval);
    		echo print_r($retval);

    D'avance merci
    ++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Bonsoir,

    J'ai changé de méthode.
    Je suis passé par la gestion des processus...


    Si cela peut servir:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    $proc = new process();
    //$proc->launchBackgroundProcess('php C:\wamp\www\process\script.php');
     
    $proc->launchBackgroundProcess('php C:\wamp\www\process\script.php');
    http://monprojetmagento.localhost/produits/ajouter
     
     
    class process{
     
     
    		// lancer le processus en tâche de fond si ce dernier n'est déjà en cours
    		function launchBackgroundProcess($call) {
     
    			// Windows
    			if($this->is_windows()){
    			pclose(popen('start /b '.$call , 'r'));	
    			}
     
    			// Some sort of UNIX
    			else {
    			pclose(popen($call.' /dev/null &', 'r'));
    			echo posix_getgid();
    			}
    			return true;
    		}
     
     
     
    		function is_windows(){
    		if(PHP_OS == 'WINNT' || PHP_OS == 'WIN32'){
    		return true;
    		}
     
    		return false;
    		}
     
     
     
    }

    ++

  5. #5
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par Cvbdev Voir le message
    if($this->is_windows()){
    pclose(popen('start /b '.$call , 'r'));
    echo posix_getgid();
    }
    [/code]
    Niveau sécurité, c'est bof. Le résultat de pclose(popen(...)) devrait être vérifié.

    Par ailleurs, les fonctions posix_* ne fonctionnent pas sur windows... comme on peut le voir dans la doc http://www.php.net/manual/fr/intro.posix.php

    Vérifier qu'on est sur windows pour utiliser une fonction uniquement compatible linux... C'est bête, non ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par Shikiryu Voir le message
    Niveau sécurité, c'est bof. Le résultat de pclose(popen(...)) devrait être vérifié.

    Par ailleurs, les fonctions posix_* ne fonctionnent pas sur windows... comme on peut le voir dans la doc http://www.php.net/manual/fr/intro.posix.php

    Vérifier qu'on est sur windows pour utiliser une fonction uniquement compatible linux... C'est bête, non ?
    Merci de ton retour.

    Par ailleurs, les fonctions posix_* ne fonctionnent pas sur windows...
    Je viens de modifier le code en question afin qu'il n'y a pas de bug...
    Sous Windows s'est une véritable soucis de trouver des équivalents. De toutes façon apache n'est pas fait - a la base - pour tourner sur Windows.
    Bref...


    Petite précision: Ce que je propose est un prototype (Code que j'avais légèrement adapté, depuis un site) que je vais adapter à mon projet, qui sera uniquement sous Linux





    Niveau sécurité, c'est bof. Le résultat de pclose(popen(...)) devrait être vérifié.
    Est-ce que tu penses à cette façon de vérifier ?
    http://php.net/manual/fr/function.popen.php


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //
    // Start the process in the background
    //
    $exe = "start /b ".$bat_filename;
    if( pclose(popen($exe, 'r')) ) {
        return true;
    }
    return false;
    ?>

    ++

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/06/2009, 11h57
  2. Comment lancer une fonction présente sur une autre page ?
    Par mappy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/12/2006, 14h44
  3. Comment lancer une fonction à une date donnée
    Par ideal dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/02/2006, 12h52
  4. [PHP-JS] comment lancer une fonction javascript a partir de php
    Par amika dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/06/2005, 19h23
  5. Comment lancer une fonction
    Par Elois dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/04/2004, 19h10

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