![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Добрый день. Такая задачка:
при выполнении скрипта, не допустить повторную его работу, пока первый пользователь не закончит работу со скриптом. На пальцах: 1 пользователь начал работу со скриптом, 2 пользователь в это время обращаясь к скрипту получит какое-либо сообщение о занятости. Вот сам код
В чем может быть ошибка? Всегда выводится Work. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
с работой flock не знаком, специфики не знаю.
но соображения имеются. не значит ли использование flock "заблокировать файл и оставить доступ только текущему процессу"? если означает, то у тебя ж все запросы к РНР файлам идут в рамках одного процесса, верно? попробуй увеличить паузу в скрипте и открыть заблокированный файл параллельно при помощи другого процесса. скажем, блокнота. у меня вот файл блокнотом открывается только на чтение во время работы РНР скрипта. Добавлено через 54 секунды кроме того, в первом же комментарии на php.net/flock вижу следующее:
и уже понимаю, что, возможно, ты выбрал неподходящий инструмент для блокировки последующих запусков. Добавлено через 3 минуты и 5 секунд может, семафоры использовать? |
|||
|
||||
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
skyboy, благодарю за быстроту и идеи. Видимо по поводу одного процесса вы правы.
По поводу семафоров - надо разбираться, буду гуглить. Есть еще идейки? |
|||
|
||||
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Начал смотреть простейший пример из одной статьи:
На выделенной строке ошибка типа - Call to undefined function: sem_get() |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
видимо, от того, что по умолчанию эти функции не активированы :(
|
|||
|
||||
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Чтобы еще придумать.
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
проверять не блокировку файла, а его наличие.
соответственно, скрипт в начале работы файл создает, а в конце работы удаляет. |
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
в flock попробуйте в качестве второго параметра указывать LOCK_EX | LOCK_NB
-------------------- Amazing |
|||
|
||||
| BuShaRt |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1391 Регистрация: 29.6.2006 Репутация: 4 Всего: 6 |
Я предлагаю вынести вопрос с уровня "работа с файлом" на уровень "работа с процессом" и просто за счет дополнительного функционала проверять не ту ли метки (полагаю в БД) о том, что ведется работа с процессом. Метка снимается по условию:
1. Пользователь обратился к другому процессу 2. Пользователь нажал кнопку окончания работы с этим процессом 3. Пользователь N-ое время бездействовал. По минимуму пользователей можно идентифицировать по IP, но лучше сделать авторизацию. Это сообщение отредактировал(а) BuShaRt - 28.10.2010, 15:07 |
|||
|
||||
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
skyboy, хорошее решение. но вот постоянно удалять\создавать файл...
MoLeX, прямо в ТОЧКУ. Работает. Жаль, что не могу поднять вам репутацию. Огромное спасибо! BuShaRt, как перспектива - это да, но пока нет даже базы как таковой. А айпишников - огромное количество крутится. Огромное Вам спасибо! Это сообщение отредактировал(а) sneJok - 28.10.2010, 23:02 |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
У skyboy, решение более устойчиво к внезапному падению исполняющего работу скрипта. После падения остается файл, у которого можно проверить время создания. Если оно достаточно велико - процесс грохнулся, и его можно еще раз стартовать. При блокировке такой информации не остается. Хотя можно время файла обновлять touch'ем. Хотя если совместить touch с блокировкой - может получится заодно и время последнего исполнения процесса.
Метка в базе данных немного сложное решение - нужно писать больше букв ;) Есть еще всякие Memcache/ тоже можно использовать для семафоров, но как и с семафорами - не в каждом сервере оно есть... Это сообщение отредактировал(а) ksnk - 28.10.2010, 23:25 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
Возвращаюсь опять к теме.
Немного изменена задача: С помощью чего еще можно сделать работу скрипта только для одного пользователя, при этом второму и последующим просто выдавать сообщение о занятости. Место имеет также обращение до 5 одновременных (!) обращений к скрипту и собственно как дать только 1 обращенному отработать? Реализация с lock не работает, иногда еще одно одновременное подключение проскакивает. Сделал через файл:
Тоже интересная ситуация. При увеличении sleep скрипт более менее стабильнее работает, но все равно пропускает двух пользователей. Самое интересное, если не использовать sleep, скрипт вообще не работает :/. Совсем непонятная логика. Это сообщение отредактировал(а) sneJok - 14.11.2010, 14:34 |
|||
|
||||
| ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
А пример из мана точно не работает? Example 611. flock() example
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
| sneJok |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 1.10.2007 Репутация: нет Всего: нет |
ksnk, к сожалению, нет. При одновременном обращении - проходит > 1 пользователей.
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |