Utilisation de semaphore et synchronisation de script

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Utilisation de semaphore et synchronisation de script

Re: Utilisation de semaphore et synchronisation de script

par ReiJohnson » 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. ).

Re: Utilisation de semaphore et synchronisation de script

par xTG » 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éé ?

Re: Utilisation de semaphore et synchronisation de script

par ReiJohnson » 16 janv. 2015, 14:47

Apache/2.2.22
PHP/5.4.4

Distrib/Debian

Re: Utilisation de semaphore et synchronisation de script

par xTG » 16 janv. 2015, 14:17

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

Re: Utilisation de semaphore et synchronisation de script

par ReiJohnson » 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.

Re: Utilisation de semaphore et synchronisation de script

par xTG » 15 janv. 2015, 18:33

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

Re: Utilisation de semaphore et synchronisation de script

par ReiJohnson » 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 ?

Re: Utilisation de semaphore et synchronisation de script

par xTG » 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.

Utilisation de semaphore et synchronisation de script

par ReiJohnson » 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.