Utilisation de semaphore et synchronisation de script
Posté : 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 :
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.
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);
}Merci par avance pour vos lumières.