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

 PHP.SU

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


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

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


Новичок


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


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




Не совсем понимаю функцию flock.
Она разрешает доступ к файлу на текущий скрипт, т.е все остальные скрипты в ту же секунду редактировать файл не смогут, верно?
Как же сделать что бы одновременно в файл смогло писать 10-15 скриптов?
 
 Top
Panoptik
Отправлено: 14 Августа, 2013 - 18:53:01
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




если файл большой и запись в файл длительная то может нужно подождать
PHP:
скопировать код в буфер обмена
  1.  
  2. while(/*atempt to open file condition */) {
  3.  sleep(1);
  4. }
  5.  
  6.  
  7.  


-----
Just do it
 
 Top
steffex
Отправлено: 14 Августа, 2013 - 19:01:29
Post Id


Новичок


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


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




Panoptik пишет:
если файл большой и запись в файл длительная то может нужно подождать
PHP:
скопировать код в буфер обмена
  1.  
  2. while(/*atempt to open file condition */) {
  3.  sleep(1);
  4. }
  5.  
  6.  
  7.  

condition как я понимаю while(flock(...) === false)
 
 Top
Мелкий Супермодератор
Отправлено: 14 Августа, 2013 - 19:03:23
Post Id



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


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


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




steffex пишет:
одновременно в файл смогло писать 10-15 скриптов?

Пишите сразу в /dev/null, чего уж там. Раз вам записываемые данные больше не нужны.

Поясню: чтобы данные можно было потом нормально прочитать, писатель в каждый момент времени должен быть только один. Иначе писатели будут хаотично перезаписывать данные конкурирующих потоков.

Если вам нужно постоянно в файл что-то дописывать - то используйте file_put_contents с флагом FILE_APPEND


-----
PostgreSQL DBA
 
 Top
steffex
Отправлено: 14 Августа, 2013 - 19:08:32
Post Id


Новичок


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


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




Мелкий пишет:
Поясню: чтобы данные можно было потом нормально прочитать, писатель в каждый момент времени должен быть только один. Иначе писатели будут хаотично перезаписывать данные конкурирующих потоков.

На то и локи наверное существуют?
И перезаписывать данные он не будет, каждый скрипт пишет уникальные.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Августа, 2013 - 19:13:38
Post Id



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


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


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




И в чём тогда вопрос, если и сами это понимаете?


-----
PostgreSQL DBA
 
 Top
steffex
Отправлено: 14 Августа, 2013 - 19:21:59
Post Id


Новичок


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


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




Мелкий пишет:
И в чём тогда вопрос, если и сами это понимаете?

Я это понимаю, но я непонимаю как правильно ждать, когда другой скрипт запишет данные.
Поэтому и спросил:
condition как я понимаю while(flock(...) === false)
while(flock(...) === false)
{
sleep(1);
/*
Тут будет проверка на то, не прошло ли больше 5 секунд ожидания.
*/
}

И еще:
Что будет если один скрипт поставить запирание на чтение, а второй на запись?
Второй будет ждать пока первый не прочитает или же нет?

(Отредактировано автором: 14 Августа, 2013 - 19:33:47)

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



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


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


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




По-умолчанию, flock вернёт управление скрипту только тогда, когда блокировку удастся захватить.

Ваш цикл имеет смысл в неблокирующем режиме LOCK_NB (под windows не поддерживается).
Смотрите комментарии в мануале: http://www.php.net/manual/en/function.flock.php


-----
PostgreSQL DBA
 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Августа, 2013 - 19:40:46
Post Id



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


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


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




steffex пишет:
я непонимаю как правильно ждать
Никак - оно уже само ждет. Если обнаружит, что файл заперт тем же методом, то уже встанет в очередь.
 
 Top
steffex
Отправлено: 14 Августа, 2013 - 19:49:00
Post Id


Новичок


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


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




DeepVarvar пишет:
steffex пишет:
я непонимаю как правильно ждать
Никак - оно уже само ждет. Если обнаружит, что файл заперт тем же методом, то уже встанет в очередь.

Отлично, спасибо - Белкин, DeepVarvar!
Еще вопросик:
Где то видел в инете пример транзакций с помощью fopen.
Т.е открываю файл, ставлю лок, что то пишу в файл и потом либо сохраняю изменения, либо отменяю все что написал.
Как это реализовать?

(Отредактировано автором: 14 Августа, 2013 - 19:53:57)

 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Августа, 2013 - 20:16:42
Post Id



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


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


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




Хранить старую версию контента в памяти.
 
 Top
steffex
Отправлено: 14 Августа, 2013 - 20:21:03
Post Id


Новичок


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


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




DeepVarvar пишет:
Хранить старую версию контента в памяти.

Файл большой, не получится.
 
 Top
DeepVarvar Супермодератор
Отправлено: 14 Августа, 2013 - 20:22:03
Post Id



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


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


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




Ну как не получится. Как-то же Вы записываете туда данные.
Насколько большой?
 
 Top
steffex
Отправлено: 14 Августа, 2013 - 20:31:34
Post Id


Новичок


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


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




DeepVarvar пишет:
Ну как не получится. Как-то же Вы записываете туда данные.
Насколько большой?

1 гб
Записываю обычно, без загрузки в память.
Читаю - построчно, нужные мне строки.

Проще уже сохранять всё что записываю в переменную а потом записывать/не записывать.
Но это не совсем правильно наверное.

(Отредактировано автором: 14 Августа, 2013 - 20:35:36)

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



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


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


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




Правильно - это использовать СУБД.

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


-----
PostgreSQL DBA
 
 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