Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Работа серверной стороны без запросов клиентов.
Форумы портала PHP.SU » PHP » Программирование на PHP » Работа серверной стороны без запросов клиентов.

Страниц (1): [1]
 

1. Phantik - 30 Июня, 2009 - 14:51:20 - перейти к сообщению
Здравствуйте форумчане. Я тут человек новый, поэтому прошу не судить строго за, возможно, примитивные вопросы.
Проблема в следующем. В контексте создания браузерной игры столкнулся с задачей необходимости обработки данных на сервере в ситуациях когда от клиентов не поступает запростов вообще, но при этом обрабатывать данные нужно. Банальный пример: Я отправляю свою армию на врага и прийти она должна допустим через 3 часа. Рассматривается ситуация, когда ни меня ни противника(на которого я отправил армию) нету у компа вообще. Но тем не менее, должен отработать скрипт который обсчитает битву и запишет в базу данных всю информацию о результатах данного события(битвы).

Я только недавно начал изучать PHP и пока у меня нет идеи как реализовать такую задачу. У меня пока сложилось жесткое представление об работе PHP связанное с четкой логикой: запрос клиента -> ответ сервера. Т.е. у меня каждая страница делится на 2 состовляющие:
1) html(php) страница - которую показываем клиенту.
2) php страница обрабатывающая страницу из пункта 1.
(иногда пункты 1 и 2 совмещены физически в одной странице)

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

Я немного погорячился, сказав что нету идеи. Идея есть и я ее даже реализовал и она работает следующим образом. Все события которые должны произойти сами по себе в некоторое определенное время, независимо от запроса пользователя, я записываю в специальную таблицу MySQL. Одно из полей в этой таблице - это время, когда надо обработать данное событие. Дальше я сделал страничку не входящую в сайт самой игры, но каждые несколько секунд (через JavaScript таймер ) она обращается к некому php файлу. В этом файле делается запрос к таблице событий и если в ней есть записи событий время которых настало, они в цикле обрабатываются соответствующими функциями, после чего результаты записываются в базу.

Вообщем задачу то я выполнил, но как-то это все каряво выглядит. Наверняка в PHP есть возможность все это реализовать без левой странички, непрерывно бомбящей сервер своими запросами. Мне кажется что все это можно реализовать гораздо проще, и красивее какими-нить возможностями PHP про которые я еще не знаю. Кто-нибудь может мне посоветовать в какой области копать? Наверняка многие уже сталкивались со схожими задачами.
Заранее благодарен за ответы.
2. EuGen - 30 Июня, 2009 - 14:56:23 - перейти к сообщению
В php вряд ли.
А вот в cron есть.
Другое дело что cron - планировщик задач. То есть может выполнять задачи в строго определенное время.
Решением может послужить запускаемый по сron скрипт, который просматривает БД на предмет исполнения необходимых действий (тем более что у Вас что то похожее уже есть).
3. Stierus - 30 Июня, 2009 - 15:50:30 - перейти к сообщению
Либо, как написал евген, по крону запускать скрипт (каждую минуту или там каждые 10 векунд). Либо писать демон, который будет круглосуточно висеть в процессах и смотреть на ту же базу данных ...
4. WNeZRoS - 30 Июня, 2009 - 16:50:57 - перейти к сообщению
Можно обрабатывать при первом обращении к тебе или противнику. Такая схема вроде в travian
5. Phantik - 01 Июля, 2009 - 13:42:24 - перейти к сообщению
Спасибо за советы. Впринципе свой метод тоже неплох правда, видимо, излишне будет нагружать Апач. Я вот думаю еще о таком варианте, как написать исполняемый клиент на C++ Builder(надо только скачать дополнительные дрова для конекта с MySQL) Ну а в проге по таймеру анализировать таблицы и вносить изменения . Правда тут есть свои нюансы - экзешник будет работать под виндой т.е. на юниксовых хостингах я не смогу запускать свой проект. И даже если хост виндовый, позволит ли фирма-хостер запускать на своих серваках различные мои экзешники? Так же пока не совсем представляю как будет выглядеть удаленное управление мои экзешником.


Ладно.... Пока все это обсуждалось, у меня появилась еще одна проблема. Решить я ее смог как то случайно, но вот смысла, почему так происходит, не понял.
Вообщем тот файл control.php к которому каждые несколько секунд обращалась страница таймер(см. 1ый пост) имел следущую структуру:

<html>
<head>
</head>
<body>
<?php

function ABC($ID)
{
$query = "SELECT ......";
$resylt = mysql_query($query, $link);
//.............................
// Другие действия с базой
//.............................
}


// Некие действия с базой
//.............................. ..
$ID = line['Player_ID'];
switch($a)
{
case 1 : ABC($ID);
break;
case 2: //........
break;
//......................

?>

<script> location.href="timer.html"</script>
</body>
</html>

Проблема была в следущем: Выполнялись все действия в PHP коде(Некие действия с базой) но в функцию ABC() скрипт не заходил ни в какую. "Другие действия с базой" - не выполнялись. Мучался пол дня, код заработал только тогда когда заменил строку

<script> location.href="timer.html"</script>

на

<script> setTimeout("location.href='timer.html'",3000)</script>

Отсюда сделал вывод что пересылка на другую страницу выполнялась раньше чем вызывалась функция. Причем странно еще то, что весь PHP код успевал выполняться до пересылки, кроме кода внутри функции. Отложив пересылку на 3 секунды, стал успевать выполняться весь код.
кто знает в чем тут фича? Почему код выполняется как-то непоследовательно совсем?
спасет ли ситуацию замена строки
<script> setTimeout("location.href='timer.html'",3000)</script>

на <?php echo '<script> location.href="timer.html"'; </script>
если разместить ее в самом конце основного PHP кода?
6. JustUserR - 02 Июля, 2009 - 01:46:09 - перейти к сообщению
Phantik Exeшники какието... Напишите простой демон на Perlе к примеру (Ну можно и на PHP) и на большинстве хостингов его дадут запустить (Если он не много ресурсов кушает) ну а винда или линукс вообще будет практически без разницы

 

Powered by ExBB FM 1.0 RC1