problème de référence aux semaphores
Posté : 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();
?>
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();
?>