Playtox, В крон
перед добавлением очищать таблицу и наполнять заново, если нужно только выводить
Mobiaaa, Помоги, как оптимизировать
$allClan = $api->getClanAmounts()['data']['amount'];
$all = 2776;
$max=20;
$itr=round($all/$max,0, PHP_ROUND_HALF_UP);
for($i=0;$i<$itr;$i++)
{
$pos=$i*$max;
$data=$api->getClans($max,$pos)['data']['clans_data'];//часть данных с $pos позиции
if(!$data)exit('данных нет');
foreach($data as $k=>$v)
{
$clanx = $api->getClanInfo($k)['data']['clan_info'];
mysqli_query($con,"INSERT INTO `clans`.`clan` (`id` ,`idClan` ,`name`,`abbreviation`,`level`,`elo`,`creation_time`,`commander_pid`) VALUES ( NULL , '$k', '$v', '$clanx[abbreviation]', '$clanx[level]', '$clanx[elo]', '$clanx[creation_time]', '$clanx[commander_pid]' );"
echo $v ,'</br>';
}
Playtox, Собственно Вот и "узкое горлышко" в Вашем первом варианте, у Вас в цикле дёргается ещё один метод
getClanInfo
Который 99% что делает ещё один запрос к удалённому сайту
Следовательно
1 запрос на листинг + 20 запросов getClanInfo
Что явно быстро не выполнится
Из оптимизации, это если getClanInfo поддерживает "мультизапросы" и возможность вытянуть сразу пачку данных ($max)
Остальное всё экономия на спичках
Mobiaaa, Нет, getClanInfo не поддерживает мультизапросы,
Просто из за долго выполнения время отведённое на запрос увеличивается и часть данных с API не приходит т.к превышен лимит времени, и я хз что делать
Playtox, sleep применить, или данные частями извлекать
Mobiaaa, Покажи как частями можно?
Playtox, например при заборе данных не дёргать getClanInfo
А брать данные клана, когда юзер хочет их увидеть (переходит на страницу клана) и при первом запросе (если данных нет в БД) то писать в базу, если данные есть, то сразу с базы выводить
Mobiaaa, Ок попробую так, через sleep не вышло Maximum execution time of 180 seconds exceeded in
Playtox, Это я не учитывал
Я ориентировался на VDS/Сервер
При этом cron php вызывается НЕ через URL а прямым вызовом php файла
(php -f /var/www/site/cron.php)
При этом можно поставить на старт крона блокировку (например создание файл cron.lock)
При окончании работы cron удалять файл, а при старте проверять, нет ли блокировки
Таким образом можно исключить тот момент, что будет выполнятся два cron задания
Либо пойти более сложным методом и писать в файл pid запущенного процесса php
При старте проверять есть ли файл блокировки + существует ли в системе pid данный
Но это уже более отказоустойчивый вариант
Mobiaaa, А можно как то импортнуть данные всех кланов через цыкл, у меня вить есть id всех кланов