Utilisation de semaphore et synchronisation de script

Petit nouveau ! | 9 Messages

14 janv. 2015, 23:38

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.

ViPHP
xTG
ViPHP | 7331 Messages

15 janv. 2015, 11:48

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.

Petit nouveau ! | 9 Messages

15 janv. 2015, 13:13

J'utilise un "sleep(int);" pour simuler un traitement. A moins que le dit sleep() soit justement le problème ?

ViPHP
xTG
ViPHP | 7331 Messages

15 janv. 2015, 18:33

C'est probable, essaies de le remplacer par une grosse boucle ?

Petit nouveau ! | 9 Messages

16 janv. 2015, 12:06

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.

ViPHP
xTG
ViPHP | 7331 Messages

16 janv. 2015, 14:17

Quel serveur utilises-tu ? Apache ? IIS ? Nginx ? ect

Petit nouveau ! | 9 Messages

16 janv. 2015, 14:47

Apache/2.2.22
PHP/5.4.4

Distrib/Debian

ViPHP
xTG
ViPHP | 7331 Messages

16 janv. 2015, 17:48

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éé ?

Petit nouveau ! | 9 Messages

16 janv. 2015, 18:39

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. ).