|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
|
dEEp |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 9.5.2007 Репутация: нет Всего: нет |
Столкнулся с такой задачей... Нужно показывать с определённой периодичностью данные из таблицы в БД. То есть на странице должен быть счётчик времени, по истечению которого должна появиться строка из базы.
Я решил сделать эту задачу через cron. Т.е. с периодичностью в 1 час у записи в таблице меняется флажок и она становится доступна для показа. Однако, получается, что смена флажка происходит, к примеру, не в 10:00, а в 10:02, а иногда в 10:03, ну а при большой загруженности машины может и в 10:20, хотя ведь там банальный запрос к базе. Вопрос же состоит вот в чём. Как бы сделать так, чтобы заданный механизм происходил в точно назначенное время? Обдумывал разные варианты и пришёл к такому... Для каждой строки указывать время, когда она должна быть показана. За полчаса (время условное) менять флажок на показ строки, а затем с клиентской стороны запрашивать её. Но перед показом проверять, соответствует ли время запроса строки со временем назначенного показа. Если оно не совпадает (+/- 5 сек), то не отображать её. Это на тот случай, если кто-то отправит запрос вручную и попытается получить запись раньше времени. Но тут возникают всяческие "но", поэтому хотелось бы узнать, как бы вы поступили в данной ситуации? P.S. Ах да, речь идёт о показе загадок и подсказок в игре. Т.е. раз в сутки покажется загадка, а к ней раз в 12 часов будет показываться подсказка. Ответил правильно - выиграл артефакт. Думаю понятно, что нельзя пользователю давать возможность видеть подсказки и следующие вопросы раньше времени... Это сообщение отредактировал(а) dEEp - 29.5.2014, 22:36 |
|||
|
||||
Sanchezzz |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
Можно на клиенте отсчитывать от серверного времени нужную временную метку, потом посылать ajax запрос на сервер, получили ответ показали подсказку.
Через setInterval крутим счетчик и сравниваем с временной меткой как только условие выполнено шлем ajax запрос
Выше код приблизительно написан, чисто схематически.. -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
||||
|
|||||
dEEp |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 9.5.2007 Репутация: нет Всего: нет |
Код не обязателен, тут логически понять как бы это сделать.. Возможно я просто запутался.
Вы описали примерно то, о чём говорил. В таблице строка с данными (подсказкой, вопросом) имеет поле с временем запуска. Но тогда я могу отправить вручную запрос на получение подсказки и получить её раньше времени. Здесь, на мой взгляд, должны быть два счётчика. Один с клиентской стороны, просто показывающий время до события, а другой - серверный, который с периодичностью готовит подсказки или загадки к показу. Но в этом-то и беда, что они могут быть не синхронизированы. |
|||
|
||||
Sanchezzz |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
Естественно сервер раньше времени не говорит подсказку.
Насчет корректировки можно отправлять время когда след подсказка в том же ajax запросе. -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
ksnk |
|
||||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Надо думать объектно
Есть сущьность - "задача", у которой есть имя, тип задачи, время следующего срабатывания и сопутствующие данные про периодичность и данные для задачи... Для примера - смотри задачи в google или еще в каком будильнике. Есть клиент, который спрашивает сервер "а какая задача сработает в ближайший час?". Клиенту выдается список задач и клиент сам отслеживает время до запуска, выставляет таймер JS'ом, например. Или, как довольно забавный вариант, открывает у клиента скрытый фрейм с
указывая нужное количество секунд до следующего события и url с заявкой на "проверить и исполнить случившееся событие". Если нужно точное срабатывание до секунд - только первый вариант, причем нужно учитывать, что setTimer - не особенно точно отслеживают время, на загруженной машине они легко проглатывают пару секунд, так что их нужно вызывать "заранее" и если "вызвал раньше" - перевызвать с более точным временем. Второй вариант может выдавать скрипт вида
Вместо alert можно использовать специально обученную функцию. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
||||
|
|||||
Aliance |
|
|||
I ♥ <script> Профиль Группа: Модератор Сообщений: 6418 Регистрация: 2.8.2004 Где: spb Репутация: 14 Всего: 137 |
||||
|
||||
marioadm |
|
|||
программист PHP Профиль Группа: Участник Сообщений: 94 Регистрация: 23.4.2013 Где: Цюрих Репутация: -1 Всего: 0 |
ksnk, твои толкования вполне разумны. тема с фреймами будет довольно удобней.
гуд. А что касается таймеров и серверных схем , не отрицаю. Обработка времени на сервере, а клиент сам не должен видеть или запросить просмотр. Логично |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
marioadm, вариант с фреймами имеет такие же проблемы с точностью как и на javascript. Он легко может протормозить и сработать позже. Единственное преимущество - ничего писать на клиенте больше не надо.
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
AVA12 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 0 Всего: 4 |
Я никак не могу понять, при чем тут cron и зачем тут флаг. Что мешает заранее генерировать все подсказки и хранить в записи время очередного показа подсказки? При обработке запроса достаточно только сверять текущее время с записанным в БД. |
|||
|
||||
dEEp |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 9.5.2007 Репутация: нет Всего: нет |
Так происходит, по всей видимости из-за загруженности компа. Текущее время не всегда 1 в 1 с тем, что в БД. Господа, причём тут фреймы? Это ж как к велосипеду прикрутить ещё 4 колеса. Зачем, когда достаточно два и нужно только чтобы они между собой правильно взаимодействовали. |
|||
|
||||
AVA12 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 0 Всего: 4 |
Думаю, это следует понимать как "на разных машинах текущее значение времени может различаться". Ну и что? Ведь проверка производится на той же машине (или на кластере синхронизированных машин), где хранится БД. Если же HTTP-сервер и БД находятся на разных несинхронизированных серверах, то тоже можно вывернуться, например, всю арифметику с метками времени выполнять на HTTP-сервере. А чтобы яваскрипт мог выставить правильный таймаут, нужно в ответе выдавать количество секунд, оставшихся до показа, и тогда пофигу, какое время выставлено на клиенте. |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Неее. Фрейм (iframe) - в некоторых случаях - одно единственное колесо. Позволяет писать меньше javascript'а. Впрочем - это по желанию. Если разница во времени из за часовых поясов - то можно пользоваться временем в UTC формате. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
dEEp |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 58 Регистрация: 9.5.2007 Репутация: нет Всего: нет |
Дело в том, что на клиентской стороне конечно же понятно: ajax-запрос, по которому принимаем решение что нам делать - показывать вопрос или например ждать, в зависимости от статуса вопроса. Однако кто-то должен заниматься тем, чтобы в точное время менять статус вопроса (на какой-нибудь RUN или когда вопрос кончился - на CLOSE). Вопрос как раз в том, кто именно будет этим заниматься?
Судя по тому, что вижу, cron не всегда делает это секунда в секунду, о чём писал выше. И тут получается, что либо решить как-то средствами системы, либо программыми средствами, либо самой базой. Системой - это cron. Но он не гарантирует, что именно в 12:00:00 выполнит задачу. Он может сделать это и в 12:00:04, и в 12:04:00, если система будет чуть нагружена. Программными средствами - это написать демон. Средствами базы - это могут не все базы. Если не ошибаюсь - только MS SQL Server. Ах да, ещё Postgres вроде как умел. Но таким образом, получаем, что ни один из вариантов-то гарантии и не может дать, потому везде есть свои тонкости. Хорошо. Но тогда какой вариант будет максимально приближен к нужной задаче? |
|||
|
||||
AVA12 |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 135 Регистрация: 4.5.2008 Репутация: 0 Всего: 4 |
Мда, чукча явно не читатель.
|
|||
|
||||
Правила форума "PHP" | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |