Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Показ данных из базы в точное время. 
:(
    Опции темы
dEEp
  Дата 29.5.2014, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 9.5.2007

Репутация: нет
Всего: нет



Столкнулся с такой задачей... Нужно показывать с определённой периодичностью данные из таблицы в БД. То есть на странице должен быть счётчик времени, по истечению которого должна появиться строка из базы. 

Я решил сделать эту задачу через cron. Т.е. с периодичностью в 1 час у записи в таблице меняется флажок и она становится доступна для показа.

Однако, получается, что смена флажка происходит, к примеру, не в 10:00, а в 10:02, а иногда в 10:03, ну а при большой загруженности машины может и в 10:20, хотя ведь там банальный запрос к базе. 

Вопрос же состоит вот в чём. Как бы сделать так, чтобы заданный механизм происходил в точно назначенное время? 

Обдумывал разные варианты и пришёл к такому... Для каждой строки указывать время, когда она должна быть показана. За полчаса (время условное) менять флажок на показ строки, а затем с клиентской стороны запрашивать её. Но перед показом проверять, соответствует ли время запроса строки со временем назначенного показа. Если оно не совпадает (+/- 5 сек), то не отображать её. Это на тот случай, если кто-то отправит запрос вручную и попытается получить запись раньше времени. 

Но тут возникают всяческие "но", поэтому хотелось бы узнать, как бы вы поступили в данной ситуации?


P.S. Ах да, речь идёт о показе загадок и подсказок в игре. Т.е. раз в сутки покажется загадка, а к ней раз в 12 часов будет показываться подсказка. Ответил правильно - выиграл артефакт. Думаю понятно, что нельзя пользователю давать возможность видеть подсказки и следующие вопросы раньше времени...

Это сообщение отредактировал(а) dEEp - 29.5.2014, 22:36
PM MAIL   Вверх
Sanchezzz
Дата 29.5.2014, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Можно на клиенте отсчитывать от серверного времени нужную временную метку, потом посылать ajax запрос на сервер, получили ответ показали подсказку.

Код

var ms = <?=time(); ?> * 1000;

Через setInterval крутим счетчик и сравниваем с временной меткой как только условие выполнено шлем ajax запрос
Код

var interval = setInterval(function(){
ms+=1000;
date = new Date(ms);

// тут условие + ajax + clearInterval(interval);

},1000);


Выше код приблизительно написан, чисто схематически.. 


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
dEEp
Дата 29.5.2014, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 9.5.2007

Репутация: нет
Всего: нет



Код не обязателен, тут логически понять как бы это сделать.. Возможно я просто запутался.

Вы описали примерно то, о чём говорил. В таблице строка с данными (подсказкой, вопросом) имеет поле с временем запуска. Но тогда я могу отправить вручную запрос на получение подсказки и получить её раньше времени. Здесь, на мой взгляд, должны быть два счётчика. Один с клиентской стороны, просто показывающий время до события, а другой - серверный, который с периодичностью готовит подсказки или загадки к показу. Но в этом-то и беда, что они могут быть не синхронизированы.
PM MAIL   Вверх
Sanchezzz
Дата 30.5.2014, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Естественно сервер раньше времени не говорит подсказку.
Насчет корректировки можно отправлять время когда след подсказка в том же ajax запросе.


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
ksnk
Дата 30.5.2014, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Надо думать объектно  smile 

Есть сущьность - "задача", у которой есть имя, тип задачи, время следующего срабатывания и сопутствующие данные про периодичность и данные для задачи... Для примера - смотри задачи в google или еще в каком будильнике.

Есть клиент, который спрашивает сервер "а какая задача сработает в ближайший час?". Клиенту выдается список задач и клиент сам отслеживает время до запуска, выставляет таймер JS'ом, например. 
Или, как довольно забавный вариант, открывает у клиента скрытый фрейм с 
Код

<meta http-equiv="refresh" content="50;url=http://mysite.ru/run_event.php/">

указывая нужное количество секунд до следующего события и url с заявкой на "проверить и исполнить случившееся событие".

Если нужно точное срабатывание до секунд - только первый вариант, причем нужно учитывать, что setTimer - не особенно точно отслеживают время, на загруженной машине они легко проглатывают пару секунд, так что  их нужно вызывать "заранее" и если "вызвал раньше" - перевызвать с более точным временем.

Второй вариант может выдавать скрипт вида
Код

<script type="text/javascript">
top.alert([
'Только что сработали события:', ' событие 1' , 'событие 2'
])
</script>
 
Вместо alert можно использовать специально обученную функцию.





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 30.5.2014, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Цитата(dEEp @  29.5.2014,  23:33 Найти цитируемый пост)
Однако, получается, что смена флажка происходит, к примеру, не в 10:00, а в 10:02, а иногда в 10:03, ну а при большой загруженности машины может и в 10:20, хотя ведь там банальный запрос к базе. 

что-то я не понял, а почему это происходит?
PM MAIL WWW ICQ Skype   Вверх
marioadm
Дата 30.5.2014, 16:50 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист PHP
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 23.4.2013
Где: Цюрих

Репутация: -1
Всего: 0



ksnk,  твои толкования вполне разумны.  тема с фреймами будет довольно удобней.


Цитата(ksnk @  30.5.2014,  09:38 Найти цитируемый пост)
Разметка HTML
1:
<meta http-equiv="refresh" content="50;url=http://mysite.ru/run_event.php/">


гуд.
А что касается таймеров и серверных схем , не отрицаю. 
Обработка времени на сервере, а клиент сам не должен видеть или запросить просмотр.  Логично
PM MAIL Skype   Вверх
ksnk
Дата 30.5.2014, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



marioadm, вариант с фреймами имеет такие же проблемы с точностью как и на javascript. Он легко может протормозить и сработать позже. Единственное преимущество - ничего писать на клиенте больше не надо.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
AVA12
Дата 30.5.2014, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 0
Всего: 4



Цитата
Я решил сделать эту задачу через cron. Т.е. с периодичностью в 1 час у записи в таблице меняется флажок и она становится доступна для показа.

Я никак не могу понять, при чем тут cron и зачем тут флаг. Что мешает заранее генерировать все подсказки и хранить в записи время очередного показа подсказки? При обработке запроса достаточно только сверять текущее время с записанным в БД.
PM ICQ Jabber   Вверх
dEEp
Дата 31.5.2014, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 9.5.2007

Репутация: нет
Всего: нет



Цитата(Aliance @  30.5.2014,  11:05 Найти цитируемый пост)
что-то я не понял, а почему это происходит? 

Так происходит, по всей видимости из-за загруженности компа.

Цитата(AVA12 @  30.5.2014,  19:24 Найти цитируемый пост)
Я никак не могу понять, при чем тут cron и зачем тут флаг. Что мешает заранее генерировать все подсказки и хранить в записи время очередного показа подсказки? При обработке запроса достаточно только сверять текущее время с записанным в БД. 

Текущее время не всегда 1 в 1 с тем, что в БД.



Господа, причём тут фреймы? Это ж как к велосипеду прикрутить ещё 4 колеса. Зачем, когда достаточно два и нужно только чтобы они между собой правильно взаимодействовали.

PM MAIL   Вверх
AVA12
Дата 1.6.2014, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 0
Всего: 4



Цитата
Текущее время не всегда 1 в 1 с тем, что в БД.

Думаю, это следует понимать как "на разных машинах текущее значение времени может различаться". Ну и что? Ведь проверка производится на той же машине (или на кластере синхронизированных машин), где хранится БД. Если же HTTP-сервер и БД находятся на разных несинхронизированных серверах, то тоже можно вывернуться, например, всю арифметику с метками времени выполнять на HTTP-сервере. А чтобы яваскрипт мог выставить правильный таймаут, нужно в ответе выдавать количество секунд, оставшихся до показа, и тогда пофигу, какое время выставлено на клиенте.
PM ICQ Jabber   Вверх
ksnk
Дата 1.6.2014, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(dEEp @  31.5.2014,  23:50 Найти цитируемый пост)
Господа, причём тут фреймы? Это ж как к велосипеду прикрутить ещё 4 колеса. 

Неее. Фрейм (iframe) - в некоторых случаях - одно единственное колесо. Позволяет писать меньше javascript'а. Впрочем - это по желанию.

Если разница во времени из за часовых поясов - то можно пользоваться временем в UTC формате.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
dEEp
Дата 2.6.2014, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 9.5.2007

Репутация: нет
Всего: нет



Дело в том, что на клиентской стороне конечно же понятно: ajax-запрос, по которому принимаем решение что нам делать - показывать вопрос или например ждать, в зависимости от статуса вопроса. Однако кто-то должен заниматься тем, чтобы в точное время менять статус вопроса (на какой-нибудь RUN или когда вопрос кончился - на CLOSE). Вопрос как раз в том, кто именно будет этим заниматься? 

Судя по тому, что вижу, cron не всегда делает это секунда в секунду, о чём писал выше. И тут получается, что либо решить как-то средствами системы, либо программыми средствами, либо самой базой.

Системой - это cron. Но он не гарантирует, что именно в 12:00:00 выполнит задачу. Он может сделать это и в 12:00:04, и в 12:04:00, если система будет чуть нагружена.

Программными средствами - это написать демон. 

Средствами базы - это могут не все базы. Если не ошибаюсь - только MS SQL Server. Ах да, ещё Postgres вроде как умел.


Но таким образом, получаем, что ни один из вариантов-то гарантии и не может дать, потому везде есть свои тонкости. Хорошо. Но тогда какой вариант будет максимально приближен к нужной задаче? 
PM MAIL   Вверх
AVA12
Дата 2.6.2014, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 4.5.2008

Репутация: 0
Всего: 4



Мда, чукча явно не читатель.
PM ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1768 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.