@zkrvndm
Софт для автоматизации

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

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

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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект
30 апр. 2024, в 23:39
3000 руб./за проект