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

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

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

Семафор

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

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

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

Блокировка

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

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

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

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

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

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

Написать комментарий

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

Утилита для извлечения данных и парсинга HTML кода

Февраль 29, 2016 г.

Я иногда ссылаюсь на данную утилиту в примерах. Выкладываю её код и примеры использования. Примеры использования. Я привожу пример экспорта статей с одного из своих рабочих проектов - delovoymir2003.ru. Я выполнял программирование и переносом публикаций ...

Читать

Что использовать вместо mysql_escape_string() в Drupal 7?

Сентябрь 6, 2016 г.

Начиная с версии PHP 4.3.0, функция mysql_escape_string() считается устаревшей. PHP будет выдавать соответствующее предупреждение. Deprecated function: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. Т.е. ...

Читать

 

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

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



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