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]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (4): « 1 [2] 3 4 »   

> Без описания
steffex
Отправлено: 14 Августа, 2013 - 20:51:25
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Мелкий пишет:
Правильно - это использовать СУБД.

На коленке - раскуриваете принципы построения транзакционного хранилища. И реализуете полноценный xmin, xmax (минимальный и максимальный id транзакции, при которых этот контейнер имеет место быть). Ведь имеете в виду, что в транзакциях никогда не бывает update?
Потом реализуете вакуум, потому что датафайл распухнет тем быстрее, чем чаще надо что-то изменять. Потом ещё чего-нибудь.

Ок, спасибо.
Другой вопрос - как апдейтить?
Не писать а апдейтить?
 
 Top
Мелкий Супермодератор
Отправлено: 14 Августа, 2013 - 22:12:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Не затрагивая старую версию пишете новую копию данных (всю копию, даже если изменено пара байт), xmin и xmax по-умолчанию указываете такими, чтобы они не участвовали в обработке операций чтения. После fsync'а инвалидируете актуальную версию данных как xmax=текущая транзакция, для новой версии ставите xmin=id транзакции.

Счётчик транзакций тоже реализовать придётся. И придумать, что с ним делать при переполнении PHP_INT_MAX.

Чтение данных соответственно также усложняется - нужно проверять видимость блока данных по id транзакции, т.к. может существовать несколько копий одного блока.


-----
PostgreSQL DBA
 
 Top
steffex
Отправлено: 16 Августа, 2013 - 11:31:27
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Мелкий пишет:
Не затрагивая старую версию пишете новую копию данных (всю копию, даже если изменено пара байт), xmin и xmax по-умолчанию указываете такими, чтобы они не участвовали в обработке операций чтения. После fsync'а инвалидируете актуальную версию данных как xmax=текущая транзакция, для новой версии ставите xmin=id транзакции.

Счётчик транзакций тоже реализовать придётся. И придумать, что с ним делать при переполнении PHP_INT_MAX.

Чтение данных соответственно также усложняется - нужно проверять видимость блока данных по id транзакции, т.к. может существовать несколько копий одного блока.

Примерно понял, спасибо.
Еще такой вопрос возник:
как мне узнать сколько секунд уже ждёт flock?
Если например больше 20 то кидать Exception.
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Августа, 2013 - 21:13:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




steffex пишет:
как мне узнать сколько секунд уже ждёт flock?
Никак - это пхп.
 
 Top
Squirrel
Отправлено: 17 Августа, 2013 - 17:28:17
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


Никак не разберусь, как сделать следующую тему:
Если грубо. Читаем из файла некое число, увеличиваем на единицу, записываем в файл обратно. Как сделать так, что бы другой процесс не смог получить доступ к файлу, пока работает первый. Если можно, пример кода.
 
 Top
steffex
Отправлено: 17 Августа, 2013 - 23:24:08
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Июнь 2013  


Помог: 0 раз(а)




Squirrel пишет:
Никак не разберусь, как сделать следующую тему:
Если грубо. Читаем из файла некое число, увеличиваем на единицу, записываем в файл обратно. Как сделать так, что бы другой процесс не смог получить доступ к файлу, пока работает первый. Если можно, пример кода.

PHP:
скопировать код в буфер обмена
  1.  
  2. flock($fp, LOCK_EX);
  3. //делаем
  4. flock($fp, LOCK_UN);
  5.  

Мб даже два лока можно добавить, надо тестить.
 
 Top
LIME
Отправлено: 17 Августа, 2013 - 23:32:14
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




steffex пишет:
т.е все остальные скрипты в ту же секунду редактировать файл не смогут, верно?
хочу предостеречь
не смогут писать только скрипты также установившие блокировку
если какой-то скрипт просто запишет то ничего ему не помешает
можно рассматривать блокировку как "кто тут крайний на запись? за вами буду"
но если кто-то хамски пройдет и запишет то никто ему не помешает
то есть блокируйте во всех пишущих скриптах если их более одного в 1 файл пишут
(Добавление)
Squirrel пишет:
Как сделать так, что бы другой процесс не смог получить доступ к файлу, пока работает первый.
дык это и обсуждается тут уже вторую страницу))
пока файл на локе остальные тихо в очереди ждут
 
 Top
Squirrel
Отправлено: 18 Августа, 2013 - 03:04:03
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


Что такое блокировки я знаю. И как они работают то же. Тут в другом непонятка.
1) Первый скрипт открывает, блочит.
2) Второй скрипт открывает, блочит, подвисает.
3) Первый скрипт читает, закрывает файл, блокировка автоматически снимается.
4) Второй скрипт читает, закрывает файл, блокировка автоматически снимается.
5) Первый скрипт открывает, блочит, записывает, закрывает, блокировка автоматически снимается.
6) Второй скрипт открывает, блочит, записывает, закрывает, блокировка автоматически снимается.

Вот никак не пойму, как П4 избежать. То есть последовательность должна быть
1-2-3-5-4-6
 
 Top
LIME
Отправлено: 18 Августа, 2013 - 09:30:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




епрст.....не снимай блокировку пока не проведешь все необходимые операции
но тут надо задуматься что не так с логикой раз возникают такие затруднения
 
 Top
Squirrel
Отправлено: 18 Августа, 2013 - 18:38:53
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


LIME пишет:
.не снимай блокировку пока не проведешь все необходимые операции

RTFM: Функция закрытия файла, автоматически снимает блокировки.

В общем сделала.
Правда несколько кривовато.
Если в течении 3х секунд скрипт не может получить монопольный доступ, он использует другой механизм записи в файл.

(Отредактировано автором: 18 Августа, 2013 - 18:41:56)

 
 Top
Мелкий Супермодератор
Отправлено: 18 Августа, 2013 - 18:50:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Squirrel пишет:
RTFM: Функция закрытия файла, автоматически снимает блокировки.

А зачем закрывать дескриптор файла, когда вам это не нужно?


-----
PostgreSQL DBA
 
 Top
Squirrel
Отправлено: 18 Августа, 2013 - 18:56:18
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


Мелкий пишет:
Squirrel пишет:
RTFM: Функция закрытия файла, автоматически снимает блокировки.

А зачем закрывать дескриптор файла, когда вам это не нужно?

А я и не закрывала, когда мне это не нужно.
 
 Top
Мелкий Супермодератор
Отправлено: 18 Августа, 2013 - 20:11:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну так и зачем закрываете дескриптор, когда блокировка ещё нужна?


-----
PostgreSQL DBA
 
 Top
Squirrel
Отправлено: 18 Августа, 2013 - 21:11:37
Post Id


Забанен


Покинул форум
Сообщений всего: 147
Дата рег-ции: Авг. 2013  


Помог: 4 раз(а)

[+]


Мелкий пишет:
Ну так и зачем закрываете дескриптор, когда блокировка ещё нужна?

Прости, я не понимаю смысла в твоих вопросах. Этот как-то относится к решению задачи, или просто в реальной жизни общения не хватает?
Если есть, что по делу сказать, говори. А счетчик сообщений ты и так хорошо намотал.
 
 Top
LIME
Отправлено: 18 Августа, 2013 - 21:47:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Squirrel сначала скажи, ты знаешь что такое дескриптор?
 
 Top
Страниц (4): « 1 [2] 3 4 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB