Задать вопрос
@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);
  • Вопрос задан
  • 4798 просмотров
Подписаться 3 Оценить Комментировать
Ответ пользователя Александр Борисович К ответам на вопрос (2)
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Скрипт отработал, блокировка снялась, файл свободен. Не надо никаких снималок. Скрипт умер. Как он будет за собой право на запись держать чтоли?)
Ответ написан