Почему эта функция блокировки файлов не работает? - PullRequest
0 голосов
/ 29 ноября 2018

Я написал следующий код для универсальной функции для получения блокировки на основе файлов в классе в 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)
}

Теперь я сомневаюсь, что массив не является правильным способом сохранить указатель файла активным / в области видимости.Пожалуйста, сообщите!

Я думал о переменных переменных, но это звучит как большой беспорядок.

1 Ответ

0 голосов
/ 29 ноября 2018

Блокировка файла работает, но я ошибочно предположил, что она сразу же потерпит неудачу.Вместо этого скрипт ожидает снятия блокировки.Вот почему сценарий всегда получал блокировку.

...