Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] file_get_contents + json_decode - jak wrzucić to do pętli ?
Forum PHP.pl > Forum > Przedszkole
Klycior
Cześć.

Mam pytanko koledzy. Pobieram z bazy danych "hash" który jest dla adresem strony API z którym pobieram jeden parametr.
Czyli np. www.onet.pl/index.php?hash=$hash i dzięki takiemu adresowi pobieram to co mnie interesuje.
$hash pobieram z mojej bazy. Obecnie zrobiony skrypt mam tak, że zwraca mi tylko jeden rekord dla losowego hasha używając:

  1. $result = mysql_query("SELECT * FROM monitoring WHERE sprawdzamy='1' ORDER by rand() limit 1 ");
  2. $row = mysql_fetch_array($result);
  3. $id = $row['id'];
  4. $result33 = mysql_query("SELECT * FROM monitoring WHERE sprawdzamy='1' and id='$id'");


oraz:

  1. $hash = $row33['hash'];
  2. $urlteraz = "https://chain.api.btc.com/v3/tx/".$hash."";
  3. $json = file_get_contents($urlteraz);
  4. $data = json_decode($json, TRUE);
  5. $cenabtc = $data['data']['confirmations']; //Sprawdzamy czy jest zrealizowana



Zrobiłem sobie powiadomienie, że w momencie pobrania danych przy pewnych warunkach otrzymuję wiadomość email, że coś takiego miało miejsce.
I teraz moje pytanie. Obecnie w bazie mam 4 rekordy. W cronie mam ustawione sprawdzanie co kilka minut. Lecz skrypt sprawdza tylko jeden wpis i to losowo.
Da się zrobić tak aby za jednym wygenerowaniem sprawdzić np 130 rekordów i wyświetlić dla nich poszczególne wyniki ? W przypadku powyżej jest to zmienna $cenabtc.

W planach miałem, żeby przy danych rekordach w bazie dodawać (przy hash) czas ostatniego generowania i wprowadzić sortowanie po dacie. Nawet mam zrobione tak lecz obecnie korzystam z rand oraz limit.
Gdybym zastosował pomysł z powyżej to będę miał przynajmniej kontrole, żeby wszystkie hashe mniej więcej tak samo były sprawdzane. Lecz musiałbym wprowadzić częstszy cron w zależności od ilości hashy w bazie. Obecnie jest to co 5 minut. Lecz kiedy z 4 zrobi 40 hasy musiałbym zrobić czas dużo krótszy.

A więc jak to odpalić w while ? Kombinowałem ale nie ma moje siły to jest biggrin.gif

Dzięki za rady smile.gif

SmokAnalog
Zacznijmy od tego, że ten kod jest bez sensu:

  1. $result = mysql_query("SELECT * FROM monitoring WHERE sprawdzamy='1' ORDER by rand() limit 1 ");
  2. $row = mysql_fetch_array($result);
  3. $id = $row['id'];
  4. $result33 = mysql_query("SELECT * FROM monitoring WHERE sprawdzamy='1' and id='$id'");


Wybierasz losowo ID (pobierając przy okazji wszystkie inne kolumny) tylko po to, żeby za chwilę pobrać... wszystkie kolumny o tym ID? Po co to drugie zapytanie?

A co do pętli, to po prostu przeiteruj wyniki wielu wierszy (usuń limit 1) i w pętli rób to, co już robisz. Nie do końca rozumiem w czym problem.
Klycior
Wrzuciło mi się kawałek kodu który nie należy do części skryptu.

Mam obecnie coś takiego:
  1. $result = mysql_query("SELECT * FROM monitoring WHERE sprawdzamy='1'");
  2.  
  3. while($row = mysql_fetch_array($result))
  4. {
  5. $urlteraz = "https://chain.api.btc.com/v3/tx/".$row['hash']."";
  6. $json = file_get_contents($urlteraz);
  7. $data = json_decode($json, true);
  8. echo $data['data']['confirmations'];
  9. echo '<br>';
  10. echo $row['hash'];
  11. echo '<hr>';
  12.  
  13. }


Jednak wywala mi błąd:
  1. failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in

rozumiem, że to wina serwera z którego pobieram dane - tak wywnioskowałem z wujkiem google.

A więc zrobiłem kod:

  1. $result = mysql_query("SELECT * FROM monitoring WHERE sprawdzamy='1'");
  2. while($row = mysql_fetch_array($result))
  3. {
  4. $urlteraz = "https://chain.api.btc.com/v3/tx/".$row['hash']."";
  5. $json = file_get_contents($urlteraz);
  6. $data = json_decode($json, true);
  7. echo $data['data']['confirmations'];
  8. echo '<br>';
  9. echo $row['hash'];
  10. echo '<hr>';
  11. flush();
  12. sleep(1);
  13. }


I śmiga. Czyli przy jednym otwarciu skryptu potrafię pobrać dane dla np 30 linków.
Opóźnienie 1 sekundy pozwala mi na pobranie wszystkich wyników - serwer dopuszcza takie połączenie.

Jest to poprawnie wykonane ? Mogę z tego korzystać ?
SmokAnalog
Możesz jeszcze poczytać dokumentację tego API (jeśli jest) i sprawdzić czy na pewno nie da się pobrać większej liczby wyników przy pojedynczym wywołaniu. Jeśli serwer odrzuca szybkie requesty, to delay jest spoko pomysłem. Możesz poeksperymentować z funkcją usleep, która pozwala na delay w mikrosekundach, żeby nie czekać pełnej sekundy. Apbo możesz jeszcze bardziej zaszaleć i w pętli sprawdzać czy jest Forbidden. Jeśli jest, to spróbować znów za chwilę.
Pyton_000
Pewnie że pozwala na wiele hash w 1 request... Ale po co dokumentacje przeglądać...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.