problème de référence aux semaphores

Eléphanteau du PHP | 14 Messages

14 sept. 2018, 17:03

Bonjour, j'ai un problème d'acces à un semaphore, il semble qu'à chaque fois que j'essaie d'y accéder avec un même référence je n'ai pas le même :?

le fichier php ci dessus est hébergé via apache sous ubuntu avec PHP 5.6.37

j'ai bien acces à la fonction sem_get

la première fois que j'appel ce php en http j'ai cela comme log :

Resource id #2
PHP Warning: sem_release(): SysV semaphore 2 (key 0x842) is not currently acquired in /data/cms/web/exemple.php on line 25
------Libre ------


Mais la 2 ème fois j'ai cela et cela reste bloqué comme si le release n'était pas fait sur le même que le sem_acquire :

Resource id #1
PHP Warning: sem_release(): SysV semaphore 1 (key 0x842) is not currently acquired in /data/cms/web/exemple.php on line 25


à prioris , même avec un même clef je n'accede pas au même sémaphore, comment faire? remplacer 2114 par une variable static ? un objet singleton ? comment?

si je tente de passer par une variable static cela donne le même résultat :(

Meric de votre aide :)

exemple classique :
<?php phpinfo();

if (!function_exists('sem_get')) {
echo "sem_get = non";
}else{
echo "sem_get = oui";
}
if (!function_exists('ftok')) {
echo " ftok = non";
}else{
echo " ftok = oui";
}

class maClass
{


public function monTest()
{
$semRes = sem_get(2114, 1, 0666, 0); // get the resource for the semaphore

echo strval($semRes);
error_log(strval($semRes), 0);

sem_release($semRes);// release the semaphore so other process can use it // tente de le libérer pour voir si il est occupé

if(sem_acquire($semRes)) { // try to acquire the semaphore. this function will block until the sem will be available
echo "------Libre ------";
error_log("------Libre ------", 0);
}else{
echo "----------Pas Libre-------";
error_log("------Pas Libre ------", 0);
}
}
}
$mc = new maClass;
$mc->monTest();

?>


exemple en static :

<?php phpinfo();

if (!function_exists('sem_get')) {
echo "sem_get = non";
}else{
echo "sem_get = oui";
}
if (!function_exists('ftok')) {
echo " ftok = non";
}else{
echo " ftok = oui";
}

class maClass
{

private static $SEMKey = "2002";

public function monTest()
{
$semRes = sem_get(maClass::$SEMKey, 1, 0666, 0); // get the resource for the semaphore

echo strval($semRes);
error_log(strval($semRes), 0);

sem_release($semRes);// release the semaphore so other process can use it // tente de le libérer pour voir si il est occupé

if(sem_acquire($semRes)) { // try to acquire the semaphore. this function will block until the sem will be available
echo "------Libre ------";
error_log("------Libre ------", 0);
}else{
echo "----------Pas Libre-------";
error_log("------Pas Libre ------", 0);
}
}
}
$mc = new maClass;
$mc->monTest();
?>