Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
айл, немедленно отправляются на диск или в сеть. 
Буферизированный ввод/вывод придуман не зря. Не отключайте его без край- 
ней надобности — это может нанести серьезный ущерб производительности. 
В крайнем случае используйте 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), я был неприятно удивлен, — настолько все выгля- 
дело сложным и нелогичным. Слава Богу, 
 
<<-[Весь Текст]
Страница: из 287
 <<-