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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа серверной стороны без запросов клиентов.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Phantik
Отправлено: 30 Июня, 2009 - 14:51:20
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




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

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

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

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

Вообщем задачу то я выполнил, но как-то это все каряво выглядит. Наверняка в PHP есть возможность все это реализовать без левой странички, непрерывно бомбящей сервер своими запросами. Мне кажется что все это можно реализовать гораздо проще, и красивее какими-нить возможностями PHP про которые я еще не знаю. Кто-нибудь может мне посоветовать в какой области копать? Наверняка многие уже сталкивались со схожими задачами.
Заранее благодарен за ответы.

(Отредактировано автором: 30 Июня, 2009 - 14:53:35)

 
 Top
EuGen Администратор
Отправлено: 30 Июня, 2009 - 14:56:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В php вряд ли.
А вот в cron есть.
Другое дело что cron - планировщик задач. То есть может выполнять задачи в строго определенное время.
Решением может послужить запускаемый по сron скрипт, который просматривает БД на предмет исполнения необходимых действий (тем более что у Вас что то похожее уже есть).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 30 Июня, 2009 - 15:50:30
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Либо, как написал евген, по крону запускать скрипт (каждую минуту или там каждые 10 векунд). Либо писать демон, который будет круглосуточно висеть в процессах и смотреть на ту же базу данных ...
 
My status
 Top
WNeZRoS
Отправлено: 30 Июня, 2009 - 16:50:57
Post Id



Новичок


Покинул форум
Сообщений всего: 30
Дата рег-ции: Май 2009  


Помог: 0 раз(а)




Можно обрабатывать при первом обращении к тебе или противнику. Такая схема вроде в travian
 
 Top
Phantik
Отправлено: 01 Июля, 2009 - 13:42:24
Post Id


Посетитель


Покинул форум
Сообщений всего: 305
Дата рег-ции: Июнь 2009  


Помог: 0 раз(а)




Спасибо за советы. Впринципе свой метод тоже неплох правда, видимо, излишне будет нагружать Апач. Я вот думаю еще о таком варианте, как написать исполняемый клиент на 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 кода?
 
 Top
JustUserR
Отправлено: 02 Июля, 2009 - 01:46:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Phantik Exeшники какието... Напишите простой демон на Perlе к примеру (Ну можно и на PHP) и на большинстве хостингов его дадут запустить (Если он не много ресурсов кушает) ну а винда или линукс вообще будет практически без разницы


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB