Задать вопрос
zkrvndm
@zkrvndm
Архитектор решений

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

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

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

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

Использую небольшую самописную файловую БД и хочу предусмотреть ситуации, чтобы десяток таких одновременных rename-ов не сломали мне файл или что хуже один и тот же файл уйдет нескольким пользователям (переименовывая файл я как бы помечаю, что этот файл уже занят).
  • Вопрос задан
  • 141 просмотр
Подписаться 1 Сложный 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@rPman
Системный rename атомарный, т.е. два одновременно работающих приложения отработают так что одно вернет true а другое false. Осторожно с сетевыми файловыми системами, к примеру nfs не гарантирует.

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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