Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одновременная запись в один файл, К чему приведет? 
V
    Опции темы
Dimoon
  Дата 2.5.2006, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Скажите пожалуйста, 
что будет, если два пользователя моей гостевой книги одновременно добавят сообщение? 
Где то читал, что от этого надо предохраняться. 
А как именно? Как запретить пользователю доступ к файлу на запись, если в этот момент кто то ее производит?
 
smile 

Большое спасибо! 
PM MAIL   Вверх
Wilmer
Дата 2.5.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужно было попробывать самому, что из этого получиться.
Скорее всего одна запись добавиться, а у второй будет ошибка.
Либо одна запись добавится, а вторая поверх нее запишется.

Блокировку можно установить функцией flock.

Вариант 1.
Для каждого сообщения создавать свой файл. Другим скриптом собирать
все записи в один файл. Т.е. каждый открывать, читать, записывать в основной,
удалять. Такой скрипт лучше всего запускать через какое-то промежуток время.

Вариант 2.
Использовать БД и не мучаться с файлами. Хотя для гостевой использовать БД,
не лучший вариант.

Вариант 3.
Использовать блокировку файла.

Добавлено @ 15:39 
Если я не ошибаюсь, почти в каждой книге в разделе по работе с файлами описана блокировка.
Лучше всего приобрести книгу.   

Это сообщение отредактировал(а) Wilmer - 3.5.2006, 16:26
PM MAIL   Вверх
nitr
Дата 2.5.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Wilmer @  2.5.2006,  15:35 Найти цитируемый пост)
Использовать БД и не мучаться с файлами. Хотя для гостевой использовать БД,
не лучший вариант.

Не соглашусь, БД в любых случаях (практически) лучший вариант. Но и с БД могут быть... запись <-> чтение ;)

Добавлено @ 17:11 
Сделай типа предупреждающее сообщение... данные обновляются... а про гостевухи... их множество ;)

Добавлено @ 17:11 
А нельзя форум под гостевуху ;) ... тож ведь вариант 


--------------------
PM   Вверх
GoodBoy
Дата 3.5.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Цитата(Wilmer @  2.5.2006,  15:35 Найти цитируемый пост)
Блокировку можно установить функцией flock.

не все ОС поддерживают эту функцию! 


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
sharq
Дата 3.5.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Цитата(GoodBoy @  3.5.2006,  10:20 Найти цитируемый пост)
не все ОС поддерживают эту функцию! 

поэтому можно использовать файлы-семафоры.

 smile 
 


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Dimoon
Дата 3.5.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот что я нашел, работает под любую OC:

Описание

Суть метода простая - перед тем, как "занять" файл данных, скрипт создает этот временный файл, а после освобождения - удаляет. Таким образом, наличие этого временного файла означает, что файл данных занят. Другой экземпляр скрипта перед записью проверяет наличие временного файла и, если он есть, дожидается его удаления первым экземпляром, и только затем начинает работу с файлом данных. 

Имя для временного файла может быть любым - главное, чтобы для блокировки разных файлов данных разными скриптами использовались разные имена. 
#########################################
$lockfile="data.tmp"; #Имя временного файла блокировки
$count=50; $interval=0.05; #Кол-во попыток и интервал между ними

if (-e $lockfile)
{
#Если временный файл есть, ждем его удаления другим процессом

while (($count>0)&&(-e $lockfile))
{
sleep $interval;
$count-=1;
};
};

if ($count==0){
#Здесь размещается код обработки непредвиденной ошибки
};
open TF,">$lockfile"; #Создаем временный файл
close TF;

#...
#Здесь размещается собственно код работы с файлом данных
#...

unlink $lockfile; #Удаляем временный файл

Этот участок скрипта проверяет, существует ли временный файл. Если он существует, то производится ($count) проверок его существования через интервалы ($interval) секунд (значения 50 и 0.05 можно заменить своими; предполагается, что время ($count*$interval) более чем достаточное, чтобы другой процесс завершил работу с файлом данных). Как только временный файл будет удален другим процессом, произойдет выход из цикла; далее скрипт создает свой временный файл, осущетсвляет работу с файлом данных и удаляет временный файл.

Автор: Андрей Черный  

Это сообщение отредактировал(а) Dimoon - 3.5.2006, 18:35
PM MAIL   Вверх
Wilmer
Дата 3.5.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне кажется, что вернее будет если размещать функции для работы с файлом до его закрытия.
Иначе ничего интересного не будет.  smile 
Потом, как я знаю, если делается закрытие файла, то блокировка автоматически снимается.
Лучше блокировку снимать до закрытия файла.

Если я ошибаюсь, поправьте меня.  smile   

Это сообщение отредактировал(а) Wilmer - 3.5.2006, 16:24
PM MAIL   Вверх
Dimoon
Дата 3.5.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите пожалуйста, как выглядит "код обработки непредвиденной ошибки" 
PM MAIL   Вверх
sharq
Дата 4.5.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Dimoon, смотря в каком контексте, привиди пример.

Обычно ошибку можно поймать через проверку результата выполнения команды (в таком случае ошибка обычно содержится в $!)
Код

open my $fh, '>', 'file.txt' or die "Cant' open file: $!\n";


или 

через блок eval (ошибка содержится в переменной $@).
Код

eval { my $result = 10/2; }
die "Error: $@\n" if $@;


 smile   

Это сообщение отредактировал(а) sharq - 4.5.2006, 10:45


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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