Jak obsłużyć nieudane wczytanie witryny w iframe?

0

Witam mam pewien problem z pobieraniem danych które są pobierane z zewnętrznej strony do iframe. Niestety czasem zdarza się że strona z której dane są pobierane jest wyłączona i wtedy zamiast pobranych danych wyświetla się komunikat z błędem 503 ... Mam pytanie, jak za pomocą najlepiej php sprawdzić czy strona z której pobierane są dane jest aktywna i w razie czego zamiast komunikatu 503 żeby nic się nie wyświetlało. Znalazłem co prawda kilka skryptów, ale kompletnie się nie sprawdzają, najczęściej zamiast sprawdzenia czy strona jest aktywna, albo nic nie wyświetlają, albo zupełnie nie działają.

0

No ale jak to jest w iframie to PHP co ma do tego? Sprawdź to JSem czy strona się załadowała a jak nie to wyświetlaj blank page i tyle. Z poziomu PHP tego nie zrobisz chyba że wrzucisz sobie GETa na url tej strony i sprawdzisz co przyjdzie ale to wtedy ta strona będzie ładowana przez twój serwer a potem klienta.

0
bagietMajster napisał(a):

No ale jak to jest w iframie to PHP co ma do tego? Sprawdź to JSem czy strona się załadowała a jak nie to wyświetlaj blank page i tyle. Z poziomu PHP tego nie zrobisz chyba że wrzucisz sobie GETa na url tej strony i sprawdzisz co przyjdzie ale to wtedy ta strona będzie ładowana przez twój serwer a potem klienta.

Przecież kiedyś za pomocą php można było sprawdzić coś takiego jak HTTP Response Status strony. Więc chyba jednak php może mieć coś wspólnego. Sprawdziłem kilka skryptów, ale tak jak napisałem powyżej, dość słabo się sprawdzają, więc może ktoś zna jednak jakiś sposób.

1

Możesz to zrobić na dwa sposoby:

0
bagietMajster napisał(a):

Spróbuj CURLem:
https://stackoverflow.com/questions/9817046/get-the-site-status-up-or-down

Sprawdzałem te skrypty, tyle że już pogubiłem się które działały kiedy status strony był 503, a które nie. Chodzi mi konkretnie żeby skrypt sprawdzał i wyświetlał status tej zewnętrznej strony i w przypadku gdyby był to na status 503 żeby nic się nie wyświetlało. Samo zrobienie tego w zależności od statusu w php jest proste, ale chodzi dokładnie o pobranie statusu tej zewnetrznej strony.

0

nieco przerobiłem ten skrypt, tak żeby zwracał sam status strony i teraz wszystko działa. Dzięki za pomoc.

function checkLive($url)
{
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_TIMEOUT, 15);
    $http_respond = trim(strip_tags(curl_exec($ch)));
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);
    if (in_array($http_code, ["200", "302"])) {
        return true;
    } else {
        return false;
    }
}
0

"Jak obsłużyć nieudane wczytanie witryny w iframe?"

(na marginesie, gratuluję przeróbki pytania)

Obsłużyć tak samo, jak nieudane wczytanie poza iframe.

shreker napisał(a):

Sprawdzałem te skrypty, tyle że już pogubiłem się które działały kiedy status strony był 503, a które nie.

Nie prościej zapłacić człowiekowi, który to robił? Bo od samego postawienia zagadnienia wiadomo, że nie jesteś autorem który to ze zrozumieniem zrealizował.

Ciekawe będzie sie dowiedzieć, jaka to dziedzina. Np bookmacherka, tam wszystcy kradną i zabezpieczają żeby nie kraśc od nich

0
shreker napisał(a):

nieco przerobiłem ten skrypt, tak żeby zwracał sam status strony i teraz wszystko działa. Dzięki za pomoc.

function checkLive($url)
{
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_TIMEOUT, 15);
    $http_respond = trim(strip_tags(curl_exec($ch)));
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);
    if (in_array($http_code, ["200", "302"])) {
        return true;
    } else {
        return false;
    }
}

