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

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

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

Семафор

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

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

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

Блокировка

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

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

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

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

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

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

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

Публикация в Twitter средствами API (размещение текста, ссылки, картинки)

Апрель 11, 2013 г.

Да, представьте себе, у этой "пижни" есть свой API! Раньше им пользоваться было намного проще, не было этих наворотов с OAuth. Не смотря на мое личное ...

Читать

Получить номер текущей строки в PHP

Август 27, 2020 г.

Для логгирования иногда важно не только записать какое то сообщение, но также указать - где именно произошло событие в скрипте. Давайте посмотрим, как можно получить номер строки и имя файла в PHP. Данная информация может быть предоставлена php ...

Читать

Выделение короткой строки-аннотации из HTML статьи

Март 10, 2013 г.

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

Читать

Формируем относительную ссылку

Март 2, 2017 г.

Посмотрим как можно сформировать url относительно текущего местоположения файла в php. К примеру, у в каталоге /site-script/ находится программа на PHP  и подкаталог /site-script/img, где хранятся картинки. Требуется построить относительный ...

Читать
 

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

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



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