Controler qu'une fonction est en cours d'execution

Petit nouveau ! | 3 Messages

28 janv. 2009, 11:55

Bonjour,

je suis dans un mixer PHP

je ne trouve pas comment récupérer une information sur l'état d'exécution d'une fonction par un utilisateur quelconque !!

je m'explique :
quand une fonction LOURDE est executé du coté serveur pour un utilisateur, et/ou d'autres utilisateurs clique sur un bouton de leurs postes (coté client) pour exécuter la même fonction LOURDE, comment PHP réagit t-il ? (est ce qu'il y a moyen de retourner une variable pour vérifier si il est déja en exécution)

ce qui me permettra en quelques sortes de faire ceci :
<?php
       if (enCoursDutilisation(fonctionLOURDE)) {
           echo "fonction occupée";
        }
       else {
           fontionLOURDE();
       }
?>

enfin, pour mieux la simplifié en peut la comprendre par l'exemple des toilettes publique

quand c'est occupé, on n'a pas accés et on a une couleur rouge dans la serrure pour ne le montrer,

dans le cas contraire, la serrure est en vert

"La serrure représente la variable que je veut utiliser pour vérifier si la fonction LOURDE est en cours d'exécution ou pas"

Merci d'avance a tout ceux qui veulent aider
SofAm

ViPHP
ViPHP | 1380 Messages

28 janv. 2009, 12:13

Sans un accès total au serveur je ne vois pas comment faire mais tu peux facilement mettre un fichier flag:

Pseudo code

Code : Tout sélectionner

fonction () { if flag existe then exit with warning else continue créer fichier flag exécuter code fonction détruire fichier flag return }
ripat

Petit nouveau ! | 3 Messages

28 janv. 2009, 12:19

Merci pour votre réponse

SVP

pouvez vous m expliquez avec un plus de détaille ??
:shock:

SofAm

ViPHP
ViPHP | 1380 Messages

28 janv. 2009, 13:44

Renseigne-toi sur les fonctions données en exemple ci-après:
function test(){
	if (is_file('flagFonction')){
		echo "Désolé, la fonction est en cours d'utilisation";
		return FALSE;
	}
	$fp = fopen('flagFonction', 'w'); fclose($fp);

	/* code de traitement de ta fonction */
	
	unlink('flagFonction');
	return TRUE;
}
Tant que la fonction n'a pas terminé son traitement, le fichier flagFonction existera et toute autre tentative d'utiliser la fonction avortera.
ripat

Petit nouveau ! | 3 Messages

28 janv. 2009, 13:58

Merci pour la réponse

si j ai bien compris le fichier flag est en quelque sortes un fichier temporaire.

ca vas m aider énormément :arrow:

SofAm

ViPHP
ViPHP | 5924 Messages

28 janv. 2009, 21:55

Ca ne s'appelle pas une "serrure" mais un mutex…

ViPHP
ViPHP | 1380 Messages

29 janv. 2009, 11:50

Merci pour la réponse

si j ai bien compris le fichier flag est en quelque sortes un fichier temporaire.

ca vas m aider énormément :arrow:

SofAm
C'est bien ça. Fais toutefois attention à ce que ta fonction ne se plante pas en cours de route sans supprimer le fichier témoin sinon plus personne ne pourra utiliser ta fonction. Prévois une sécurité en cas d'erreur (vois du côté des exceptions).
ripat

ViPHP
ViPHP | 5924 Messages

29 janv. 2009, 12:09

C'est bien ça. Fais toutefois attention à ce que ta fonction ne se plante pas en cours de route sans supprimer le fichier témoin sinon plus personne ne pourra utiliser ta fonction. Prévois une sécurité en cas d'erreur (vois du côté des exceptions).
J'aurais plutôt dit un timeout en fonction de la date de création du fichier…
Par ailleurs, tu peux avoir un problème de synchronisation. En cas d'un code de ce genre :
if(!file_exists($file))
{
     touch($file);
}
Si deux scripts s'exécutent en même temps et que le second fasse son file_exists() juste entre le file_exists() et le touch() du premier, tu auras deux scripts qui vont s'exécuter au même moment. Donc en cas d'une grosse fréquentation, tu peux rencontrer des problèmes de synchronisation…

ViPHP
ViPHP | 1136 Messages

29 janv. 2009, 19:23

Salut ,

Je ne comprends pas bien l'intérêt de vouloir vérifier si un autre utilisateur lance utilise une fonction "lourde" ou pas ...

Car de toute manière , sauf erreur de ma part , les client sont sur des process différents au niveau du système non ?

C'est le systéme d'exploitation qui gére ensuite ses processus pour qu'ils s'executes "simultanément" ..

Pas besoin donc de mutex pour gérer une fonction ..

Php ne permettant pas encore de créer et gérer de threads , les mutex et semaphores sont donc théoriquement peu / pas utilisés sauf pour des variables global en mémoire partagé et ou fichiers , des ressources pour lesquelles nous voudrions limiter les acces , 1 seul pour les mutex , et 1-x pour les sémaphores .

Pour une utilisation standard , je ne voie pas vraiment l'intérêt , car , pour la gestion des acces à un fichier , il existe existe des fonctions pour celà , comme flock() .

Maintenant , peut être que je me trompe .. :!:

Oui / Non ?

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

29 janv. 2009, 23:35

...
Pour une utilisation standard ...
C'est là toute la subtilité justement :)
Un lock ça peut servir, parce qu'on se contente rarement d'une "utilisation standard", sinon tout le monde pourrait faire ce métier ;)

ViPHP
ViPHP | 5924 Messages

30 janv. 2009, 01:32

Tu as raison de soulever ce point stopher. Pour les configurations les plus courantes d'apache, chaque exécution sera gérée par un thread différent. Leur exécution sera indépendante. Quant à la mémoire, PHP ne la partage pas entre les scripts. Donc, à priori une synchronisation n'est pas utile.

Mais bon, ici, le but est plutôt d'étaler le temps processeur sur le temps lors de l'exécution d'une fonction lourde. Mais là cela amène une question, pourquoi ne pas plutôt réduire l'importance du traitement ?

Par ailleurs, question capitale, que comptes-tu faire si le fichier existe déjà ?

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

30 janv. 2009, 03:02

Pour donner un exemple, ce type de lock est souvent très utile lorsqu'on a une fonction de traitement lourd qui doit s'exécuter régulièrement. Par exemple on lance un cron qui lit une table et fait des traitements en fonction, comme on veut que ce soit toujours à jour le cron va se lancer toutes les 15 minutes, mais il se peut que le script prenne plus de 15 minutes à s'exécuter :arrow: lock !

Pour info, il s'agit d'un cas réel et non farfelu :)


Autre cas : on fait parfois une fonction de nettoyage d'un dossier temporaire, et pour qu'elle ne s'exécute pas tout le temps on va définir une probabilité d'exécution du "garbage collector" :
if (mt_rand(1, 1000) == 1) { // 0.1% de chance que la fonction s'enclenche
  garbage_collect();
}
La fonction peut être longue, et si on a mis en place ce test "random" ce n'est pas pour que la fonction s'exécute 36 fois en même temps sous pretexte qu'on n'aurait pas de bol :arrow: lock !