![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Bi0 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 24.11.2005 Репутация: нет Всего: нет |
Интересует меня, зачем эта функция нужна. В манах пишут для "запирания файла", а на кой оно мне может понадобиться ?
|
|||
|
||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 6 Всего: 56 |
Мне кажется, что ответ простой: когда понадобится - поймешь.
ЗЫ Какой вопрос - такой ответ Это сообщение отредактировал(а) Illuminaty - 27.12.2005, 21:56 |
|||
|
||||
| XOMbl4 |
|
|||
|
Форумное жывотнае ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 2.12.2005 Репутация: 1 Всего: 2 |
Как я понял для:
а)Повышение безопасности. б)Уменьшение нагрузки на сервер. Вроде так. |
|||
|
||||
| patt |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.11.2004 Где: Николаев Репутация: 1 Всего: 2 |
Если честно, то для блокировки файлов, например есть чат, где мессаги хроняться в файле, и может сложиться такая фиговая ситуация, когда два юзера одновременно пытаються писать в этот файл........ что ессно не есть хрошо. Чтобы такого не случалось, файл сначала блокируется, потом редактируется, потом разблокируется.........
|
|||
|
||||
| DIMONSOFT |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 19.12.2004 Где: Киев Репутация: нет Всего: -3 |
Как правило, в качестве хранения информации для web-сайтов используют файлы (их еще называют "текстовыми файлами") и SQL-таблицы. Гораздо реже используют таблицы Berkeley DB (DBM (http://www.php.net/manual/en/ref.dbm.php)) и другие форматы хранения информации.
При этом почти каждый формат хранения данных имеет свой механизм защиты от сбоев при записи и чтении. Но если в SQL подобный механизм реализован на уровне самого SQL-движка, то в случае с текстовыми файлами вся ответственность за сохранность информации возлагается на нас, на программистов. В PHP существует крайне полезная функция flock() (http://www.php.net/manual/en/function.flock.php), которая в состоянии обезопасить ваши текстовые файлы от возможного повреждения данных в момент конкурентного (одновременного) обращения к ним. К моему великому сожалению, данную функцию почти всегда опускают в скриптах, полагаясь на современную скорость записи на диск. Чаще всего это срабатывает, но не до бесконечности. Рано или поздно наступает момент, когда два пользователя одновременно нажимают кнопку "сохранить", и два экземпляра одного и того же скрипта пытаются одновременно произвести две записи в один и тот же файл. Например, это могут быть две записи в гостевую книгу сайта. Результат — непредсказуем: от неудачного сохранения новой записи до краха всего файла гостевой книги. А обезопасить себя от подобных ошибок — пара пустяков. Функция flock() создает для файла флаг, указывающий на то, что с файлом идет работа. При этом другой скрипт или другая программа, умеющая распознавать подобный флаг, сделает соответствующие выводы и содержимого файла не нарушит. На примере это выглядит так. Предположим, нам нужен скрипт, который дописывает в конец файла example.txt содержимое переменной $str . Что пишут в подобном случае: if(!$w=fopen("example.txt","a+")) die "can't open file for append..."; fwrite($w,$str."\n"); fclose($w); А так это должно быть написано с использованием захвата файлов: if(!$w=fopen("example.txt","a+")) die "can't open file for append..."; flock($w,2); fwrite($w,$str."\n"); flock($w,3); fclose($w); Вот этот скрипт уже будет работать с файлом безопасно. И если несколько экземпляров данного скрипта захотят произвести запись в файл, то они сделают это по очереди, не толкаясь и не пихая все в одну кучу. Согласитесь, не слишком большие затраты для обеспечения безопасности ваших данных. Теперь о циферках, которые указываются в параметрах flock(), вместе с указателем на файл. 1 — захват файла для чтения. Этот вид захвата говорит другим программам, что файл в данный момент читается. Этот захват не считается "монопольным", и другие программы в лобой момент могут начать чтение данного файла. А если необходимо сделать запись в файл, то fopen() сначала дождется своей очереди, после чего откроет файл для записи: 2 — захват файла для записи. Этот вид захвата называется "монопольным", т.к. доступ к файлу всем другим программам запрещен. 3 — освобождение файла. Вызов flock с параметром "3" освобождает файл от захвата. Не забывайте вызывать flock() с этим параметром, когда закончили работать с файлом. Следует помнить, что функция flock() возымеет действие на файл только в том случае, если она применяется к открытому файлу. На закрытый файл данная функция наложить захват не может. Другими словами, функция flock() с параметром 1 или 2 должна вызываться после открытия файла (fopen()), а flock() с параметром 3 следует вызывать перед его закрытием (fclose()). Более точное описание функции flock() вы можете найти на странице рук-ва: http://www.php.net/manual/en/function.flock.php. --------------------
|
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 122 Всего: 261 |
В кратце, это для того, чтобы одновременно два пользователя не пытались писать в один файл, а то получится фиг знает что.
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |