Я написал следующий код для универсальной функции для получения блокировки на основе файлов в классе в php-скрипте, который запускается очень часто.
private static $flocks = [];
public static function getLock($fname) {
$fp = null;
try {
$fp = fopen($fname . '.lock', 'w');
if ($fp === false) return false;
} catch (\Exception $e) {
return false;
}
try {
if (!flock($fp, LOCK_EX | LOCK_NB)) return false;
} catch (\Exception $e) {
return false;
}
self::$flocks[$fname] =& $fp;
return true;
}
Впоследствии я попробовал его с помощью этого скрипта:
$yy = self::getLock('snorlax');
if ($yy) {
echo("WAITING...\n");
sleep(10);
echo("DONE");
} else {
echo("UNABLE TO GET LOCK");
}
Моя проблема здесь в том, что он всегда получает блокировку.Это var_dump статического массива в конце тестового сценария ...
array(1) {
["snorlax"]=>
resource(659) of type (stream)
}
Теперь я сомневаюсь, что массив не является правильным способом сохранить указатель файла активным / в области видимости.Пожалуйста, сообщите!
Я думал о переменных переменных, но это звучит как большой беспорядок.