No ale wiesz że to żądanie które wyślesz z servera nie koniecznie musi mieć taką samą odpowiedź jak to wysłane z klienta?

Może tak być że serwer wyślę żądanie, dostaniesz 200, a klient z przeglądarki wyśle drugie i dostaniesz 500tkę.

0
AnyKtokolwiek napisał(a):

"Jak obsłużyć nieudane wczytanie witryny w iframe?"

(na marginesie, gratuluję przeróbki pytania)

Obsłużyć tak samo, jak nieudane wczytanie poza iframe.

shreker napisał(a):

Sprawdzałem te skrypty, tyle że już pogubiłem się które działały kiedy status strony był 503, a które nie.

Nie prościej zapłacić człowiekowi, który to robił? Bo od samego postawienia zagadnienia wiadomo, że nie jesteś autorem który to ze zrozumieniem zrealizował.

Ciekawe będzie sie dowiedzieć, jaka to dziedzina. Np bookmacherka, tam wszystcy kradną i zabezpieczają żeby nie kraśc od nich

  1. przeróbki tytułu nie robiłem, więc pytanie nie trafione.
  2. komu co zapłacić, bo nie bardzo zrozumiałem, ale widać że chyba nie bardzo orientujesz się że niektóre strony pobierają treści z innych stron z różnych powodów, przykładem jest na przykład pobieranie choćby danych pogodowych.
  3. ogromna większość programistów opiera swoją pracę o rozwiązania innych, a więc na gotowcach, więc gdyby tak przyjrzeć się wszystkim stronom to nie przesadzę jak na 99% stron znalazły by się rozwiązania "zapożyczone" od innych.
  4. zamiast więc praktykować bezmyślne krytykanctwo może warto czasem zastanowić się i napisać coś sensownego ?
  5. nie wdaję się w bezsensowne dysputy bo najzwyczajniej szkoda mi na to czasu, tym bardziej w aktualnym okresie. Wesołych Świąt :)
0
Riddle napisał(a):

No ale wiesz że to żądanie które wyślesz z servera nie koniecznie musi mieć taką samą odpowiedź jak to wysłane z klienta?

Może tak być że serwer wyślę żądanie, dostaniesz 200, a klient z przeglądarki wyśle drugie i dostaniesz 500tkę.

A widzisz, nie pomyślałem, a w takim razie da się pobrać jakoś właściwy status strony, najlepiej przy pomocy php ?
zamiast if'ów dałem return $http_code;

0
shreker napisał(a):
Riddle napisał(a):

No ale wiesz że to żądanie które wyślesz z servera nie koniecznie musi mieć taką samą odpowiedź jak to wysłane z klienta?

Może tak być że serwer wyślę żądanie, dostaniesz 200, a klient z przeglądarki wyśle drugie i dostaniesz 500tkę.

A widzisz, nie pomyślałem, a w takim razie da się pobrać jakoś właściwy status strony, najlepiej przy pomocy php ?
zamiast if'ów dałem return $http_code;

No, nie. Skrypt w PHP odpalisz sobie na serwerze, ale ktoś wczyta <iframe/> w swojej przeglądarki, na swoich komputerze - inne maszyny.

Moim zdaniem najlepiej to obsłużyć tak jak pisałem w poście wyżej: czyli albo w kliencie (w JavaScript) i to chyba jest najlepsze, albo zrobić proxy - ale to jest trudne.

0
Riddle napisał(a):
shreker napisał(a):
Riddle napisał(a):

No ale wiesz że to żądanie które wyślesz z servera nie koniecznie musi mieć taką samą odpowiedź jak to wysłane z klienta?

Może tak być że serwer wyślę żądanie, dostaniesz 200, a klient z przeglądarki wyśle drugie i dostaniesz 500tkę.

