zkrvndm
@zkrvndm
Архитектор решений

Возможны ли коллизии при использовании rename?

Не совсем понимаю, как работает функция rename в php. Допустим из двух разных PHP файлов я одновременно попытаюсь переименовать файл, прям миллисекунда в миллисекунду. Я правильно понимаю, что сработает только один из rename-ов и сработавший гарантированно вернет true, а второй не сработавший гарантированно вернет false?

Под копотом они же выполняются в порядке очереди и вариант когда файл окажется сломан из-за параллельной записи невозможен?

Например, возможна ли ситуация, когда оба rename вернут false несмотря на доступный файл? Или оба вернут true?

Использую небольшую самописную файловую БД и хочу предусмотреть ситуации, чтобы десяток таких одновременных rename-ов не сломали мне файл или что хуже один и тот же файл уйдет нескольким пользователям (переименовывая файл я как бы помечаю, что этот файл уже занят).
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
@rPman
Системный rename атомарный, т.е. два одновременно работающих приложения отработают так что одно вернет true а другое false. Осторожно с сетевыми файловыми системами, к примеру nfs не гарантирует.

Но вот записи в файл - нет, совершенно нормально получить кашу, если писать в файл к примеру логи (строчки) одновременно из двух потоков/процессов. И fflush тут не спасет, понадобится синхронизация либо через блокировки файлов (не рекомендую) либо через семафоры/мьютексы или другие IPC механизмы. Есть мнение что запись кластера файловой системы - атомарна (если твои writes выровнены по нему и размером с него), но как я понимаю гарантий этого никто не дает.

p.s. если у тебя многопоточный доступ к данным, настоятельно рекомендую не извращаться а взять готовую базу данных, даже если объемные блобы будут продолжаться храниться в файлах на диске (имя в базе) а за блокировки отвечает база данных или иной механизм, проблем будет на порядок меньше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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