Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция flock() 
:(
    Опции темы
Bi0
Дата 27.12.2005, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.11.2005

Репутация: нет
Всего: нет



Интересует меня, зачем эта функция нужна. В манах пишут для "запирания файла", а на кой оно мне может понадобиться ? smile
PM MAIL   Вверх
Illuminaty
Дата 27.12.2005, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


/*Антон Захаров*/
***


Профиль
Группа: Комодератор
Сообщений: 1238
Регистрация: 19.3.2005
Где: Россия, Казань

Репутация: 6
Всего: 56



Мне кажется, что ответ простой: когда понадобится - поймешь.
ЗЫ Какой вопрос - такой ответ

Это сообщение отредактировал(а) Illuminaty - 27.12.2005, 21:56
PM MAIL ICQ   Вверх
XOMbl4
Дата 27.12.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Форумное жывотнае
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 2.12.2005

Репутация: 1
Всего: 2



Как я понял для:
а)Повышение безопасности.
б)Уменьшение нагрузки на сервер.
Вроде так.
PM MAIL ICQ   Вверх
patt
Дата 27.12.2005, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.11.2004
Где: Николаев

Репутация: 1
Всего: 2



Если честно, то для блокировки файлов, например есть чат, где мессаги хроняться в файле, и может сложиться такая фиговая ситуация, когда два юзера одновременно пытаються писать в этот файл........ что ессно не есть хрошо. Чтобы такого не случалось, файл сначала блокируется, потом редактируется, потом разблокируется.........
PM MAIL ICQ Skype GTalk   Вверх
DIMONSOFT
Дата 27.12.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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.

--------------------
PM MAIL   Вверх
Mal Hack
Дата 27.12.2005, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



В кратце, это для того, чтобы одновременно два пользователя не пытались писать в один файл, а то получится фиг знает что.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.