A widzisz, nie pomyślałem, a w takim razie da się pobrać jakoś właściwy status strony, najlepiej przy pomocy php ?
zamiast if'ów dałem return $http_code;

No, nie. Skrypt w PHP odpalisz sobie na serwerze, ale ktoś wczyta <iframe/> w swojej przeglądarki, na swoich komputerze - inne maszyny.

Moim zdaniem najlepiej to obsłużyć tak jak pisałem w poście wyżej: czyli albo w kliencie (w JavaScript) i to chyba jest najlepsze, albo zrobić proxy - ale to jest trudne.

Ok, w takim razie dzięki za pomoc, nieco więc przerobię całość tak żeby dopasować. :)

0
shreker napisał(a):

Ok, w takim razie dzięki za pomoc, nieco więc przerobię całość tak żeby dopasować. :)

Jeśli tworzysz aplikacje internetowe, to nie myśl że Ci się uda ominąć JS'a. Sugerowałbym zaczęcie się uczenia tego języka ASAP.

2

Nie rozumiem co tu się stało. Po co PHP zamiast obsłużyć wszystko prawidłowo z frontu i JS?

https://stackoverflow.com/questions/16499117/how-to-detect-an-error-404-in-an-iframe

Edit: widzę, że nie tylko ja wkleiłem ten link.

shreker napisał(a):

nieco przerobiłem ten skrypt, tak żeby zwracał sam status strony i teraz wszystko działa. Dzięki za pomoc.

    if (in_array($http_code, ["200", "302"])) {

A co np. z 307?

0
shreker napisał(a):

nieco przerobiłem ten skrypt, tak żeby zwracał sam status strony i teraz wszystko działa. Dzięki za pomoc.

    if (in_array($http_code, ["200", "302"])) {

A co np. z 307?

Dokładnie brakuje wielu wartości najlepiej bezpiecznie coś w stylu:

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (($http_code >= 200) && ($http_code < 400)) {

Przy okazji funkcja curl_getinfo przy wywołaniu z parametrem CURLINFO_HTTP_CODEzwraca integer a nie string.

0
kAzek napisał(a):

Dokładnie brakuje wielu wartości najlepiej bezpiecznie coś w stylu:

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (($http_code >= 200) && ($http_code < 400)) {

Przy okazji funkcja curl_getinfo przy wywołaniu z parametrem CURLINFO_HTTP_CODEzwraca integer a nie string.

YAGNI. Jeśli sprawdzenie 200 i 302 wystarcza autorowi, to nie ma potrzeby dopisywać defensywnego kodu "na wypadek".

Autor @shreker obsługując tylko 200 i 302 ma rację - chyba że faktycznie ma potrzebę obsługiwać jakiś konkretny status z serwisu z którym się integruje.

0
shreker napisał(a):
AnyKtokolwiek napisał(a):

Nie prościej zapłacić człowiekowi, który to robił? Bo od samego postawienia zagadnienia wiadomo, że nie jesteś autorem który to ze zrozumieniem zrealizował.

Ciekawe będzie sie dowiedzieć, jaka to dziedzina. Np bookmacherka, tam wszystcy kradną i zabezpieczają żeby nie kraśc od nich

  1. ogromna większość programistów opiera swoją pracę o rozwiązania innych, a więc na gotowcach, więc gdyby tak przyjrzeć się wszystkim stronom to nie przesadzę jak na 99% stron znalazły by się rozwiązania "zapożyczone" od innych.
  2. zamiast więc praktykować bezmyślne krytykanctwo może warto czasem zastanowić się i napisać coś sensownego ?
  3. nie wdaję się w bezsensowne dysputy bo najzwyczajniej szkoda mi na to czasu, tym bardziej w aktualnym okresie. Wesołych Świąt :)

Widzę, że w polemice nie podjąłeś słów "wykorzystywać bez zrozumienia", czepiając sie tylko pierwszego słowa.
Już wielokrotnie tu dałes temu przykład przykład.

1 użytkowników online, w tym zalogowanych: 0, gości: 1