#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 реализует механизм блокировки - синхронизации, при которой все, кто хочет завладеть ресурсом и превышают некоторую квоту (определяемую типом блокировки), просто ожидают в очереди до тех пор, пока ресурс не освободится. Поэтому в данном случае доступ к файлу будет синхронизирован, и запись в файл будет вестись только одним процессом, а все остальные будут ожидать освобождения блокировки.
Комментариев нет:
Отправить комментарий