Доброго времени, посетители.
Сегодня я дам вам небольшой, но достаточно важный совет - совет по снижению нагрузки в online-играх.
Часто скачивая очередной freeware продукт я заинтересовываюсь принципами построения того или иного модуля.
Расскажу вам об основной ошибке (хотя нет, даже не ошибке, а невнимательности) программистов - о системе регенерации.
В 90% случаев используется cron-job, выполнение сценария php-файла по времени (1 раз в 5 минут, а то и намного быстрее) аля \"такая каша\":
mysql_query(\"UPDATE `usr` SET `hp` = `hp` + \'1\'\"
В принципе, на первых парах это довольно приемлимый вариант - обновляется все само, работает, и слава Богу.
Такой способ регенерации приемлим лишь в том случае, если мы создали сайт для двух друзей и себя - т.к можно подсчитать примерное кол-во запросов.
Представим:
Допустим, у нас 1.000.000 игроков, из них активных - 10.000 (т.е играющие люди).
Каждые пять минут MySQL будет обрабатывать 1.000.000 запросов (!), и не нужно говорить про циклы - результат будет аналогичным.
Взамен этому бесполезному занятию (курочанье сервера SQL) я предлагаю более рациональное решение - регенерировать лишь тех, кто активно играет и лишь в том случае, если игрок зашел в сеть.
Составим условие:
При переходе на страницы обновляем время последнего действия пользователя в базе данных. Текущее время минус время последнего обновления игрока, деленное на количество минут для регенерации 1 HP, округленное в меньшую сторону/большую сторону.
Нагрузка в таком случае будет уменьшена в десятки, а то и сотни раз.
И напоследок - чуть реализации:
[code]if ($user[hp] != $user[hp2s]){
$time = time();
$hp = round(($time-$user[\'date_last\'])/30);
$ne = $user[hp] + $hp;
if($hp >= $user[\'hp2s\'] or $ne >= $user[hp2s])
{ mysql_query(\"UPDATE `user` SET `hp` = `hp2s` WHERE `nick` = \'$user[nick]\'\" }
else { mysql_query(\"UPDATE `user` SET `hp` = `hp`+\'$hp\' WHERE `nick` = \'$user[nick]\'\" }
}[/code]
Также, хочу отметить, неправильную моду на массивы значений из базы данных.
mysql_fetch_array();
В данном случае я рекомендую удержаться от вытягивания всей информации при помощи * в запросе - тяните лишь то, что Вам нужно (к примеру, ник игрока, его жизнь и опыт).
К чему создавать лишнюю нагрузку, вытягивая у каждого постоянно его пароль, e-mail, дату регистрации и т.д?
Ко всему прочему заметил огромное количество ошибок из-за незнания азов программирования - различия одинарной и двойной кавычки в конструкции echo/print и им подобным.
Двойная кавычка подразумевает то, что в конструкции будут использованны переменный/константы и т.д.
Т.е наглядно:
echo \"$1 привет\";
Будет ошибочным кодом, так как переменная $1 не определена, при этом
echo \'$1 привет\';
Не будет вызывать ошибки.
Старайтесь использовать одинарные ковычки, используя двойные только в случае, когда это требуется (считаю, что одинарные ковычки обрабатываются быстрее).
в большинстве случаев mysql_fetch_array можно заменить mysql_fetch_assoc.
а echo $text . \'привет\' лучше как по мне писать так, а твой пример выдаст текст, а не значение
DiKraven, более внимательно читайте о чем я.
А я о использовании двойных кавычек в тех случаях, когда это не требуется (т.е в интерпретации конструкции нет переменных etc.)
Т.е наглядно:
echo \"$1 привет\";
Будет ошибочным кодом, так как переменная $1 не определена, при этом
echo \'$1 привет\';
Не будет вызывать ошибки.
Исходя из написанного, echo \"$1 привет\";, с какой стати будет ошибочным если определить переменную?
А echo \'$1 привет\';, вообще не выведет переменную, а тупо текст который заключен в \'\'.
хотя с числа не называют переменную, разве что поставив перед числом _
Apeccc, Простите, видимо я не так понял, что Вы хотели сказать