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 :: Memcache

 PHP.SU

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


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

> Описание: Помогите пожалуйста
VeNick
Отправлено: 04 Апреля, 2014 - 19:20:01
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


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




Доброго времени суток, столкнулся с проблемой нагрузки на сервер. Причина ясна - слишком много записей пользователей, тяжелые запросы к мускулу.
Сайт - игра, боты бьют с интервалами в 10 секунд(при обновлении страницы подключаю файл bots.php)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ///боты
  4.  
  5. $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"));
  6. if($test_bot['time_right'] != $battle['b_start'])
  7. {
  8. mysql_query("UPDATE users SET time_right='$battle[b_start]', time_left='$time' WHERE b_id='$user[b_id]' AND rank='бот'" );
  9. }
  10. if($$battle['b_class'] == "holy")
  11. {
  12. $botss=mysql_query("SELECT * FROM users WHERE rank='бот' AND time_left<'$time' AND hp_now>0 AND h_wave='$user[h_wave]' AND b_id='$user[b_id]'");
  13. }
  14. else
  15. {
  16. $botss=mysql_query("SELECT * FROM users WHERE rank='бот' AND time_left<'$time' AND hp_now>0 AND b_id='$user[b_id]'");
  17. }
  18. if(mysql_num_rows($botss) > 0)
  19. {
  20. while($bot=mysql_fetch_array($botss))
  21. {
  22.         $last_strike=$time-$bot['time_left'];
  23.         $count_strikes=floor($last_strike/15);
  24.         $new_time_s=$bot['time_left']+$count_strikes*15;
  25.         if($count_strikes > 2)
  26.         {
  27.         mysql_query("UPDATE users SET time_left='$time' WHERE id='$bot[id]'");
  28.         }
  29.         else
  30.         {
  31.         if($count_strikes > 0)
  32.         {
  33.                 $say='';
  34.                 mysql_query("UPDATE users SET time_left='$new_time_s' WHERE id='$bot[id]'");
  35.         for($i=1;$i<=$count_strikes;$i++)
  36.         {
  37.                 $mdmg=0;
  38.                         $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"));
  39.                                 if($ebot['live_end'] < $time)
  40.                                 {
  41.                                 $kr=rand(0,500);
  42.                                 $uv=rand(0,500);
  43.                                 $u_kr=$bot['dex']/4;
  44.                                 $e_uv=$ebot['agl']/4;
  45.                                 if($e_uv > 70)
  46.                                 {                               $e_uv=70;
  47.                                 }
  48.                                 if($u_kr > 70)
  49.                                 {
  50.                                 $u_kr=70;
  51.                                 }
  52. $anti_kr=ceil($ebot['agl']/50);
  53. $anti_uv=ceil($bot['dex']/50);
  54. if($anti_kr > 50)
  55. {
  56.         $anti_kr=50;
  57. }
  58. if($anti_uv > 50)
  59. {
  60.         $anti_uv=50;
  61. }
  62. $e_uv-=$anti_uv;
  63. $u_kr-=$anti_kr;
  64.                                 $min_dmg=ceil($bot['str']*3*0.7);
  65.                                 $max_dmg=ceil($bot['str']*3*1.3);
  66.                                 $s_dmg=rand($min_dmg,$max_dmg);
  67.                                 $dmg=$s_dmg - $ebot['armor']*3;
  68.                                 if($dmg < 0 && $ebot['lvl'] <= $bot['lvl'])
  69.                                 {
  70.                                 $dmg=5;
  71.                                 }
  72.                                 if($dmg <= 0 && $ebot['lvl'] > $bot['lvl'])
  73.                                 {
  74.                                 $dmg=15;
  75.                                 }
  76.                 $mdmg=ceil(($bot['str']*3)*($bot['mgmg']/100));
  77.                                 if($ebot['suit'] == "Паладина")
  78.                                 {
  79.                         $dmg*=0.5;
  80.                                 }
  81.                                 elseif($ebot['suit'] == "Легионера")
  82.                                 {
  83.                                 $dmg*=0.75;
  84.                                 }
  85.                                 elseif($ebot['suit'] == "Охотника")
  86.                                 {
  87.                                 $dmg*=0.3;
  88.                                 }
  89.                                 if($ebot['suit'] == "Наместника")
  90.                                 {
  91.                         $dmg*=0.15;
  92.                                 }
  93.                                 if($ebot['mf_dmg'] > 0)
  94.                         {
  95.                                 $dmg=ceil($dmg-$dmg*($ebot['mf_dmg']/100));
  96.                         }
  97.                                         if($e_uv < $uv)
  98.                                 {
  99.  
  100.                         if($u_kr > $kr)
  101.                                         {
  102.                                 $dmg = $dmg*2;
  103.                         $chanse_travma=10;
  104.                         $lvl_travma=rand(1,5);
  105.                         $rand_travma=rand(1,100);
  106.                         if($rand_travma <= $chanse_travma)
  107.                         {
  108.                                 $say.=travma($bot['login'],$ebot['login'],$lvl_travma);
  109.                         }
  110.                                 $say.='<b>'.$bot['login'].'</b>, сделав критический удар, нанес <b><font color="#FF0000"> '.$dmg.' </font></b><font color="blue">-'.$mdmg.'</font> урона <b>'.$ebot['login'].'</b>';
  111.                                         }
  112.                                         else
  113.                                         {
  114.                         $magic='';
  115.  
  116.                         $st_dmg=$dmg;
  117.                         if($bot['wind'] > 0 || $bot['water'] > 0 || $bot['fire'] > 0 || $bot['land'] > 0 )
  118.                         {
  119.                         if($ebot['religion'] != "")
  120.                         {
  121.                         $religion=mysql_fetch_array(mysql_query("SELECT * FROM relogion WHERE name='$ebot[religion]'"));
  122.                         $fi_def=$religion['fire'];
  123.                         $wi_def=$religion['wind'];
  124.                         $wa_def=$religion['water'];
  125.                         $la_def=$religion['land'];
  126.                         }
  127.                         else
  128.                         {
  129.                         $fi_def=0;
  130.                         $wi_def=0;
  131.                         $wa_def=0;
  132.                         $la_def=0;
  133.                         }
  134.                         if($ebot['mf_fire'] > 0)
  135.                         {
  136.                                 $fi_def+=$ebot['mf_fire'];
  137.                         }
  138.                         if($ebot['mf_wind'] > 0)
  139.                         {
  140.                                 $wi_def+=$ebot['mf_wind'];
  141.                         }
  142.                         if($ebot['mf_water'] > 0)
  143.                         {
  144.                                 $wa_def+=$ebot['mf_water'];
  145.                         }
  146.                         if($ebot['mf_land'] > 0)
  147.                         {
  148.                                 $la_def+=$ebot['mf_land'];
  149.                         }
  150.                         $resi_baf=mysql_query("SELECT * FROM bafs WHERE owner='$ebot[login]' AND name='Малая защита от стихий'");
  151.                         if(mysql_num_rows($resi_baf) > 0)
  152.                         {
  153.                                 $fi_def+=30;
  154.                                 $wi_def+=30;
  155.                                 $wa_def+=30;
  156.                                 $la_def+=30;
  157.                         }
  158.                         $resi_baf2=mysql_query("SELECT * FROM bafs WHERE owner='$ebot[login]' AND name='Средняя защита от стихий'");
  159.                         if(mysql_num_rows($resi_baf2) > 0)
  160.                         {
  161.                                 $fi_def+=50;
  162.                                 $wi_def+=50;
  163.                                 $wa_def+=50;
  164.                                 $la_def+=50;
  165.                         }
  166.                         $resi_baf3=mysql_query("SELECT * FROM bafs WHERE owner='$ebot[login]' AND name='Большая защита от стихий'");
  167.                         if(mysql_num_rows($resi_baf3) > 0)
  168.                         {
  169.                                 $fi_def+=100;
  170.                                 $wi_def+=100;
  171.                                 $wa_def+=100;
  172.                                 $la_def+=100;
  173.                         }
  174.                         if($ebot['guild_name'] == "Повелители огня")
  175.                         {                       $fi_def+=3*$ebot['guild_rank'];
  176.                         }
  177.                         if($ebot['guild_name'] == "Повелители воздуха")
  178.                         {
  179.                         $wi_def+=3*$ebot['guild_rank'];
  180.                         }
  181.                         if($ebot['guild_name'] == "Повелители воды")
  182.                         {
  183.                         $wa_def+=3*$ebot['guild_rank'];
  184.                         }
  185.                         if($ebot['guild_name'] == "Повелители земли")
  186.                         {
  187.                         $la_def+=3*$ebot['guild_rank'];
  188.                         }
  189.                         $dmg_mf=0;
  190.                         if($bot['fire'] > 0)
  191.                         {
  192.                                 $fi_ef=$bot['fire']-$fi_def;
  193.                                 if($fi_ef > 0)
  194.                                 {
  195.                                         $fi_damage=ceil($st_dmg*$fi_ef/100);
  196.                                         $dmg_mf+=$fi_damage;
  197.                                         $magic .='<font color="gold">-'.$fi_damage.'<img src="s/fire.png"></font> ';
  198.                                 }
  199.                         }
  200.                         if($bot['wind'] > 0)
  201.                         {
  202.                                 $wi_ef=$bot['wind']-$wi_def;
  203.                                 if($wi_ef > 0)
  204.                                 {
  205.                                         $wi_damage=ceil($st_dmg*$wi_ef/100);
  206.                                         $dmg_mf+=$wi_damage;
  207.                                         $magic .='<font color="gold">-'.$wi_damage.'<img src="s/wind.png"></font> ';
  208.                                 }
  209.                         }
  210.                         if($bot['water'] > 0)
  211.                         {
  212.                                 $wa_ef=$bot['water']-$wa_def;
  213.                                 if($wa_ef > 0)
  214.                                 {
  215.                                         $wa_damage=ceil($st_dmg*$wa_ef/100);
  216.                                         $dmg_mf+=$wa_damage;
  217.                                         $magic .='<font color="gold">-'.$wa_damage.'<img src="s/water.png"></font> ';
  218.                                 }
  219.                         }
  220.                         if($bot['land'] > 0)
  221.                         {
  222.                                 $la_ef=$bot['land']-$la_def;
  223.                                 if($la_ef > 0)
  224.                                 {
  225.                                         $la_damage=ceil($st_dmg*$la_ef/100);
  226.                                         $dmg_mf+=$la_damage;
  227.                                         $magic .='<font color="gold">-'.$la_damage.'<img src="s/land.png"></font> ';
  228.                                 }
  229.                         }
  230.                 }
  231.  
  232.  
  233.                                         $rand=rand(0,2);
  234.                                         switch ($rand) {
  235.                                                 case 0:
  236.                                 $text=' ударил на ';
  237.                                         break;
  238.                                                 case 1:
  239.                                 $text=' врезал на ';
  240.                                         break;
  241.                                                 case 2:
  242.                                 $text=' нападал на ';
  243.                                         break;
  244.                                                 }
  245.                                 $say.='<b>'.$bot['login'].'</b>'.$text.'<font color="#FF0000"> '.$dmg.' </font><font color="blue">-'.$mdmg.'</font> '.$magic.' урона <b>'.$ebot['login'].'</b>';
  246.                                         }
  247.                                         if($ebot['race'] == "Инас")
  248.                                         {
  249.                                         $back_dmg=ceil($dmg*(($ebot['inas_lvl']+5)/100));
  250.                                         if($back_dmg >= $bot['hp_now'])
  251.                                         {
  252.                                                 $back_dmg=$bot['hp_now']-1;
  253.                                         }
  254.                                                 mysql_query("UPDATE users SET hp_now=hp_now-'$back_dmg' WHERE id='$bot[id]'");
  255.                                                 $say.='<br /><font color="red"><b>'.$bot['login'].'</b> обжогся на <u>-'.$back_dmg.'</u> от <b>'.$ebot['login'].'</b></font>';
  256.  
  257.                                         }
  258.                                         $dmg+=$dmg_mf;
  259.                                 }
  260.                                 else
  261.                                 {
  262.                                 $say.='<b>'.$bot['login'].'</b> пытался нанести урон врагу, но промахнулся';
  263.                                 $dmg=0;
  264.                                 }
  265.                                 $skill_test=mysql_query("SELECT * FROM `bot_skills` WHERE `class`='$bot[class]'");
  266.                                 if(mysql_num_rows($skill_test) == 1)
  267.                                 {                                       $skill=mysql_fetch_array($skill_test);
  268.                                         $chanse=rand(1,100);
  269.                                         if($chanse <= $skill['chanse'] && $ebot['rank'] != "бот")
  270.                                         {                                               switch ($skill['func']) {
  271.                                                         case "fireball":
  272.                             $bouns_dmg=$bot['str']*6;
  273.                                                         $say.='<br /><b><font color="gold">'.$bot['login'].'</b> использовал "удар огнём" -'.$bouns_dmg.'<img src="s/fire.png"> на <b>'.$ebot['login'].'</b></font>';
  274.                             $dmg+=$bouns_dmg;
  275.                                                 break;
  276.                                                         case "stun":
  277.                             $time_end=$bot['lvl']+$time;
  278.                             mysql_query("
  279.                                                         INSERT INTO `bafs` ( `id` , `name` , `t_end` , `str` , `agl` , `dex` , `func` , `owner` )
  280.                                                         VALUES (
  281.                                                         '', 'Оглушающий удар', '$time_end', '0', '0', '0', 'stun', '$ebot[login]'
  282.                                                         )
  283.                                                         ");
  284.                                                         $say.='<br /><b><font color="gold">'.$bot['login'].'</b> использовал "оглушающий удар" и оглушил <b>'.$ebot['login'].'</b> на <b>'.$bot['lvl'].'</b> секунд</font>';
  285.                                                 break;
  286.                                                 case "dearmor":
  287.                             $time_end=$time+15;
  288.                             $value=$bot['lvl']*5;
  289.                             $double=$value*2;
  290.                             $armor=$value-$double;
  291.                             mysql_query("
  292.                                                         INSERT INTO bafs SET
  293.                                                         armor='$armor',
  294.                                                         name='Корозия',
  295.                                                         t_end='$time_end',
  296.                                                         func='dearmor',
  297.                                                         owner='$ebot[login]'
  298.                                                         ");
  299.                                                         mysql_query("UPDATE users SET armor=armor+'$armor' WHERE id='$ebot[id]'");
  300.                                                         $say.='<br /><b><font color="gold">'.$bot['login'].'</b> использовал "корозию" и уменьшил броню <b>'.$ebot['login'].'</b> на <b>'.$armor.'</b></font>';
  301.                                                 break;
  302.                                                         case "strike":
  303.                             $bouns_dmg=$bot['lvl']*50;
  304.                                                         $say.='<b><font color="gold">'.$bot['login'].'</b> использовал "мощьный удар" <b>-'.$bouns_dmg.'</b> <b>'.$ebot['login'].'</b></font>';
  305.                             $dmg+=$bouns_dmg;
  306.                                                 break;
  307.                                                 case "heads":
  308.                                                         mysql_query("UPDATE users SET hp_now=hp_now*'0.1' WHERE b_id='$bot[b_id]' AND team!='$bot[team]'");
  309.                                                         $say.='<b><font color="gold">'.$bot['login'].'</b> использовал "Огонь с трех голов" <font color="red">-90% Здоровья противникам</font>';
  310.                                                 break;
  311.                                                         }
  312.                                         }
  313.                                 }
  314.                                 $uron=$dmg+$mdmg;
  315.                                 if($bot['satus_pl'] == "Питомец")
  316.                                 {
  317.                                         $exp_b=ceil($uron/5);
  318.                         $new_exp=$bot['exp']+$exp_b;
  319.                         mysql_query("UPDATE users SET exp='$new_exp' WHERE id='$bot[id]'");
  320.                                 }
  321.                                 mysql_query("UPDATE users SET hp_now=hp_now-'$uron' WHERE id='$ebot[id]'");
  322.                         }
  323.                     mysql_query("
  324. INSERT INTO `logs` ( `id` , `b_id` , `who` , `text` )
  325. VALUES (
  326. '', '$user[b_id]', '', '$say'
  327. )");
  328.  
  329.         }
  330.         }
  331.         }
  332.  
  333. }
  334. }
  335.  
  336. //окончание ботов
  337. ?>
  338.  



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

Сначала думал сделать $key_name=$user['b_id'].'bot'; но тогда возникает вопрос - нужно ли ботов вообще хранить в базе в таком случае или можно оперировать данными с мемки?
 
 Top
esterio
Отправлено: 04 Апреля, 2014 - 19:22:32
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




включитк и посмотрите лог длительных запроссов в mysql, может будет лучше оптимизировать сами запроссы
 
 Top
VeNick
Отправлено: 04 Апреля, 2014 - 19:24:14
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


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




включал разумеется, все равно не вариант. Бои быстрые если 5х5 а к примеру 20х20 уже не вариант, база сильно захламлена получается, дажи при учете что если бот умирает, то он удаляется из базы. Многие боты кронами создаются каждые пол часа относительно уровней, не всегда могут участвовать в бою и остаются в базе(
 
 Top
esterio
Отправлено: 04 Апреля, 2014 - 19:38:36
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




а вы не пробовали использовать сокеты и node.js, как по мне самое удачное решение в данном случае вышло бы
 
 Top
VeNick
Отправлено: 04 Апреля, 2014 - 19:54:25
Post Id


Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Янв. 2014  


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




фишка в том, что игра под телефоны, как показала статистика, все ещё 20% пользователей имеют ошибки при расположении js в скриптах, так что что б охватить всю аудиторию, приходится выкручиваться как могу(
 
 Top
lastdays
Отправлено: 04 Апреля, 2014 - 22:04:11
Post Id



Частый гость


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


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




Приведите код в нормальный вид:

Уйти от использовании MYSQL .
Оптимизировать запросы, избавится от этого :

Арендовать более мощный сервер.

В браузерных играх наиболее трудоемкие места -> бои -> чат.
Мемкеш не создан для того, чтоб держать там объемные данные.

Если Вы зарабатываете на этом, то наверно стоит не поскупится и чуть вложить? консультация специалистов, нанять на работу программиста. Не?






Не много по коду:

Взял первую строчку
PHP:
скопировать код в буфер обмена
  1.  
  2. $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"));
  3.  


Order by rand - опасная затея в данном случае.
Это при каждом обновлении страницы дергаются ВСЕ данные с таблицы users с ранком bot.
Лучше реализовать иначе: В туже сессию сделать запись (1 запись / 1 запрос при выборке)
protivnik -> id_bot
и по сессии единожды проверять противника, жив он , без постоянных order by rand .
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT `id_bot`,`hp` FROM `users` WHERE `id_bot` = ? and `hp`>? LIMIT 1
  3.  

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

НАДЕЮСЬ мысль объяснил внятно.

(Отредактировано автором: 04 Апреля, 2014 - 22:12:11)

 
 Top
esterio
Отправлено: 04 Апреля, 2014 - 22:08:22
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




lastdays пишет:
Уйти от использовании MYSQL .

Варианты?
lastdays пишет:
избавится от этого :
SELECT * FROM

Что здесь плохого?
lastdays пишет:
Мемкеш не создан для того, чтоб держать там объемные данные.

А что создано?
lastdays пишет:
Оптимизировать запросы

Тут согласен
 
 Top
lastdays
Отправлено: 04 Апреля, 2014 - 22:14:05
Post Id



Частый гость


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


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




Варианты : (это же очевидно, mysql устарел) Pdo, mysqli
Плохого в выборке всех полей с громоздкой таблицы, вы серьёзно думаете что в этом ничего такого нет?

(Отредактировано автором: 04 Апреля, 2014 - 22:17:51)

 
 Top
esterio
Отправлено: 04 Апреля, 2014 - 23:37:21
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




lastdays пишет:
Варианты : (это же очевидно, mysql устарел) Pdo, mysqli

Так пишите что имели ввиду драйвер. а то я подумал саму БД
lastdays пишет:
Плохого в выборке всех полей с громоздкой таблицы, вы серьёзно думаете что в этом ничего такого нет?

Не всегда
еесли три поля id, name, pass то економия на спичках. А если полей мноо, то есть нормализация. А еще если есть много BLOB-ов - то есть денормализация
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB