Как пользоваться flock()?

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

Представим себе, что есть разные программные потоки, одни из которых читают данные — «читатели», а другие их меняют — «писари». Ясно, что «читатель» должен дождаться пока операции записи завершатся. При этом несколько «читателей» не мешают друг другу.

Семафор

Чтобы блокировка работала, необходимо использовать один и тот же способ блокировки. Иными словами, flock() нужно вызывать как при чтении, так и при записи.

В случае с «семафорным» файлом код может выглядеть вот так:

Т.е. мы проводим блокировку некого файла-семафора, а запись и чтение проводится с другими объектами.

Блокировка

Если нужно провести блокировку объекта, с которым проводятся непосредственные операции чтения-записи, то открывать файл «писарем» потребуется в специальном режиме. Режимы ‘w’ и ‘w+’ тут не подходят, т.к. до получения блокировки, содержимое файла менять нельзя.

Для полноты примера, приведу код потока-читателя:

Блокировка с тайм-аутом

По умолчанию flock() ждет получения блокировки. Сколько продлится ожидание не известно, но можно использовать флаг LOCK_NB, чтобы не ждать, а самим решать, что делать дальше.

В данном примере ожидание продлится не более 50 мсек.

Если еще остались вопросы — пишите в комментариях. :)

Мало букафф? Читайте есчо !

Имя файла по handle в PHP

Июнь 15, 2016 г.

Всем привычна схема, при которой известно имя файла, и вы совершаете с ним какие то манипуляции. В PHP много функций, которые предоставляют именно такой функционал. Что делать, когда есть только file handle? Как получить имя открытого файла? ...

Читать

Валидатор для JSON строки в PHP

Октябрь 2, 2018 г.

К JSON можно относиться как к одной из разновидностей текстовых форматов передачи данных. Но для PHP это просто ещё одна скалярная строка. Как определить, что перед нами действительно JSON? Чтобы убедиться, придется попытаться декодировать строку. ...

Читать

Досрочный выход, остановка цикла в PHP

Ноябрь 11, 2015 г.

Досрочно закончить исполнение цикла в PHP можно разными способами. Хотя конструкций циклов в PHP много, но принципы одинаковые. Для примера будем использовать цикл for. [crayon-69c97d406898e278890693/] Цикл досрочно завершится с помощью оператора break ...

Читать

Вывод анонсов статей с картинкой, в Wordpress

Август 5, 2013 г.

Сформулируем задачу. Нужно вывести 3 (а в общем случае N) анонсов новостей, с картинкой, в шаблоне на главной странице сайта. Этот кусочек должен выглядеть ...

Читать
 

Комментарии к «Как пользоваться flock()?»

Понравилась статья? Есть вопросы? - пишите в комментариях.



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