file_get_contents i api

file_get_contents i api
MO
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 4 lata
  • Postów:34
0

Witam niedawno pisałem tutaj w sprawie optymalizacji skryptu, który dosyć wolno działa. Otrzymałem odpowiedź, że najlepiej zmniejszyć liczbę zapytań, które są wykonywane w celu pobrania danych z api. Niestety dowiedziałem się, że jest to chyba nie możliwe, przez co strona wykonuje ponad 100 pętli do pobrania danych używając file_get_contents. Próbowałem przyspieszyć skrypt używając multi cURL, ale niestety API, z którego chce skorzystać wyrzuca błędy przy 100 zapytaniach na raz. Udaje mu się zaledwie z 15/20 żądaniami. Stąd pytanie da się to jakoś inaczej zrobić? Żeby było chociaż trochę szybciej. Obecnie zrobiłem, że długo czeka pierwsza osoba, która wejdzie na daną stronę, bo dla reszty dane są już z mojej bazy danych, ale niestety muszą być one często aktualizowane, więc wolałbym skrócić czas oczekiwania.

Kopiuj
for($x=0; $x < $liczba_czlonkow_klanu; $x+1){
        		  foreach ($decodedJson['data'] as $klan_info) {
        			$gracz = $klan_info['members'][$x]['account_name'];
        			$gracz_id = $klan_info['members'][$x]['account_id'];
        			$player_point = file_get_contents('https://api.worldoftanks.eu/wot/globalmap/eventaccountinfo/?application_id=id&account_id='.$gracz_id.'&event_id=fire_trail&front_id=fire_trail_bg&fields=events.battles%2C+events.fame_points%2C+events.rank%2C+events.updated_at');
        			$decodedpoints = json_decode($player_point, true);
        			foreach ($decodedpoints['data'] as $player_points) {
        			  $punkty_gracza = $player_points['events']['fire_trail'][0]['fame_points'];
        			  $position = $player_points['events']['fire_trail'][0]['rank'];
        			  $updated_at = $decodedtest['data'][1]['updated_at'];
        			  $battles = $player_points['events']['fire_trail'][0]['battles'];
        			  $tablica[] = array('nick'=> $gracz, 'punkty'=> $punkty_gracza, 'pozycja'=> $position, 'bitwy'=>$battles, 'updated'=>$updated_at);
        			}
        			$x = $x+1;
        		  }
        		}
edytowany 1x, ostatnio: mordkaje
serek
  • Rejestracja:około 11 lat
  • Ostatnio:około 7 godzin
  • Postów:1475
0

Eeee...

Kopiuj
(int) $punkty_gracza = $player_points['events']['fire_trail'][0]['fame_points'];

Przecież to nic nie robi. Jak już to powinno być coś w stylu:

Kopiuj
$punkty_gracza = (int) $player_points['events']['fire_trail'][0]['fame_points'];

A co do prędkości, nie będzie szybciej, gdy użyjesz curla?

EDIT:

curla próbowałem użyć. Przy pojedynczych zapytaniach nie było różnicy lub było gorzej, a przy multi wywalało błąd bo za dużo żądań na raz -

Po każdym zapytaniu daj sleep na parę ms.

edytowany 2x, ostatnio: serek
MO
być może, dzięki za info, ale nie o to mi chodziło w pytaniu.
MO
curla próbowałem użyć. Przy pojedynczych zapytaniach nie było różnicy lub było gorzej, a przy multi wywalało błąd bo za dużo żądań na raz
drorat1
To API ma swoje limity, max 20 req./s i 10 req./s z jednego IP, tam wszystko pisze w dokumentacji. Nic więc dziwnego że się wywala przy wszelkich próbach odpytywania w pętlach czy multi zapytaniach. Prosta ochrona antiflood przed działaniami w celu destabilizacji API.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.