Ankündigung

Einklappen
Keine Ankündigung bisher.

file_get_content() ruft eine 404 Seite auf !

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • file_get_content() ruft eine 404 Seite auf !

    Moin,

    wie prüfe ich, ob bei einem file_get_content("http://www.seitenname.xyz/id/xyz") ein " 404 Not Found


    nginx "
    entsteht ?

    Ich möchte nämlich diesen Output dann nicht ausgeben, sondern nur die Funktionierenden Outputs.

  • #2
    Moin, Moin!

    Die Funktion heisst file_get_contents() und produziert keinen 404.

    Um zu prüfen, ob die Datei, die du öffnen möchtest, kann man file_exists() verwenden. Weiterführende kann man auch is_file() und is_readable() verwenden.

    Kommentar


    • #3
      Und URLs solltest du darüber nicht abrufen, nutze lieber cURL. Darüber kannst du dann auch den HTTP Status der entfernt liegenden Ressource auswerten.

      Kommentar


      • #4
        Zitat von Gnom42 Beitrag anzeigen
        Und URLs solltest du darüber nicht abrufen, nutze lieber cURL. Darüber kannst du dann auch den HTTP Status der entfernt liegenden Ressource auswerten.
        Hey ich hab mir das mal mit cURL angeschaut und nun diesen Code:
        PHP-Code:
        $ch curl_init();
        $url "https://sub.seite.xyz/bild/v1/".$id."/1.0'"//$id wird mit gegeben und ist 0-999999
        curl_setopt($chCURLOPT_URL$url);
        curl_setopt($chCURLOPT_HEADER1);
        curl_setopt($chCURLOPT_NOBODYTRUE);
        curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        curl_exec($ch);
        $info curl_getinfo($chCURLINFO_HTTP_CODE);
        curl_close($ch);
        echo 
        $info
        Problem ist halt nur... er wirft mir immer 404 an den Kopf obwohl ich ja die Seite mit dem Bild aufrufen kann.
        Und die Seiten wo ein 404 Not Found entsteht sollen das ja nur bekommen.

        Warum werden also bei 200 Seiten auch 404 ausgegeben ?

        Kommentar


        • #5
          Zitat von Gnom42 Beitrag anzeigen
          Und URLs solltest du darüber nicht abrufen, nutze lieber cURL. Darüber kannst du dann auch den HTTP Status der entfernt liegenden Ressource auswerten.
          Ich finde get_haeders()

          http://php.net/manual/de/function.get-headers.php

          auch gut.
          Vor allem, weil es dann offensichtlich wird, daß es sinvoll sein kann, erst den Haeder auszuwerten um dann evtl. den Body zu ziehen.
          Problem ist halt nur... er wirft mir immer 404 an den Kopf obwohl ich ja die Seite mit dem Bild aufrufen kann.
          Dann poste mal die url oder eine komplette Response (inkl. Header).

          Kommentar


          • #6
            Mit get_headers() hatte ich zum Teil Probleme bei https. Wenn du die Header-Info mit curl holst ist es ein wenig mehr Code, dafür universeller.
            Prüfe dann den http_code auf Werte >=200 und < 400 und den content_type für das was du haben möchtest (image/jpeg, pdf, ..).

            Kommentar


            • #7
              Zitat von Gnom42 Beitrag anzeigen
              Und URLs solltest du darüber nicht abrufen, nutze lieber cURL. Darüber kannst du dann auch den HTTP Status der entfernt liegenden Ressource auswerten.
              Ist nicht ganz richtig, file_get_contents eignet sich eigentlich sehr gut um URLs auf zu rufen. Es gibt noch einen weiteren Parameter, wo man ein StreamContext übergeben kann. Damit kann man ua. den Umgang mit Https Seiten konfigurieren, sowie Header und Request Daten setzen. http://php.net/manual/de/context.http.php

              Kommentar


              • #8
                Ich hab jetzt jede Idee so gut wie es beschrieben war von euch und den Manuel versucht.
                Bei allem kommt entweder "HTTP/1.1 404 Not Found", "bool(false)" oder "NULL" raus.

                Bei z.B. get_headers() gibt es ja anscheinend Probleme mit HTTPS, daher habe ich auch nur ne HTTP Seite mal angesprochen.
                Selbst das hat mir "HTTP/1.1 404 Not Found" ausgeworfen.

                Und die Seite ist Lokal zu 100% erreichbar.

                Ich hab halt ein kleinen Lokalen Server, der mit "192.168.178.23/web" aufgerufen werden kann im Browser.
                Wenn ich nun "/v1/0/1.0" ran hänge, bekomme ich vom Browser in der Console das hier >> GET http://192.168.178.23/web/v1/0/1.0 404 () << an den Kopf geworfen.
                Das ist auch richtig, weil dort kein Icon mehr liegt. Daher auch "404 Not Found".

                Wenn ich aber z.B. "/v1/1337/1.0" ran hänge, bekomme ich vom Browser in der Console nichts ausgegeben, da dort ein Icon liegt und mir wird das Icon ganz einfach angezeigt.

                Nun mache ich mir das leben nicht schwer (dachte ich) und mache einfach ein Script...
                PHP-Code:
                $i 0;
                while(
                $i <= 2000){
                            echo
                "<img src='http://192.168.178.23/web/v1/".$i."/1.0' title='ID_".$i."'/>";
                            
                $i++;
                        } 
                ...das mir alle Icons mit der ID => 0 bis 2000 <= anzeigt.
                Allerdings ist wie eben gesagt ID 0 kein Icon vorhanden und daher wird mir das Bild als kaputt ausgegeben im Browser.

                Jetzt hatte ich mal versucht das einfach zu machen
                PHP-Code:
                $i 0;
                while(
                $i <= 2000){
                            
                $url "http://192.168.178.23/web/v1/".$i."/1.0";

                        
                /* Das ist jetzt hier das letzte was ich versucht hab und dort kommt " bool(false) " bei raus */
                            
                $stream file_get_contents($urlfalsestream_context_create(array('http' => array('method' => 'GET''max_redirects' => '0''ignore_errors' => '1'))));
                            
                var_dump(stream_get_contents($stream));

                            echo
                "<img src='$url' title='ID_".$i."'/>";
                            
                $i++;
                        } 
                Und es wird mir halt vor jedem kaputten Icon und jedem Icon das funktioniert (wie im letzten Versuch) >> bool(false) << angezeigt.

                Aber er sollte doch vor den funktionierenden Icons eigentlich "true" setzen oder nicht ?

                Kommentar


                • #9
                  Wozu soll das gut sein? Da kannst du doch gleich direkt die Bilddaten ausgeben, wenn du sie eh mit file_get_contents() abrufst. Wozu dann NOCHMAL vom Client abfragen lassen?

                  Kommentar


                  • #10
                    Zitat von hellbringer Beitrag anzeigen
                    Wozu soll das gut sein? Da kannst du doch gleich direkt die Bilddaten ausgeben, wenn du sie eh mit file_get_contents() abrufst. Wozu dann NOCHMAL vom Client abfragen lassen?
                    Weil ich mit "http://192.168.178.23/web" ALLE Icons anzeigen lassen will die vorhanden sind und alle Kaputten Icon dateien nicht anzeigen will.

                    EDIT:
                    So sieht es ca. bei diese Reihe aus und da sollen halt die kaputten Icons nicht angezeigt werden:
                    icon_ausgabe_auf_seite.png

                    Kommentar


                    • #11
                      Du holst die Bilddaten ja schon mit PHP. Daher kannst du es auch gleich ausgeben:

                      PHP-Code:
                      <?php
                      $url 
                      'https://www.php.de/core/image.php?userid=43067&thumb=1&dateline=1532239111';
                      $imageData base64_encode(file_get_contents($url));

                      if(
                      $http_response_header[0] == 'HTTP/1.1 200 OK') {
                        echo 
                      '<img src="data:image/jpeg;base64,'.$imageData.'">';
                      }
                      Das in deine Schleife zu packen und weitere Response-Codes aufzunehmen überlasse ich dir...
                      sorry, shift-taste kaputt

                      Kommentar


                      • #12
                        Zitat von PlatinSecurity Beitrag anzeigen
                        Weil ich mit "http://192.168.178.23/web" ALLE Icons anzeigen lassen will die vorhanden sind und alle Kaputten Icon dateien nicht anzeigen will.
                        Wieso weil? Das ist dafür nicht notwendig.

                        Kommentar


                        • #13
                          Zitat von Meister1900 Beitrag anzeigen
                          Du holst die Bilddaten ja schon mit PHP. Daher kannst du es auch gleich ausgeben:

                          PHP-Code:
                          <?php
                          $url 
                          'https://www.php.de/core/image.php?userid=43067&thumb=1&dateline=1532239111';
                          $imageData base64_encode(file_get_contents($url));

                          if(
                          $http_response_header[0] == 'HTTP/1.1 200 OK') {
                          echo 
                          '<img src="data:image/jpeg;base64,'.$imageData.'">';
                          }
                          Das in deine Schleife zu packen und weitere Response-Codes aufzunehmen überlasse ich dir...
                          Wow... danke... Das ist genau das, was ich gesucht hab

                          Ist es damit auch möglich die "Timeouts" zu überspringen ?
                          Also das er nicht so lange brauch, um die leeren Icons (404) zu überspringen ?

                          Kommentar


                          • #14
                            Zitat von PlatinSecurity Beitrag anzeigen
                            Ist es damit auch möglich die "Timeouts" zu überspringen ?
                            Also das er nicht so lange brauch, um die leeren Icons (404) zu überspringen ?
                            Was jetzt, Timeout oder 404? Das sind zwei vollkomen unterschiedliche Dinge.

                            Kommentar


                            • #15
                              Zitat von PlatinSecurity Beitrag anzeigen

                              Ist es damit auch möglich die "Timeouts" zu überspringen ?
                              Also das er nicht so lange brauch, um die leeren Icons (404) zu überspringen ?
                              Timeout kannst du mit stream_context_create festlegen. Aber dann für alle Requests, also unabhängig vom 404er

                              sorry, shift-taste kaputt

                              Kommentar

                              Lädt...
                              X