Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Использование flock [2]
Покинул форум
Сообщений всего: 26
Дата рег-ции: Июнь 2013
Помог: 0 раз(а)
Мелкий пишет:
Правильно - это использовать СУБД.
На коленке - раскуриваете принципы построения транзакционного хранилища. И реализуете полноценный xmin, xmax (минимальный и максимальный id транзакции, при которых этот контейнер имеет место быть). Ведь имеете в виду, что в транзакциях никогда не бывает update?
Потом реализуете вакуум, потому что датафайл распухнет тем быстрее, чем чаще надо что-то изменять. Потом ещё чего-нибудь.
Ок, спасибо.
Другой вопрос - как апдейтить?
Не писать а апдейтить?
Мелкий
Отправлено: 14 Августа, 2013 - 22:12:06
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Не затрагивая старую версию пишете новую копию данных (всю копию, даже если изменено пара байт), xmin и xmax по-умолчанию указываете такими, чтобы они не участвовали в обработке операций чтения. После fsync'а инвалидируете актуальную версию данных как xmax=текущая транзакция, для новой версии ставите xmin=id транзакции.
Счётчик транзакций тоже реализовать придётся. И придумать, что с ним делать при переполнении PHP_INT_MAX.
Чтение данных соответственно также усложняется - нужно проверять видимость блока данных по id транзакции, т.к. может существовать несколько копий одного блока.
----- PostgreSQL DBA
steffex
Отправлено: 16 Августа, 2013 - 11:31:27
Новичок
Покинул форум
Сообщений всего: 26
Дата рег-ции: Июнь 2013
Помог: 0 раз(а)
Мелкий пишет:
Не затрагивая старую версию пишете новую копию данных (всю копию, даже если изменено пара байт), xmin и xmax по-умолчанию указываете такими, чтобы они не участвовали в обработке операций чтения. После fsync'а инвалидируете актуальную версию данных как xmax=текущая транзакция, для новой версии ставите xmin=id транзакции.
Счётчик транзакций тоже реализовать придётся. И придумать, что с ним делать при переполнении PHP_INT_MAX.
Чтение данных соответственно также усложняется - нужно проверять видимость блока данных по id транзакции, т.к. может существовать несколько копий одного блока.
Примерно понял, спасибо.
Еще такой вопрос возник:
как мне узнать сколько секунд уже ждёт flock?
Если например больше 20 то кидать Exception.
DeepVarvar
Отправлено: 16 Августа, 2013 - 21:13:47
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013
Помог: 4 раз(а)
[+]
Никак не разберусь, как сделать следующую тему:
Если грубо. Читаем из файла некое число, увеличиваем на единицу, записываем в файл обратно. Как сделать так, что бы другой процесс не смог получить доступ к файлу, пока работает первый. Если можно, пример кода.
steffex
Отправлено: 17 Августа, 2013 - 23:24:08
Новичок
Покинул форум
Сообщений всего: 26
Дата рег-ции: Июнь 2013
Помог: 0 раз(а)
Squirrel пишет:
Никак не разберусь, как сделать следующую тему:
Если грубо. Читаем из файла некое число, увеличиваем на единицу, записываем в файл обратно. Как сделать так, что бы другой процесс не смог получить доступ к файлу, пока работает первый. Если можно, пример кода.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
steffex пишет:
т.е все остальные скрипты в ту же секунду редактировать файл не смогут, верно?
хочу предостеречь
не смогут писать только скрипты также установившие блокировку
если какой-то скрипт просто запишет то ничего ему не помешает
можно рассматривать блокировку как "кто тут крайний на запись? за вами буду"
но если кто-то хамски пройдет и запишет то никто ему не помешает
то есть блокируйте во всех пишущих скриптах если их более одного в 1 файл пишут (Добавление)
Squirrel пишет:
Как сделать так, что бы другой процесс не смог получить доступ к файлу, пока работает первый.
дык это и обсуждается тут уже вторую страницу))
пока файл на локе остальные тихо в очереди ждут
Squirrel
Отправлено: 18 Августа, 2013 - 03:04:03
Забанен
Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013
Помог: 4 раз(а)
[+]
Что такое блокировки я знаю. И как они работают то же. Тут в другом непонятка.
1) Первый скрипт открывает, блочит.
2) Второй скрипт открывает, блочит, подвисает.
3) Первый скрипт читает, закрывает файл, блокировка автоматически снимается.
4) Второй скрипт читает, закрывает файл, блокировка автоматически снимается.
5) Первый скрипт открывает, блочит, записывает, закрывает, блокировка автоматически снимается.
6) Второй скрипт открывает, блочит, записывает, закрывает, блокировка автоматически снимается.
Вот никак не пойму, как П4 избежать. То есть последовательность должна быть
1-2-3-5-4-6
LIME
Отправлено: 18 Августа, 2013 - 09:30:10
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
епрст.....не снимай блокировку пока не проведешь все необходимые операции
но тут надо задуматься что не так с логикой раз возникают такие затруднения
Squirrel
Отправлено: 18 Августа, 2013 - 18:38:53
Забанен
Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013
Помог: 4 раз(а)
[+]
LIME пишет:
.не снимай блокировку пока не проведешь все необходимые операции
RTFM: Функция закрытия файла, автоматически снимает блокировки.
В общем сделала.
Правда несколько кривовато.
Если в течении 3х секунд скрипт не может получить монопольный доступ, он использует другой механизм записи в файл.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Squirrel пишет:
RTFM: Функция закрытия файла, автоматически снимает блокировки.
А зачем закрывать дескриптор файла, когда вам это не нужно?
----- PostgreSQL DBA
Squirrel
Отправлено: 18 Августа, 2013 - 18:56:18
Забанен
Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013
Помог: 4 раз(а)
[+]
Мелкий пишет:
Squirrel пишет:
RTFM: Функция закрытия файла, автоматически снимает блокировки.
А зачем закрывать дескриптор файла, когда вам это не нужно?
А я и не закрывала, когда мне это не нужно.
Мелкий
Отправлено: 18 Августа, 2013 - 20:11:46
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Ну так и зачем закрываете дескриптор, когда блокировка ещё нужна?
----- PostgreSQL DBA
Squirrel
Отправлено: 18 Августа, 2013 - 21:11:37
Забанен
Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013
Помог: 4 раз(а)
[+]
Мелкий пишет:
Ну так и зачем закрываете дескриптор, когда блокировка ещё нужна?
Прости, я не понимаю смысла в твоих вопросах. Этот как-то относится к решению задачи, или просто в реальной жизни общения не хватает?
Если есть, что по делу сказать, говори. А счетчик сообщений ты и так хорошо намотал.
LIME
Отправлено: 18 Августа, 2013 - 21:47:53
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Squirrel сначала скажи, ты знаешь что такое дескриптор?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.