Блокирует ли flock файл между процессами?

Следующий код вызывает ошибку, хотя и очень редко, при вызове file_get_contents, что файл не существует, хотя file_exists вызывался всего несколькими операторами выше.

Я считаю, что файл был удален заданием cron между моментом вызова file_exists и возникновением ошибки.

$isRead = self::FILE_READ === $action;
$exists = file_exists($file);
$handle = fopen($file, ($isRead ? 'r' : 'c+'));
if ($handle) {
    $locked = flock($handle, ($isRead ? LOCK_SH : LOCK_EX));
    if ($locked) {
        if ($exists) {
            // Sometimes (very rarely) the following line triggers an error that
            // $file does not exist
            $data = (int)file_get_contents($file);
        } else {
            $data = 0;
        }

        if ($isRead) {
            // Get Counter
            flock($handle, LOCK_UN);

            return $data;
        }

        // Update Counter
        if (self::FILE_UPDATE === $action) {
            $value += $data;
        }
        ftruncate($handle, 0);
        rewind($handle);
        fwrite($handle, $value);
        flock($handle, LOCK_UN);

        return true;
    }
    trigger_error("[FileCache] Failed to acquire lock for updating ${file}", E_USER_ERROR);
} else {
    trigger_error("[FileCache] Failed to open file ${file}", E_USER_ERROR);
}

Гарантирует ли flock в PHP, что файл не будет изменен никакими другими процессами? Или это ограничивается текущим процессом?

Кроме того, делает ли unlink в php честь flock?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
332
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В системах Linux (и других UNIX) flock() является чисто рекомендательной блокировкой. Это предотвратит получение другими процессами конфликтующей блокировки того же файла с помощью flock(), но не предотвратит изменение или удаление файла.

В системах Windows flock() является обязательной блокировкой и предотвращает изменение файла.

Спасибо. Но мой вопрос был о внутренностях PHP. Учитывает ли интерпретатор php блокировку другого процесса?

Joyce Babu 07.04.2019 11:27

Мой ответ о внутренностях PHP. Единственная часть PHP, которая использует flock(), — это flock().

user149341 07.04.2019 19:50

Другие вопросы по теме