Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Помог: 1 раз(а)
Доброго времени суток, столкнулся с проблемой нагрузки на сервер. Причина ясна - слишком много записей пользователей, тяжелые запросы к мускулу.
Сайт - игра, боты бьют с интервалами в 10 секунд(при обновлении страницы подключаю файл bots.php)
mysql_query("UPDATE users SET time_left='$time' WHERE id='$bot[id]'");
}
else
{
if($count_strikes> 0)
{
$say='';
mysql_query("UPDATE users SET time_left='$new_time_s' WHERE id='$bot[id]'");
for($i=1;$i<=$count_strikes;$i++)
{
$mdmg=0;
$ebot=mysql_fetch_array(mysql_query("SELECT * FROM users WHERE id!='$bot[id]' AND b_id='$bot[b_id]' AND hp_now>0 AND team!='$bot[team]' order by rand() limit 1"));
$say.='<br /><b><font color="gold">'.$bot['login'].'</b> использовал "удар огнём" -'.$bouns_dmg.'<img src="s/fire.png"> на <b>'.$ebot['login'].'</b></font>';
$say.='<br /><b><font color="gold">'.$bot['login'].'</b> использовал "оглушающий удар" и оглушил <b>'.$ebot['login'].'</b> на <b>'.$bot['lvl'].'</b> секунд</font>';
mysql_query("UPDATE users SET armor=armor+'$armor' WHERE id='$ebot[id]'");
$say.='<br /><b><font color="gold">'.$bot['login'].'</b> использовал "корозию" и уменьшил броню <b>'.$ebot['login'].'</b> на <b>'.$armor.'</b></font>';
break;
case"strike":
$bouns_dmg=$bot['lvl']*50;
$say.='<b><font color="gold">'.$bot['login'].'</b> использовал "мощьный удар" <b>-'.$bouns_dmg.'</b> <b>'.$ebot['login'].'</b></font>';
$dmg+=$bouns_dmg;
break;
case"heads":
mysql_query("UPDATE users SET hp_now=hp_now*'0.1' WHERE b_id='$bot[b_id]' AND team!='$bot[team]'");
$say.='<b><font color="gold">'.$bot['login'].'</b> использовал "Огонь с трех голов" <font color="red">-90% Здоровья противникам</font>';
Прочитал про мемкэш, но не нашел нормальной инфы, может "духи онлайн" помогут)
Проблема в том, что не охото каждый раз делать кучу запросов к базе, по этому хочу хранить ботов в мемкеше, но нужно как то в файле ботов сортировать кто из врагов бот в этом бою.
Сначала думал сделать $key_name=$user['b_id'].'bot'; но тогда возникает вопрос - нужно ли ботов вообще хранить в базе в таком случае или можно оперировать данными с мемки?
esterio
Отправлено: 04 Апреля, 2014 - 19:22:32
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
включитк и посмотрите лог длительных запроссов в mysql, может будет лучше оптимизировать сами запроссы
VeNick
Отправлено: 04 Апреля, 2014 - 19:24:14
Новичок
Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Помог: 1 раз(а)
включал разумеется, все равно не вариант. Бои быстрые если 5х5 а к примеру 20х20 уже не вариант, база сильно захламлена получается, дажи при учете что если бот умирает, то он удаляется из базы. Многие боты кронами создаются каждые пол часа относительно уровней, не всегда могут участвовать в бою и остаются в базе(
esterio
Отправлено: 04 Апреля, 2014 - 19:38:36
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
а вы не пробовали использовать сокеты и node.js, как по мне самое удачное решение в данном случае вышло бы
VeNick
Отправлено: 04 Апреля, 2014 - 19:54:25
Новичок
Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014
Помог: 1 раз(а)
фишка в том, что игра под телефоны, как показала статистика, все ещё 20% пользователей имеют ошибки при расположении js в скриптах, так что что б охватить всю аудиторию, приходится выкручиваться как могу(
lastdays
Отправлено: 04 Апреля, 2014 - 22:04:11
Частый гость
Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013
Помог: 7 раз(а)
Приведите код в нормальный вид:
Уйти от использовании MYSQL .
Оптимизировать запросы, избавится от этого :
$test_bot=mysql_fetch_array(mysql_query("SELECT * FROM users WHERE rank='бот' AND hp_now>0 AND b_id='$user[b_id]' order by rand() limit 1"));
Order by rand - опасная затея в данном случае.
Это при каждом обновлении страницы дергаются ВСЕ данные с таблицы users с ранком bot.
Лучше реализовать иначе: В туже сессию сделать запись (1 запись / 1 запрос при выборке)
protivnik -> id_bot
и по сессии единожды проверять противника, жив он , без постоянных order by rand .
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
lastdays пишет:
Уйти от использовании MYSQL .
Варианты?
lastdays пишет:
избавится от этого :
SELECT * FROM
Что здесь плохого?
lastdays пишет:
Мемкеш не создан для того, чтоб держать там объемные данные.
А что создано?
lastdays пишет:
Оптимизировать запросы
Тут согласен
lastdays
Отправлено: 04 Апреля, 2014 - 22:14:05
Частый гость
Покинул форум
Сообщений всего: 221
Дата рег-ции: Март 2013
Помог: 7 раз(а)
Варианты : (это же очевидно, mysql устарел) Pdo, mysqli
Плохого в выборке всех полей с громоздкой таблицы, вы серьёзно думаете что в этом ничего такого нет?
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
lastdays пишет:
Варианты : (это же очевидно, mysql устарел) Pdo, mysqli
Так пишите что имели ввиду драйвер. а то я подумал саму БД
lastdays пишет:
Плохого в выборке всех полей с громоздкой таблицы, вы серьёзно думаете что в этом ничего такого нет?
Не всегда
еесли три поля id, name, pass то економия на спичках. А если полей мноо, то есть нормализация. А еще если есть много BLOB-ов - то есть денормализация
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.