![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| DenisSh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 16.9.2008 Где: Taganrog Репутация: 1 Всего: 2 |
Имеем
1. многопользовательская система раздачи заданий 2. таблица с заданиями (база MySQL) 3. каждому пользователю должно даваться уникальное задание вопрос: как сделать так чтоб каждый пользователь получал уникальное задание пробовал ставить в таблице заданий статус что мол выбрано, а по завершении если пользователь нажимал допустим ОК менял статус на другой. но получается может возникнуть ситуация что пользователь закроет браузер или еще что нибудь сделает что статус выбрано так и подвисает у этого задания. как тут можно элегентно решить проблему? |
|||
|
||||
| A1ekcandr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
м.б. использовать тайм лимиты
|
|||
|
||||
| DenisSh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 16.9.2008 Где: Taganrog Репутация: 1 Всего: 2 |
в смысле использовать тайм лимиты?
появилась еще идея использовать триггеры добавив колонку времени, и на каждый апдейт проверять если статус 'выбрано' и время больше 30 минут менять статус. но боюсь если на каждый апдейт, а их может быть много, будет проверяться вся таблица то и рухнуть так все может. |
|||
|
||||
| A1ekcandr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
примерно это я и имел в виду, других вариантов не вижу
|
|||
|
||||
| DenisSh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 16.9.2008 Где: Taganrog Репутация: 1 Всего: 2 |
а тут еще идейка появилась использовать деструктор. Для каждого же пользователя создается коннекшн к базе данных или можно класс создать какой нибудь который будет во время всего сеанса пользователя активным, как только сеанс завершится сработает деструктор и тогда и почистить записи.
но тут вопрос как сделать такой класс, пробовал синглтон создавать но почему то деструктор срабатывает каждый раз при переходе страниц. т.е. вопрос изменяется на следущий можно ли создать такой класс который будет активным во время всей сессии пользователя? |
|||
|
||||
| A1ekcandr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
но в этом случае возникает другая проблема что если ктото взял задание и делает его больше 30 минут то оно перейдет в статус свободного
|
|||
|
||||
| theworldcreator |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: 10 Всего: 13 |
Используйте крон для удаление старых заданий
|
|||
|
||||
| DenisSh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 16.9.2008 Где: Taganrog Репутация: 1 Всего: 2 |
эм...мне кажется наоборот если я буду использовать триггер эта проблема может возникнуть, т.к. например я поставлю апдейт на час, а человек задание будет делать 1,5 часа тем не менее статус перейдет в свободный. А вот если я буду полагаться на сессию(сессия это для примера, еще лучше будет вариант пока пользователь находится на странице задания) то пока пользователь сидит даже если он будет 6 часов сидеть задание свободным не станет. Т.е. хотелось бы если возможно сделать так 1. пользователь заходит на страницу заданий 2. приложение выполняет запрос на свободное задание 3. приложение ставит статус этому заданию "выбрано" 4. создается какой нибудь объект 5. пользователю показывается страница заданий 6. если пользователь переходит на другую страницу или вообще выходит каком либо способом объект созданный на шаге 4) должен будет удалиться и в его деструкторе почистить данные т.е. хотелось бы создать такой объект который будет активен пока страница открыта в приложении использую смарти и получается примерно следующее function showPage($template){ $tasks = new Task(); $tasks->getTask(); //создали задания, в классе Task есть деструктор который чистит за собой showTaskPage($tasks,$template); } function showTaskPage(&$tasks,$template){ //деструктор еще не сработал $template->assign_by_ref($tasks); //деструктор не сработал $template->display('tasks.tpl'); //а вот тут где то он срабатывает(((( } |
|||
|
||||
| A1ekcandr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
вообщем алгоритм должен быть такой:
1) пользователь взял задание, задание в базе помечается как не свободное 2) проверяем есть ли пользователь на сайте, если есть то ничего не делаем, нет - помечаем задание как свободное предыдущий пост я написал до того как увидел ваш, впринципе вы правы
этот объект называется сессия посмотрите статус в углу он лайн здесь это реализовано наверное через сессии по сути ваша задача состоит в том чтобы сделать тоже самое, все= вам придется по сути каждый раз проверять статус полтьзователей, от клиента когда он нажмет на крес все= ничего не придет вопрос только в оптимизации Это сообщение отредактировал(а) A1ekcandr - 11.12.2008, 13:44 |
|||
|
||||
| theworldcreator |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 362 Регистрация: 25.8.2007 Где: Москва Репутация: 10 Всего: 13 |
В вашем случае похоже придется использовать ajax для посылке своего статуса - активен. Ну и крон чтобы просроченные записи помечал свободными.
|
|||
|
||||
| DenisSh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 16.9.2008 Где: Taganrog Репутация: 1 Всего: 2 |
опять же насколько я понимаю для того проверить пользователь в онлайне или нет нужен крон, но тут может возникнуть следующая проблема 1. крон работает с переодичностью 20 минут 2. пользователь зашел на сайт и взял задание 3. пользователь не выполнил его и вышел из сайта 4. тут же он опять зашел на сайт т.е. получается что вроде задание и не выполнено а вроде он и на сайте, т.к. чтоб это все с умом работало нужно много всяких если:( а задания там многие надо в течении дня делать и если оно зависнет на ком нибудь будет нехорошо |
|||
|
||||
| A1ekcandr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 99 Регистрация: 27.6.2007 Репутация: 1 Всего: 1 |
отредактировал выше
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
register_shutdown_function что за задания? идеальным решением было бы генерировать задания(скажем, собирая из случайно выбранных составных частей), чтоб вне зависимости от "закрыл окно", "делает больше 30 минут" каждый пользователь получал уникальное задание. Добавлено через 59 секунд не, насчет register_shutdown_function глупость написал. я совсем не так понял вопрос. |
|||
|
||||
| DenisSh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 16.9.2008 Где: Taganrog Репутация: 1 Всего: 2 |
вообщем так как времени нет сделал через крон как тут советовали.
но на досуге все таки еще попробую поковыряться со сборщиком мусора пхп и разобраться когда там и что происходит и реально ли такие типы условий вместо крона выполнять через деструкторы. если что нибудь получится отпишусь. |
|||
|
||||
![]()
|
| Правила форума "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. |