вопрос знающим php, ниже приведен рабочий код, но он очень сильно долго грузится, есть ли возможность его как-то оптимизировать для ускорения загрузки... на сортировку внимание не обращайте она не работает... работу скрипта можно увидеть http://uadd-clans.tk/sostav_clana_new3.php Код (PHP): <?php header("Content-type: text/html; charset=utf-8"); $clan_id = '145563'; $appid = "demo"; $urlID = "http://api.worldoftanks.ru/wgn/clans/info/?application_id=$appid&language=ru&clan_id=".$clan_id; //ссылка на json $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlID); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $resultID = json_decode(curl_exec($curl), true); function GetRoleWeight($role) { switch($role) { case "commander": return 11; case "executive_officer": return 10; case "personnel_officer": return 9; case "combat_officer": return 8; case "intelligence_officer": return 7; case "quartermaster": return 6; case "recruitment_officer": return 5; case "junior_officer": return 4; case "private": return 3; case "recruit": return 2; case "reservist": return 1; default: die("Неизвестная роль $role" ); } } function cmp($a, $b) { return GetRoleWeight($b["role"])>GetRoleWeight($a["role"]); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru"> <head> <meta charset="windows-1251"> <link rel="stylesheet" href="http://uadd-clans.tk/css/style.css" type="text/css" media="screen"> <title>Список клана</title> <style> table.tablesorter { font-family:arial; background-color: #CDCDCD; margin:10px 0pt 15px; font-size: 8pt; width: 100%; text-align: left; } table.tablesorter thead tr th, table.tablesorter tfoot tr th { background-color: #e6EEEE; border: 1px solid #FFF; font-size: 8pt; padding: 4px; } table.tablesorter thead tr .header { background-image: url(bg.gif); background-repeat: no-repeat; background-position: center right; cursor: pointer; } table.tablesorter tbody td { color: #3D3D3D; padding: 4px; background-color: #FFF; vertical-align: top; } table.tablesorter tbody tr.odd td { background-color:#F0F0F6; } table.tablesorter thead tr .headerSortUp { background-image: url('data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7'); } table.tablesorter thead tr .headerSortDown { background-image: url('data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7'); } table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { background-color: #8dbdd8; } </style> <script type="text/javascript" src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.2.min.js"></script> <script type="text/javascript" src="//cdn.ucb.org.br/Scripts/tablesorter/jquery.tablesorter.min.js"></script> <script type="text/javascript"> $(document).ready(function() { // теперь по умолчанию у нас всегда будет запускаться виджет зебра $.tablesorter.defaults.widgets = ['zebra']; // теперь по умолчанию всегда будем сортировать по первой колонке $.tablesorter.defaults.sortList = [[3,1]]; // вызов плагина $("table").tablesorter(); }); </script> <style> .num { font-size: 17px; font-weight: bold; } .op2 { font-size: 11pt; font-weight: bold; color: #ffffff; } </style> </head> <body style="margin: 0; padding: 0;"> <table border="0" cellpadding="0" cellspacing="0" width="840" style="border: 4px solid #3e4156;"> <tr><td bgcolor="#3E4156" height="23"><span class="op2">СОСТАВ КЛАНА UA_DD</span></td></tr> <tr><td> <table class="tablesorter" cellspacing="1" style="width: 800px;"> <thead> <tr> <th>Имя</th> <th>Кол. боев</th> <th>% побед</th> <th>Рейтинг WG</th> <th>Дней в клане</th> <th>Звание</th> </tr> </thead> <tbody> <?php foreach($resultID['data'][$clan_id]['members'] as $key => $val){ $new_time = date('Y.m.d',$val['joined_at']); usort($resultID['data'][$clan_id]['members'], "cmp" ); ?> <tr> <td><?php echo $val['account_name']; ?></td> <td> <?php $account_id = $val['account_id']; $urlstat = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=battles_count&type=all&account_id=".$account_id; //ссылка на json $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstat); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_battles = json_decode(curl_exec($curl), true); foreach($rating_battles['data'] as $key => $val_battles); echo $val_battles['battles_count']['value']; ?></td> <td> <?php $account_id = $val['account_id']; $urlstattt = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=wins_ratio&type=all&account_id=".$account_id; //ссылка на json $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstattt); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_wins = json_decode(curl_exec($curl), true); foreach($rating_wins['data'] as $key => $val_wins); echo $val_wins['wins_ratio']['value']; ?>% </td> <td> <?php $account_id = $val['account_id']; $urlstatt = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=global_rating&type=all&account_id=".$account_id; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstatt); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_global = json_decode(curl_exec($curl), true); foreach($rating_global['data'] as $key => $val_global); echo $val_global['global_rating']['value']; ?></td> <td><?php echo round((strtotime(date("Y-m-d H:i:s")) - $val['joined_at'])/(3600*24)); ?></td> <td><?php echo $val['role_i18n']; ?></td> </tr> <?php } ?> </tbody> </table> <p class="num">Всего игроков: <?php echo $resultID['data'][$clan_id]['members_count'] ?></p> </td> </tr> </table> </body> </html> отвечу на все вопросы
Только на серваке внешнем, или на локалке тоже по минуте отвечает? Если на локалке ок, то меняй хостинг. xdebug есть? Трейсинг им сделай, чтобы посмотреть, куда отжирается время. Это на вскидку, чем ты сам себе можешь помочь. Сам код изучать, увы, нет времени сейчас. Добавлено спустя 2 минуты 18 секунд: API танчиков, кстати, как долго отвечает, замерял? Если нет, замерь. Быть может, это оно меньжуется хрен знает сколько. В таком случае, результаты нужно сохранять при запросе. И выводить именно сохраненные. А новые по тому же крону получать раз в N времени.
с этим проблем нет, ответы быстрые... а вот с количеством запросов тута "беда", их много получается... я так понимаю, здесь необходимо каким-то образом объединить все запросы и "скопом" их отправить.. но как это реализовать ума не приложу...
в теле HTML $account_id = $val['account_id']; каждому никнейму присваиваем ID, и делаем отдельный запрос, одно значение (допустим количество игр) = один запрос... Код (PHP): <?php $account_id = $val['account_id']; $urlstat = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=battles_count&type=all&account_id=".$account_id; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstat); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_battles = json_decode(curl_exec($curl), true); foreach($rating_battles['data'] as $key => $val_battles); echo $val_battles['battles_count']['value']; ?> PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Ну тогда ты ударяешься о таймаут сервера танчиков, который так борется со спамом. Грубо говоря, следующий запрос от тебя он обработает только спустя пару секунд от предыдущего. Вот и жует твой скрипт полторы минуты список. Кланы в игре официально есть? Посмотри именно клановый API, а не по учеткам. Я как-то c API eve-online работал, там через ID корпорации(клана), можно было за один раз вытаскивать всю инфу по персам.
мда... шутки я конечно тоже люблю... но смысл с ее здесь? или таким способом набиваешь счетчик сообщений, чтобы думали мол авторитетный php-гуру??? помог бы лучше оптимизировать... клановый API есть, он выдает только никнейм игрока и его ID, соотвецтвенно вся инфа по определенному ID лежит в другом запросе API - "http://api.worldoftanks.ru/wgn/clans/info/?application_id=$appid&language=ru&clan_id=".$clan_id; - "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=battles_count&type=all&account_id=".$account_id;
Ну тогда, как я выше советовал, кешируй данные. И обновляй не в рилтайме. Можно, например, раз в 5 минут обновлять кого-то одного. То есть, табличка не будет прям устаревать за день.
если записать все данные цыкла (имя игрока - кол. игор - и т.д.) Код (Text): file_put_contents('data1.txt', $val['account_name'], FILE_APPEND); в файл, оно записывает все в одну строчку, получается Код (Text): baron80_802236251.977485PositiveGame1771858.048353dune20041650751.086077LionZT1760450.425483streamers877349.744610Maestro141586449.765624Daily2224949.275259ADS1045529652.437278Gordey1232547250.155687sasukeuzumaki1961552.16216Yastremski293444652.777544Balaganoff2462850.345635DAnTE171381953.387049hachkolya2062149.624722Fekashyk714453.296795batya18934387253.348505jurastar1929650.075804eva193134751.47276PjKuz1301653.496619DieSeL_1202372049.35945 и т.д. как его теперь правильно с файла прочитать?
не понял фразу((( хотелось бы результат получить Код (Text): [id1] { кол. игор: значение, % побед: значение, и т.д.: значение, } [id2] { кол. игор: значение, % побед: значение, и т.д.: значение, } у кого какие мысли по этому поводу будут?
Покажите, что будет на выводе: Код (PHP): var_dump($val['account_name']); А лучше Код (PHP): var_dump($val); Мне просто кажется, что следовало бы добавить: Код (PHP): file_put_contents('data1.txt', $val['account_name']."\n", FILE_APPEND);
показую: Код (Text): array(5) { ["role"]=> string(7) "recruit" ["role_i18n"]=> string(20) "Новобранец" ["joined_at"]=> int(1420654201) ["account_id"]=> int(163923) ["account_name"]=> string(10) "baron80_80" } array(5) { ["role"]=> string(7) "private" ["role_i18n"]=> string(8) "Боец" ["joined_at"]=> int(1437924317) ["account_id"]=> int(178588) ["account_name"]=> string(12) "PositiveGame" } array(5) { ["role"]=> string(9) "reservist" ["role_i18n"]=> string(18) "Резервист" ["joined_at"]=> int(1414785888) ["account_id"]=> int(215777) ["account_name"]=> string(8) "dune2004" } array(5) { ["role"]=> string(7) "private" ["role_i18n"]=> string(8) "Боец" ["joined_at"]=> int(1431968079) ["account_id"]=> int(326977) ["account_name"]=> string(6) "LionZT" } и т.д... а что оно дает? не понйму... а вот с ."\n", уже получается интересно: Код (Text): baron80_80 22362 51.97 7485 PositiveGame 17718 58.04 8353 dune2004 16507 51.08 6077 результат вроде-бы добротный, но вот как его теперь из файла вытянуть...??? чтобы получилась таблица:..
Дает оно вот что: Код (PHP): <?php $table = '<?xml version="1.0" encoding="UTF-8"?><table>'; foreach($val as $table_row) { $table .= "<tr><td>{$table_row['role']}</td>" . "<td>{$table_row['role_i18n']}</td>" . "<td>{$table_row['joined_at']}</td>" . "<td>{$table_row['account_id']}</td></tr>"; } $table .= '</table>'; echo $table; //или // file_put_contents('table.xml', $table, FILE_APPEND); Названия тегам можно дать и по именам атрибутов. Например: вместо tr - player, потом вместо td - role, role_i18n, joined_at, account_id соответственно...
с этим я с Вами согласен, но это все в одном запросе, его обработать можно и так.. Код (PHP): $urlID = "http://api.worldoftanks.ru/wgn/clans/info/?application_id=$appid&language=ru&clan_id=".$clan_id; Тут суть в другом, 1: получаем список и айди - игроков - делаем запрос - (в данном случаи (можно даже использовать и Ваш вариант)), 2: Код (PHP): $account_id = $val['account_id']; 3: теперь цыклом перебираем (допустим количество игр - игрока) Код (PHP): $urlstat = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=battles_count&type=all&account_id=".$account_id; соответственно таких ссылок у меня уже 85 так как в клане на данный момент 85 игроков... (и это только их количество игр...) добавить сюда %побед + 85 запросов, + рейтинг игрока - еще 85 запросов, итого около 300 запросов к апи танчиков))) соответственно время генерации такого кода очень сильно велико... как выход посоветовали это все дело записывать в файл, и выводить таблицу из него, и кроном запускать скажем раз в день для обновления результатов... а вот с эти у меня уже очень большие проблемы... в Вашем варианте подставить $account_id = $val['account_id']; чтобы была полноценная таблица както возможно???
С этим я так понял проблем нет... Я запутался... Что Вы вкладываете в понятие таблица? Вывод данных в таблицу из XML-файла - это несложная задача. Поиск, замена и т.п. тоже... И вот еще в АПИ Танков есть клановый запрос на все эти данные, но там стоит Значит в один запрос никак. Я правильно понял?
http://uadd-clans.tk/sostav_clana_new3.php - вот эти все данные хотелось бы записать хотя-бы в текстовый файл, и с него отображать, для ускорения отображения результатов... вот с этим у меня большие проблемы...
Может тебе поможет сериализация. Код (PHP): //класс родитель abstract class Registry { abstract protected function get($key); abstract protected function set($key, $val); } Код (PHP): //дочерний класс //если нет автозагрузки то сюда надо инклудить файл с родительским классом class ApplicationRegistry extends Registry { private static $instance; private $freezedir = "data"; private $values = array(); private $mtimes = array(); private function __construct() { } static function instance() { if (!isset(self::$instance)) { self::$instance = new self(); } return self::$instance; } protected function get($key) { $path = $this->freezedir . DIRECTORY_SEPARATOR . $key; if (file_exists($path)) { clearstatcache(); $mtime = filemtime($path); if (!isset($this->mtimes[$key])) { $this->mtimes[$key] = 0; } if ($mtime > $this->mtimes[$key]) { $data = file_get_contents($path); $this->mtimes[$key] = $mtime; return($this->values[$key] = unserialize($data)); } } if (isset($this->values[$key])) { return $this->values[$key]; } return null; } protected function set($key, $val) { $this->values[$key] = $val; $path = $this->freezedir . DIRECTORY_SEPARATOR . $key; file_put_contents($path, serialize($val)); $this->mtimes[$key] = time(); } //десериализация static function getPlayers() { return self::instance()->get('players'); } //сериализация данных об игроках static function setPlayers($players) { return self::instance()->set('players', $players); } } Код (PHP): //Пример как использовать $players = ApplicationRegistry::getPlayers();//получаем данные сериализованные //если нету данных будет возвращен NULL и сработает условие, в итоге мы должны будет обратиться в бд //получить данные и сериализовать if (is_null($players)) { $players = ""; //тут уже получаем данные из базы и сериализуем. ApplicationRegistry::setPlayers($players); $players = ApplicationRegistry::getPlayers(); } Добавлено спустя 10 минут 38 секунд: чтобы данные получить заново из бд, хватает удалить файл из директории data с именем players Добавлено спустя 32 секунды: можно запилить простенький скрипт для удаления и повесить на крон.
Если так нужен текстовый файл, то можно сохранить данные построчно (можно вставить метки) Потом читаете этот же файл построчно http://php.ru/manual/function.fgets.html и записываете в ячейки таблицы Могут возникнуть ошибки, но это лечится... Я бы рекомендовал XML или хотябы использовать какие-то метки типа Так наверное лучше: Код (PHP): [id1]{ кол. игор: значение,% побед: значение,и т.д.: значение} [id2]{ кол. игор: значение,% побед: значение,и т.д.: значение} Считываете строку... Вычленяете с preg_match то что в фигурных скобках... Превращаете строку с функцией explode по символу , в массив... foreach... explode(':', $variable); формируете строку таблицы...
А зачем придумывать свой формат? 1. json_encode/json_decode - формат JSON 2. serialize/unserialize - сериализация, из недостатков - несколько запутанная структура для ручных правок 3. var_export($data) - получаем массив php, который можно сохранить в файл как есть и затем загрузить $data = include "file.php"; Это то что приходит в голову сходу. Кэшируйте отдельно данные, которые меняются крайне редко, а остальное обновляйте с нужной переодичностью. В идеале обновление данных лучше всего повесить на крон, который скажем будет сохранять всё в файлы c json`ом, из которых можно будет сформировать страничку в php или дергать напрямую из браузера рисуя всё там.
romach, алгоритм идеальный, но с реализацией у меня большая проблема... я пока не могу сообразить как мне с помощью json_encode закодировать в такой формат Код (Text): [id1]{ кол. игор: значение,% побед: значение,и т.д.: значение} [id2]{ кол. игор: значение,% побед: значение,и т.д.: значение} все ID я беру из одного запроса, у меня получается список, а вот кол. боев - з другого, % побед - с трейтего запроса, и т.д., и это все в цыкле, теперь склеить его в [id1]{ кол. игор: значение,% побед: значение,и т.д.: значение}, кто может сообразить как из цыкла получить такую структуру....??? может у кого-то завалялся подобный кусочек кода.. Код (PHP): <?php header("Content-type: text/html; charset=utf-8"); $clan_id = '145563'; // идентификатор клана $appid = "a1607bb94d5a3fafcffe36b009332157"; // идентификатор приложения $urlID = "http://api.worldoftanks.ru/wgn/clans/info/?application_id=$appid&language=ru&clan_id=".$clan_id; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlID); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $resultID = json_decode(curl_exec($curl), true); foreach($resultID['data'][$clan_id]['members'] as $key => $val){ echo $val['account_name']; echo "<br>"; //file_put_contents('data1.txt', $val['account_name']."\n", FILE_APPEND); //var_dump($val['account_name']); print_r($masnik); $account_id = $val['account_id']; $urlstat = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=battles_count&type=all&account_id=".$account_id; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstat); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_battles = json_decode(curl_exec($curl), true); foreach($rating_battles['data'] as $key => $val_battles); // file_put_contents('data1.txt', $val_battles['battles_count']['value']."\n", FILE_APPEND); //var_dump($val_battles['battles_count']['value']); echo $val_battles['battles_count']['value']; echo "<br>"; $urlstattt = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=wins_ratio&type=all&account_id=".$account_id; //ссылка на json $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstattt); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_wins = json_decode(curl_exec($curl), true); foreach($rating_wins['data'] as $key => $val_wins); // file_put_contents('data1.txt', $val_wins['wins_ratio']['value']."\n", FILE_APPEND); //var_dump($val_wins['wins_ratio']['value']); echo $val_wins['wins_ratio']['value']; echo "<br>"; $urlstatt = "http://api.worldoftanks.ru/wot/ratings/accounts/?application_id=$appid&fields=global_rating&type=all&account_id=".$account_id; //ссылка на json $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $urlstatt); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $rating_global = json_decode(curl_exec($curl), true); foreach($rating_global['data'] as $key => $val_global); // file_put_contents('data1.txt', $val_global['global_rating']['value']."\n", FILE_APPEND); //var_dump($val_global['global_rating']['value']); echo $val_global['global_rating']['value']; echo "<br>"; } ?>
Этот код надо только поправить немного: Код (PHP): <?php $table = ''; foreach($val as $table_row) { $table .= "[{$table_row['account_id']}]\{" . "кол-во игр:{$table_row['role_i18n']}," . "побед:{$table_row['joined_at']}," . "и т.д.:{$table_row['role']}}\n"; } echo $table; //или // file_put_contents('table.txt', $table, FILE_APPEND); P.S.: Не помню только надо экранировать } или нет?