Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/06/2011, 13h11   #1
Membre du Club
 
Inscription : mai 2007
Messages : 188
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 188
Points : 56
Points : 56
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
++
Cvbdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 13h37   #2
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 128
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 128
Points : 7 270
Points : 7 270
Bonsoir,

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

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/06/2011, 13h59   #3
Membre du Club
 
Inscription : mai 2007
Messages : 188
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 188
Points : 56
Points : 56
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:
Citation:
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 :
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
++
Cvbdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 19h20   #4
Membre du Club
 
Inscription : mai 2007
Messages : 188
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 188
Points : 56
Points : 56
Bonsoir,

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


Si cela peut servir:

Code :
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;
		}
 
 
 
}

++
Cvbdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/06/2011, 23h05   #5
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
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 ?
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 12h31   #6
Membre du Club
 
Inscription : mai 2007
Messages : 188
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 188
Points : 56
Points : 56
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.

Citation:
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





Citation:
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 :
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;
?>

++
Cvbdev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h30.


 
 
 
 
Partenaires

Hébergement Web