| |
айл, немедленно отправляются на диск или в сеть.
Буферизированный ввод/вывод придуман не зря. Не отключайте его без край-
ней надобности — это может нанести серьезный ущерб производительности.
В крайнем случае используйте fflush().
Блокирование файла
При интенсивном обмене данными с файлами в мультизадачных операционных сис-
темах встает вопрос синхронизации операций чтения/записи между процессами. На-
пример, пусть у нас есть несколько "процессов-писателей" и один
"процесс-читатель".
Необходимо, чтобы в единицу времени к файлу имел доступ лишь один процесс-
писатель, а остальные на этот момент времени как бы "подвисали", ожидая своей
очереди. Это нужно, например, чтобы данные от нескольких процессов не перемеши-
вались в файле, а следовали блок за блоком. Как мы можем этого достигнуть?
Здесь на помощь приходит функция flock(), которая устанавливает так называемую
"рекомендательную блокировку" для файла. Это означает, что блокирование доступа
Глава 15. Работа с файлами 261
осуществляется не на уровне ядра системы, а на уровне программы. Поясню на при-
мере.
Однажды я прочитал одно замечательное сравнение рекомендательной блокировки с
перекрестком, на котором установилось довольно оживленное движение, регулируе-
мое светофором. Когда горит красный, одни машины стоят, а другие проезжают. В
принципе, любая машина может, так сказать, проехать наперекор правилам дорожно-
го движения, не дожидаясь зеленого сигнала, но в таком случае возможны аварии.
Рекомендательная блокировка работает точно таким же образом. А именно, процес-
сы, которые ей пользуются, будут работать с разделяемым файлом правильно, а ос-
тальные… как-нибудь да будут, пока не произойдет "столкновение".
С другой стороны, "жесткая блокировка" (которая в PHP не поддерживается)
подобна
шлагбауму: никто не сможет проехать, пока его не поднимут.
О жесткой блокировке мы в этой книге говорить не будем.
Единственная функция, которая занимается управлением блокировками в PHP, назы-
вается flock().
bool flock(int $f, int $operation [, int& $wouldblock])
Функция устанавливает для указанного открытого дескриптора файла $f режим бло-
кировки, который бы хотел получить текущий процесс. Этот режим задается
аргумен-
том $operation и может быть одной из следующих констант:
r LOCK_SH (или 1) — разделяемая блокировка;
r LOCK_EX (или 2) — исключительная блокировка;
r LOCK_UN (или 3) — снять блокировку;
r LOCK_NB (или 4) — эту константу нужно прибавить к одной из предыдущих, если
вы не хотите, чтобы программа "подвисала" на flock() в ожидании своей очере-
ди, а сразу возвращала управление.
В случае, если был затребован режим без ожидания, и блокировка не была успешно
установлена, в необязательный параметр-переменную $wouldblock будет записано
значение истина true.
В случае ошибки функция, как всегда, возвращает false, а в случае успешного за-
вершения — true.
Хотя в документации PHP и сказано, что flock() работает во всех операционных
системах (в том числе и под Windows), мои тесты показали, что как раз для
Windows
это не так. А именно, в этой системе функция всегда возвращает индикатор
провала, независимо от того, правильно она вызывается, или нет. Возможно, в бу-
дущих версиях PHP это досадное недоразумение будет исправлено.
Часть IV. Стандартные функции PHP 262
Типы блокировок
Вспоминаю, когда я впервые столкнулся с описанием возможностей рекомендатель-
ных блокировок Си в одном из электронных справочников (кажется, это был man
операционной системы FreeBSD), я был неприятно удивлен, — настолько все выгля-
дело сложным и нелогичным. Слава Богу,
|
|