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 :: одновременный доступ к файлу

 PHP.SU

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


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

> Без описания
Axiles
Отправлено: 13 Января, 2010 - 10:44:35
Post Id


Гость


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


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




Объясните мне пожалуйсто.
Если один скрипт открыл файл (неважно с какими правами), что произойдёт если другой скрипт попробует открыть этот же файл?
 
 Top
EuGen Администратор
Отправлено: 13 Января, 2010 - 10:56:48
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Откроет этот файл. Блокировка при открытии с помощью fopen() не ставится


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Axiles
Отправлено: 13 Января, 2010 - 11:10:51
Post Id


Гость


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


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




А как сделать чтоб он открывался по очереди, только для одного скрипта, а другой ждал когда он освободится. Или так низя?
 
 Top
EuGen Администратор
Отправлено: 13 Января, 2010 - 11:13:18
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Используйте flock()


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Axiles
Отправлено: 13 Января, 2010 - 11:17:36
Post Id


Гость


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


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




И вообще, разве возможно чтобы файл был открыт одновременно двумя разными скриптами с разными правами, например один для чтения, а другой для записи.
 
 Top
JustUserR
Отправлено: 13 Января, 2010 - 12:19:23
Post Id



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


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


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




EuGen пишет:
Используйте flock()
Да но эта блокировка относительная а не абсолютная - можно открыть файл скажем блонктом (Или другим текстовым редактором) и делать в нем изменения когда угодно
А вообще вопрос одновременного доступа очень сложен как и распаралеленное программирование - об этом пишут целые статьи а то и книги Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
EuGen Администратор
Отправлено: 13 Января, 2010 - 12:20:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




JustUserR пишет:
Да но эта блокировка относительная

Да, но автор указал, что он хочет, чтобы блокировки были актуальны для PHP скриптов.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
JustUserR
Отправлено: 13 Января, 2010 - 14:40:14
Post Id



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


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


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




EuGen пишет:
Да, но автор указал, что он хочет, чтобы блокировки были актуальны для PHP скриптов
Я с вами конечно согласен - но на самом деле не так просто синхронизировать несколько PHP-скриптов чтобы один читал а другой писал одновременно - а если же нужно просто ждать освобождения файла то flock конечно же более чем достаточно Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
s60
Отправлено: 16 Января, 2010 - 19:37:45
Post Id


Новичок


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


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




JustUserR пишет:
на самом деле не так просто синхронизировать несколько PHP-скриптов чтобы один читал а другой писал одновременно - а если же нужно просто ждать освобождения файла то flock конечно же более чем достаточно


Перефразирую топикстартера - кто может показать пример кода для арбитража доступа к файлу с постановкой в очередь при запертом файле ?

flock() - просто блокирует: с LOCK_SH можно ЧИТАТЬ, нельзя ЗАПИСЫВАТЬ, с LOCK_EX нельзя ни ЧИТАТЬ, ни ЗАПИСЫВАТЬ - проверял в дебагге проходим flock, а в Total Commander пробуем читать\править. Если файл заблокирован на чтение - то php скрипт ни в какую очередь не становится, а просто не имеет возможности прочитать файл и все.
Получается очередь надо сделать самому. А-ля в timestamp до и после fopen - и в течение ,например, секунды долбиться прочитать/записать. У кого какие будут идеи\примеры\замечания?
 
 Top
JustUserR
Отправлено: 17 Января, 2010 - 11:54:17
Post Id



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


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


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




s60 пишет:
Получается очередь надо сделать самому. А-ля в timestamp до и после fopen - и в течение ,например, секунды долбиться прочитать/записать. У кого какие будут идеи\примеры\замечания?
Если все делать самостоятельно без использования дополнительных библиотек то более чем хорошее решение - в общем случае PHP-скрипт (Полагается что имеется несколько инстанция PHP-скритов из одного проекта и они связаны между собой) пытается получить доступ к файлу и если не получается то он пишет в конец специального файла свой PID и файл к которому он хочет получить доступ - и если файл освобождается то он не захватывает его а смотрит есть ли кто в очереди перед ним - а если в очереди уже никого нет а файл не читается то выдается ошибка прав доступа


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
s60
Отправлено: 17 Января, 2010 - 12:34:31
Post Id


Новичок


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


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




