2013-08-15 3 views
1

В настоящее время я работаю над браузером с бэкэндром PHP, которому необходимо выполнить определенные проверки в конкретных, изменяющихся точках в будущем. Работы Cron на самом деле не режут для меня, поскольку мне нужна точность на уровне секунд. Вот некоторая справочная информация:Запуск PHP-скрипта или функции в точном месте в будущем

  • Игра многопользовательская и пошаговая
  • О создании игровой комнаты создателя игры можно указать максимальное количество времени, затрачиваемое на действия (30 секунд - 24 часа)

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

По понятным причинам я не могу просто отслеживать время через Javascript, так как это было бы слишком легко манипулировать. Я также не могу планировать работу cron каждую минуту, так как это может быть до 30 секунд позже.

Что было бы самым эффективным способом решения этой проблемы? Я не могу представить, что запрос к базе данных каждую секунду был бы очень дружественным к серверу, но это направление, в котором я сейчас склоняюсь к [1].

Любая помощь или отзывы будут высоко оценены!

[1]:

  • пользователь делает ход
  • Функция РНР называется, который устанавливает 'switchTurnTime' в игре строки таблицы MySQL к 'TIMESTAMP'
  • A PHP-скрипт, который всегда работает в фоновом режиме, запрашивает таблицу для любых игр, где прошел 'switchTurnTime', переключает поворот и сбрасывает время.
+0

так много людей, использующих php, неправильный язык, чтобы делать игры, во всяком случае, приходит на ум php-daemon –

+0

Как насчет работ Cron. – putvande

+0

@ Dragon Heh, я выбрал PHP, так как он будет легко доступен независимо от того, где я в конечном итоге его разместил. =) Демон звучит хорошо; вы думаете использовать его в соответствии с тем, что я разместил в моем [1], или что-то еще? Вся веб-вещь для меня все еще довольно новая. – Senshi

ответ

0

На данный момент я придерживаюсь следующего подхода, поскольку он, как представляется, проще всего реализовать и протестировать, а также развернуть на разных типах серверов/хостинга, в то же время надежно работая.

  • Настройте задание cron для запуска PHP-скрипта каждую минуту.
  • Внутри этого скрипта сначала сделайте запрос, чтобы найти кандидатов, которые будут иметь свое окончание в течение этой минуты.
  • Запустите цикл while, который длится до 59 секунд.
  • Внутри этого цикла проверьте время перезаписи для каждого кандидата.
  • Если предел времени прошел, выполните другой запрос по этому конкретному кандидату, чтобы гарантировать, что конечное время не изменилось.
  • Если у него есть, повторно добавьте его в очередь кандидатов как необходимое. Если нет, действуйте соответственно (в моем случае: переключите поворот на следующий игрок).

Надеюсь, это поможет кому-то в будущем, ура!

0

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

https://stackoverflow.com/a/858924/890975

Каждый раз, когда вам нужно действие, которое происходит в определенное время, добавьте его в очередь с задержкой. Я использовал beanstalkd с различными уровнями успеха.

У вас здесь много вариантов. Вот два примера с 6-секундными интервалами:

  • Используйте хрон каждую минуту, чтобы добавить 10 рабочих мест, каждый с задержкой 6 секунд
  • Написать простой PHP скрипт, который работает в фоновом режиме (демон), чтобы добавляет новое задание в очереди каждые 6 секунд
+0

Однако, если у меня есть демон, не планировался ли планировщик заданий, поскольку я мог бы просто вызвать функцию PHP напрямую? Или я чего-то не хватает? – Senshi

+0

Несомненно. Очереди работы упрощают управление, но это определенно дополнительный уровень (а иногда и ненужный) сложности. Вот быстрый поиск Google по созданию демонов: http://kvz.io/blog/2009/01/09/create-daemons-in-php/ – jtv4k

+0

Хорошо, gotcha. Подождите немного, чтобы узнать, появятся ли какие-либо другие ответы, но если нет, это, вероятно, маршрут, который я возьму, и я приму ваш ответ. Благодарю. знак равно – Senshi

0

Как насчет использования системы кеширования, например fastcache. Затем вы можете сравнить время и запустить скрипт по истечении срока действия. Он будет вести себя так же, как Wordpress Transients, если вы знакомы с ним. Например, вы можете запускать проверку посетителя/игрока каждый раз, когда страница загружается/выполняется действие.

При необходимости вы можете постоянно проверять любые изменения с помощью JQuery/Ajax.

Смежные вопросы