Page 1 sur 1

Utilisation de semaphore et synchronisation de script

Posté : 14 janv. 2015, 23:38
par ReiJohnson
Bonjour,

Dans mon programme, j'utilise le système de semaphore PHP pour pouvoir bloquer l'utilisation d'un script initial si celui-ci est déjà en cours d'exécution. Le système fonctionne et je peux le constater par exemple, lorsqu'un script annexe chargé d'afficher le contenu de mes variables semaphore ( par l'intermédiaire de shm_get_var ), me retourne "true" ou "false" en cas d’exécution ou non de mon script.

La ou sa se complique, c'est si je veux relancer le script initial ( sur un autre navigateur par exemple ) alors que ce même script est déjà en cours d'exécution. La seconde instance du script initial dont le code n'a absolument pas bougé d'un iota puisque c'est le même fichier, ignore les variables contenu dans le semaphore et s'exécute lui aussi alors qu'il ne devrait pas puisque il y a déjà une instance du même script en cours d'exécution.

Voici le code en question :

Code : Tout sélectionner

$SEMKey = "123521"; $SHMKey = "345843"; $updatedCache = NULL; $testExecutionScript = NULL; $seg = sem_get( $SEMKey, 1, 0666, -1); if($seg === false) { echo "<br />Fail to get semaphore"; } if(!sem_acquire($seg)) { echo "<br />Fail to aquire semaphore".$sem_id; sem_remove($seg); } $id = shm_attach($SHMKey); if($id === false) { echo "<br />Fail to attach shared memory.\n"; sem_remove($seg); }else { $bool = true; } $executionScriptOn = "on"; $executionScriptOff = "off"; if($bool) { if(shm_has_var($id,1)){ $testExecutionScript = shm_get_var ($id,1); }else{ shm_put_var($id, 1, $executionScriptOff); $testExecutionScript = $executionScriptOff; } if(empty($testExecutionScript) || $testExecutionScript === $executionScriptOff) { shm_put_var($id, 1, $executionScriptOn); $updatedCache = TRUE; }else { $updatedCache = FALSE; } } sem_release($seg); if($updatedCache) { echo '<br /> condition : '.shm_get_var($id, 1); echo '<br />execute'; sleep(10); shm_put_var($id, 1, $executionScriptOff); }
N'est-il pas possible de synchroniser l'exécution d'un même script appeler dans deux instances différentes ?

Merci par avance pour vos lumières.

Re: Utilisation de semaphore et synchronisation de script

Posté : 15 janv. 2015, 11:48
par xTG
Ton code ne fait quasiment rien.
Es-tu donc certain que lorsque tu lances le script dans un second navigateur le premier n'est pas déjà fini ? (mais que la réponse HTTP n'aurait pas encore été renvoyée au navigateur)

Rajoutes dans ton script un traitement de plusieurs secondes pour être sûr de cet état.

Re: Utilisation de semaphore et synchronisation de script

Posté : 15 janv. 2015, 13:13
par ReiJohnson
J'utilise un "sleep(int);" pour simuler un traitement. A moins que le dit sleep() soit justement le problème ?

Re: Utilisation de semaphore et synchronisation de script

Posté : 15 janv. 2015, 18:33
par xTG
C'est probable, essaies de le remplacer par une grosse boucle ?

Re: Utilisation de semaphore et synchronisation de script

Posté : 16 janv. 2015, 12:06
par ReiJohnson
Alors j'ai remplacé "sleep()" par un "for($i=0; $i < 500000000; $i++)" il lui faut un petit moment pour itérer tout ça, 15/20 secondes ( ce qui me laisse largement le temps de relancer le script sur un autre navigateur ) et c'est le même résultat.

Re: Utilisation de semaphore et synchronisation de script

Posté : 16 janv. 2015, 14:17
par xTG
Quel serveur utilises-tu ? Apache ? IIS ? Nginx ? ect

Re: Utilisation de semaphore et synchronisation de script

Posté : 16 janv. 2015, 14:47
par ReiJohnson
Apache/2.2.22
PHP/5.4.4

Distrib/Debian

Re: Utilisation de semaphore et synchronisation de script

Posté : 16 janv. 2015, 17:48
par xTG
Apache démarre un process par requête HTTP si je me souviens bien.
Mais normalement les sémaphores sont partagées entre process...

Il serait intéressant de monitorer la liste des processeurs lors de l'exécution des requêtes pour conclure.
Quand tu lances le script 2 fois depuis le même navigateur : as-tu 1 ou 2 process créés ?
Quand tu lances le script sur un autre navigateur : est-ce un nouveau process qui est créé ?

Re: Utilisation de semaphore et synchronisation de script

Posté : 16 janv. 2015, 18:39
par ReiJohnson
Je ferais ça. Faut que l'admin sys me donne un accès SSH et que je fasse ça à une heure ou il y a pas trop de monde. ( Le serveur ne sert pas qu'a moi. ).