@maxxxixxxx

Чтение и запись файла, как заблокировать на время перезаписи?

Нужно взять файл.
Заблокировать его на чтение и запись.
Прочитать из него данные.
Модифицировать их.
Записать снова в файл.
Разблокировать файл.

Что то я не пойму почему блокировка только на запись можно установить?
file_put_contents($path, $data, LOCK_EX);

Даже если использовать fopen() то тоже самое.

Может я что то не допонял?
Первое это блокировка на чтение, а второе на запись?

LOCK_SH для получения разделяемой блокировки (чтение).
LOCK_EX для получения эксклюзивной блокировки (запись).
LOCK_UN для снятия блокировки (разделяемой или эксклюзивной).

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

В варианте
file_get_contents($path);
file_put_contents($path, $data, LOCK_EX);
в момент чтения может считывать несколько процессов что приведет не к правильным результатом при записи.

$fp = fopen($data->path.'.txt', "a+");
                flock($fp, LOCK_EX);//КАК ТУТ ЗАБЛОЧИТЬ НА ЧТЕНИЕ И ЗАПИСЬ ОДНОВРЕМЕННО?
                
                    $data_arr = fread($fp, filesize($data->path.'.txt'));
                    $data_arr = unserialize($data_arr);
                    
//код
                    
                    ftruncate($fp, 0);
                    fwrite($fp, $data_arr);
                    fflush($fp);
                    
                flock($fp, LOCK_UN);
            fclose($fp);
  • Вопрос задан
  • 4751 просмотр
Пригласить эксперта
Ответы на вопрос 2
lexxpavlov
@lexxpavlov
Программист, преподаватель
Вам нужны семафоры. Заведите в каком-нибудь месте специальный флаг, что файл занят. Перед обработкой файла устанавливаете флаг, после обработки снимаете. Другие клиенты перед запросом файла проверяете флаг, и если установлен, то делаете то, что нужно.
Флаг можно ставить в каком-нибудь быстром key-value хранилище - memcached, Redis, APC, MongoDB, обычную базу в спец.табличку. На крайний случай - в отдельный файл.

А можете рассказать, зачем такой странный кейс - запрещать чтение? что будут делать другие клиенты, если читать нельзя? Ждать? А сколько времени происходит обработка данных?
Пока данные не обновились, почти всегда вполне допускается отдавать предыдущую версию. Данные читаете, обрабатываете в памяти ил отдельном файле, и записываете. Зачем запрещать чтение в это время?
Ответ написан
Комментировать
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Скрипт отработал, блокировка снялась, файл свободен. Не надо никаких снималок. Скрипт умер. Как он будет за собой право на запись держать чтоли?)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы