Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

PHP - Запись в файл в многопользовательском режиме

#php #flock


Записываю протокол событий вот таким скриптом:




Но возникает вопрос:
Что будет, если вызовов будет слишком много и со всех сторон?
Не выйдет ли, что пока я залочил файл в одном вызове скрипта, другой тоже попытался,
ругнулся и ничего не записал?
Как предусмотреть это в коде?
    


Ответы

Ответ 1



Функция flock() создает для файла флаг, указывающий на то, что с файлом идет работа. При этом другой скрипт или другая программа, умеющая распознавать подобный флаг, сделает соответствующие выводы и содержимого файла не нарушит. По умолчанию, данная функция будет ждать получения эксклюзивной блокировки на запись, это поведение можно изменить с помощью параметра LOCK_NB. Если у Вас будет многопоточная запись в файл, то каждый следующий запрос просто будет дольше выполняться из-за наличия блокировки. Кстати, весь ваш код можно перенести в одну конструкцию: file_put_contents('track.log', "$trnum \t" . date("Y-m-d h:ia") ."\n", LOCK_EX | FILE_APPEND);

Ответ 2



Что будет, если вызовов будет слишком много и со всех сторон? flock реализует механизм блокировки - синхронизации, при которой все, кто хочет завладеть ресурсом и превышают некоторую квоту (определяемую типом блокировки), просто ожидают в очереди до тех пор, пока ресурс не освободится. Поэтому в данном случае доступ к файлу будет синхронизирован, и запись в файл будет вестись только одним процессом, а все остальные будут ожидать освобождения блокировки.

Комментариев нет:

Отправить комментарий