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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция flock, Проблема с блокировкой файла 
:(
    Опции темы
semnt
Дата 4.11.2005, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Такой вопрос....
Вот два скрипта:
1.php
Код

$f=fopen("1.txt","w");
flock($f,2);

for($i=0;$i<10;$i++) {
  fwrite($f,"1");
  sleep(1);
}

flock($f,3);
fclose($f);


2.php
Код

$f=fopen("1.txt","r");
flock($f,2);

$result=fread($f,10);
echo $result;

flock($f,3);
fclose($f);


Запускаем первый скрипт.
Первый скрипт открывает файл, ставит на него блокировку и в течении 10 секунд записывает в файлик 10 символов (по символу в секунду). Затем он снимает блок и закрывает файл.

Сразу же после запуска первого скрипта запускаем второй (так чтобы успеть в эти 10 секунд работы первого скрипта).
Второй скрипт открывает файл и пытается поставить блокировку. Уже существующий к тому времени блок не даёт это сделать. Скрипт ожидает, пока этот блок не будет снят. После этого скрипт пытается прочитать из файлика 10 символов и вывести их на страницу.

И вроде всё правильно, но если реально сымитировать два параллельных запроса flock($f,2) - то желаемого эффекта мы не получаем - второй скрипт действительно ожидает снятия уже существующего блока, но после не выводит 10 единиц....(

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


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


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

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



Ты бы блокировку через константы указывал бы... ПРоще было бы.
Ну и потом, зачем тебе блок при чтении, если заранее известно, что в файле не так уж и много инфы.
PM ICQ   Вверх
semnt
Дата 5.11.2005, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Mal Hack, пример был в общем случае... Предполагается, конечно, что файл будет намного больше чем 10 байт.
Я разобрался в чём ошибка. Если интересно - могу написать.
PM MAIL   Вверх
Mal Hack
Дата 5.11.2005, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(semnt @ 6.11.2005, 00:24)
Если интересно - могу написать.

Да, конечно.

Цитата(semnt @ 6.11.2005, 00:24)
пример был в общем случае... Предполагается, конечно, что файл будет намного больше чем 10 байт.

Так бы сразу smile
PM ICQ   Вверх
semnt
Дата 6.11.2005, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А дело всё было вот в чём.
1)
Кусочек кода из скрипта 1.php
Код

//...........
flock($f,3); //Сняли блок
fclose($f);  //Закрыли файл

Что происходит. Мы осуществляли запись в файл 1.txt, а реальная запись на носитель происходит именно в момент закрытия файла, то есть операции fclose($f); Получается что мы сначала сняли блок flock($f,3); а уже только потом реально сохранили данные на носитель. Второй же скрипт, как только получил право на чтение файла 1.txt сразу же начал читать его, в то время как первый скрипт ещё не успел записать его содержимое на носитель. Значит вообще не нужно снимать блок в первом скрипте - просто закрывать файл сразу. А блок сниметься автоматически функцией fclose($f), но уже после записи на носитель.

2)
Кусочек кода из скрипта 2.php
Код

$f=fopen("1.txt","r"); //Открытие файла для чтения
flock($f,2); //Блок на запись
//...............

Вообще говоря это неправильно. Если предполагаем чтение из файла, то и блок нужно ставить не на запись, а на чтение. То есть flock($f,1);

И вот что получилось:
1.php
Код

$f=fopen("1.txt","w");
flock($f,2);

for($i=0;$i<10;$i++) {
  fwrite($f,$i,1);
  sleep(1);
}
//flock($f,2); - Не снимаем блок
fclose($f); //Закрываем файл сразу.


2.php
Код

$f=fopen("1.txt","r");
flock($f,1); //Блок на чтение

$result=fread($f,10);
echo $result;

//flock($f,2); - Не снимаем блок
fclose($f); //Закрываем файл сразу.

Работает стабильно smile

Это сообщение отредактировал(а) semnt - 6.11.2005, 00:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0480 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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