JustUserR пишет:
Если все делать самостоятельно без использования дополнительных библиотек то более чем хорошее решение - в общем случае PHP-скрипт (Полагается что имеется несколько инстанция PHP-скритов из одного проекта и они связаны между собой) пытается получить доступ к файлу и если не получается то он пишет в конец специального файла свой PID и файл к которому он хочет получить доступ - и если файл освобождается то он не захватывает его а смотрит есть ли кто в очереди перед ним - а если в очереди уже никого нет а файл не читается то выдается ошибка прав доступа

все самостоятельно
без использования
из одного проекта, файл для записи ,например, счетчик
----
в твоем примере получается рекурсия вопроса: вопрос арбитража доступа перемещается на файл lock - в него будут как добавляться PID, так и удаляться после освобождения процессом файла-счетчика....

для простого проекта можно пользовать
usleep() - Delay execution in microseconds
time_nanosleep() - Delay for a number of seconds and nanoseconds
time_sleep_until() - Make the script sleep until the specified time

кол-во микросекунд выдавать случайно и считать кол-во неудач при доступе - более некоторого кол-ва = ERR_ACCESS типа Прослушивание Несущей С Контролем Доступа Улыбка ..... как-то так.... либо плюнуть и пользовать БД даже для малого проекта, недавно выбирал бесплатный хостинг - БД не редкость
 
 Top
s60
Отправлено: 17 Января, 2010 - 15:18:54
Post Id


Новичок


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


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




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

еще вариант: писать всегда во временный файл, создавать его
Цитата:
tempnam — Создаёт файл с уникальным именем
tmpfile — Создаёт временный файл


и потом rename() его в нужный - говорят операция rename() атомарная и все должно получится....

(Отредактировано автором: 17 Января, 2010 - 21:35:23)

 
 Top
JustUserR
Отправлено: 17 Января, 2010 - 18:14:25
Post Id



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


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


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




s60 пишет:
В твоем примере получается рекурсия вопроса
Не получается - имеется в виду что файл в котором хранятся приоритеты арбитража доступа - это файл не блокируется и имеет общий доступ для всех - и кроме того раз в промежуто времени этот файл переоткрывается (Вдруг другой параллельный PHP-скрипт изменил его уже) Заместо файла может использовать memcache к примеру
s60 пишет:
И потом rename() его в нудный
А какая разница?


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
s60
Отправлено: 17 Января, 2010 - 21:43:04
Post Id


Новичок


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


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




JustUserR пишет:
Не получается - имеется в виду что файл в котором хранятся приоритеты арбитража доступа - это файл не блокируется и имеет общий доступ для всех - и кроме того раз в промежуто времени этот файл переоткрывается (Вдруг другой параллельный PHP-скрипт изменил его уже)

------
структура файла арбитража:
pid1|file_name1.ext
pid2|file_name2.ext
pid3|file_name3.ext
pid4|file_name4.ext
-----
если pid1 освободил файл file_name1.ext - он удаляет строчку "pid1|file_name1.ext" из файла арбитража ? если да, то и получается, что кто-то считывает этот файл, а кто-то уже пишет в него - опять нужно разделять чтение/запись между процессами - потому и говорю что задача сместилась к файлу lock
(Добавление)
с арбитражом смысла нет изобретать - надо просто взять уже готовое решение и применить его к нашим текстовым файлам....
те же СУБД какие-то механизмы используют...
другие технологии совместного доступа к переменным типа OPC - OLE for Process Control ...
(Добавление)
вот тутhttp://fileemail[dot]ru/phpcod-header[dot]html человек ломал копья по теме арбитража доступа к файлу, перебирал способы, клепал примеры - и бросил

Цитата:
.....Почитал статейки и всё реализовал через базу. В базе метки на занятость файла и т.п.
 
 Top
s60
Отправлено: 18 Января, 2010 - 00:16:40
Post Id


Новичок


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


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




там же, а точнее тут http://fileemail[dot]ru/phpcod-blokirovka[dot]html человек все-таки добил задачу....хоть как-то , но добил.... постепенно топая (с примерами кода и моделированием ситуации) от простого к сложному

Цитата:
Суть подхода, который предлагаем мы для решения этой проблемы такой:
Во время считывания из файла или записи в него данных, на сайте появляется текстовая строка с названием этого файла, когда из файла информация прочиталась или записалась, эта текстовая строка удаляется. Пока она есть, значит кто-то уже использует базу данных на чтение или запись, пользователь, который хочет обратиться к этой базе на чтение или запись, находится в цикле, ожидая пока текстовая строка исчезнет. Как только она исчезает, он читает или пишет в базу данных, сам при этом создавая такую же текстовую строку, тем самым препятствуя доступу двух и более пользователей к базе.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB