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 :: одновременный доступ к файлу
Покинул форум
Сообщений всего: 87
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
Объясните мне пожалуйсто.
Если один скрипт открыл файл (неважно с какими правами), что произойдёт если другой скрипт попробует открыть этот же файл?
EuGen
Отправлено: 13 Января, 2010 - 10:56:48
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Откроет этот файл. Блокировка при открытии с помощью fopen() не ставится
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Axiles
Отправлено: 13 Января, 2010 - 11:10:51
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
А как сделать чтоб он открывался по очереди, только для одного скрипта, а другой ждал когда он освободится. Или так низя?
EuGen
Отправлено: 13 Января, 2010 - 11:13:18
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Используйте flock()
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Axiles
Отправлено: 13 Января, 2010 - 11:17:36
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Дек. 2009
Помог: 0 раз(а)
И вообще, разве возможно чтобы файл был открыт одновременно двумя разными скриптами с разными правами, например один для чтения, а другой для записи.
JustUserR
Отправлено: 13 Января, 2010 - 12:19:23
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
EuGen пишет:
Используйте flock()
Да но эта блокировка относительная а не абсолютная - можно открыть файл скажем блонктом (Или другим текстовым редактором) и делать в нем изменения когда угодно
А вообще вопрос одновременного доступа очень сложен как и распаралеленное программирование - об этом пишут целые статьи а то и книги
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
EuGen
Отправлено: 13 Января, 2010 - 12:20:39
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
JustUserR пишет:
Да но эта блокировка относительная
Да, но автор указал, что он хочет, чтобы блокировки были актуальны для PHP скриптов.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
JustUserR
Отправлено: 13 Января, 2010 - 14:40:14
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
EuGen пишет:
Да, но автор указал, что он хочет, чтобы блокировки были актуальны для PHP скриптов
Я с вами конечно согласен - но на самом деле не так просто синхронизировать несколько PHP-скриптов чтобы один читал а другой писал одновременно - а если же нужно просто ждать освобождения файла то flock конечно же более чем достаточно
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
s60
Отправлено: 16 Января, 2010 - 19:37:45
Новичок
Покинул форум
Сообщений всего: 10
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
JustUserR пишет:
на самом деле не так просто синхронизировать несколько PHP-скриптов чтобы один читал а другой писал одновременно - а если же нужно просто ждать освобождения файла то flock конечно же более чем достаточно
Перефразирую топикстартера - кто может показать пример кода для арбитража доступа к файлу с постановкой в очередь при запертом файле ?
flock() - просто блокирует: с LOCK_SH можно ЧИТАТЬ, нельзя ЗАПИСЫВАТЬ, с LOCK_EX нельзя ни ЧИТАТЬ, ни ЗАПИСЫВАТЬ - проверял в дебагге проходим flock, а в Total Commander пробуем читать\править. Если файл заблокирован на чтение - то php скрипт ни в какую очередь не становится, а просто не имеет возможности прочитать файл и все.
Получается очередь надо сделать самому. А-ля в timestamp до и после fopen - и в течение ,например, секунды долбиться прочитать/записать. У кого какие будут идеи\примеры\замечания?
JustUserR
Отправлено: 17 Января, 2010 - 11:54:17
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
s60 пишет:
Получается очередь надо сделать самому. А-ля в timestamp до и после fopen - и в течение ,например, секунды долбиться прочитать/записать. У кого какие будут идеи\примеры\замечания?
Если все делать самостоятельно без использования дополнительных библиотек то более чем хорошее решение - в общем случае PHP-скрипт (Полагается что имеется несколько инстанция PHP-скритов из одного проекта и они связаны между собой) пытается получить доступ к файлу и если не получается то он пишет в конец специального файла свой PID и файл к которому он хочет получить доступ - и если файл освобождается то он не захватывает его а смотрит есть ли кто в очереди перед ним - а если в очереди уже никого нет а файл не читается то выдается ошибка прав доступа
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
s60
Отправлено: 17 Января, 2010 - 12:34:31
Новичок
Покинул форум
Сообщений всего: 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 типа Прослушивание Несущей С Контролем Доступа ..... как-то так.... либо плюнуть и пользовать БД даже для малого проекта, недавно выбирал бесплатный хостинг - БД не редкость
s60
Отправлено: 17 Января, 2010 - 15:18:54
Новичок
Покинул форум
Сообщений всего: 10
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
еще вариант:
в папке lock - создавать пустые файлы с именами тех файлов, которые сейчас заблокирован, после снятия блокировки - удалять соответствующий файл в папке lock. Перед обращением к файлу - смотреть в папочку lock
еще вариант: писать всегда во временный файл, создавать его
Цитата:
tempnam — Создаёт файл с уникальным именем tmpfile — Создаёт временный файл
и потом rename() его в нужный - говорят операция rename() атомарная и все должно получится....
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
s60 пишет:
В твоем примере получается рекурсия вопроса
Не получается - имеется в виду что файл в котором хранятся приоритеты арбитража доступа - это файл не блокируется и имеет общий доступ для всех - и кроме того раз в промежуто времени этот файл переоткрывается (Вдруг другой параллельный PHP-скрипт изменил его уже) Заместо файла может использовать memcache к примеру
s60 пишет:
И потом rename() его в нудный
А какая разница?
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
s60
Отправлено: 17 Января, 2010 - 21:43:04
Новичок
Покинул форум
Сообщений всего: 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 человек ломал копья по теме арбитража доступа к файлу, перебирал способы, клепал примеры - и бросил
Цитата:
.....Почитал статейки и всё реализовал через базу. В базе метки на занятость файла и т.п.
s60
Отправлено: 18 Января, 2010 - 00:16:40
Новичок
Покинул форум
Сообщений всего: 10
Дата рег-ции: Янв. 2010
Помог: 0 раз(а)
там же, а точнее тут http://fileemail[dot]ru/phpcod-blokirovka[dot]html человек все-таки добил задачу....хоть как-то , но добил.... постепенно топая (с примерами кода и моделированием ситуации) от простого к сложному
Цитата:
Суть подхода, который предлагаем мы для решения этой проблемы такой:
Во время считывания из файла или записи в него данных, на сайте появляется текстовая строка с названием этого файла, когда из файла информация прочиталась или записалась, эта текстовая строка удаляется. Пока она есть, значит кто-то уже использует базу данных на чтение или запись, пользователь, который хочет обратиться к этой базе на чтение или запись, находится в цикле, ожидая пока текстовая строка исчезнет. Как только она исчезает, он читает или пишет в базу данных, сам при этом создавая такую же текстовую строку, тем самым препятствуя доступу двух и более пользователей к базе.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.