![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Dimoon |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.3.2006 Репутация: нет Всего: нет |
Скажите пожалуйста,
что будет, если два пользователя моей гостевой книги одновременно добавят сообщение? Где то читал, что от этого надо предохраняться. А как именно? Как запретить пользователю доступ к файлу на запись, если в этот момент кто то ее производит? Большое спасибо! |
|||
|
||||
| Wilmer |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 7.1.2006 Репутация: нет Всего: нет |
Нужно было попробывать самому, что из этого получиться.
Скорее всего одна запись добавиться, а у второй будет ошибка. Либо одна запись добавится, а вторая поверх нее запишется. Блокировку можно установить функцией flock. Вариант 1. Для каждого сообщения создавать свой файл. Другим скриптом собирать все записи в один файл. Т.е. каждый открывать, читать, записывать в основной, удалять. Такой скрипт лучше всего запускать через какое-то промежуток время. Вариант 2. Использовать БД и не мучаться с файлами. Хотя для гостевой использовать БД, не лучший вариант. Вариант 3. Использовать блокировку файла. Добавлено @ 15:39 Если я не ошибаюсь, почти в каждой книге в разделе по работе с файлами описана блокировка. Лучше всего приобрести книгу. Это сообщение отредактировал(а) Wilmer - 3.5.2006, 16:26 |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
Не соглашусь, БД в любых случаях (практически) лучший вариант. Но и с БД могут быть... запись <-> чтение ;) Добавлено @ 17:11 Сделай типа предупреждающее сообщение... данные обновляются... а про гостевухи... их множество ;) Добавлено @ 17:11 А нельзя форум под гостевуху ;) ... тож ведь вариант |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
не все ОС поддерживают эту функцию! |
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 2 Всего: 28 |
поэтому можно использовать файлы-семафоры. -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| Dimoon |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Wilmer |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 7.1.2006 Репутация: нет Всего: нет |
Мне кажется, что вернее будет если размещать функции для работы с файлом до его закрытия.
Иначе ничего интересного не будет. Потом, как я знаю, если делается закрытие файла, то блокировка автоматически снимается. Лучше блокировку снимать до закрытия файла. Если я ошибаюсь, поправьте меня. Это сообщение отредактировал(а) Wilmer - 3.5.2006, 16:24 |
|||
|
||||
| Dimoon |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 13.3.2006 Репутация: нет Всего: нет |
Подскажите пожалуйста, как выглядит "код обработки непредвиденной ошибки"
|
|||
|
||||
| sharq |
|
||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 2 Всего: 28 |
Dimoon, смотря в каком контексте, привиди пример.
Обычно ошибку можно поймать через проверку результата выполнения команды (в таком случае ошибка обычно содержится в $!)
или через блок eval (ошибка содержится в переменной $@).
Это сообщение отредактировал(а) sharq - 4.5.2006, 10:45 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||
|
|||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |