Ankündigung

Einklappen
Keine Ankündigung bisher.

Andere URL auf existenz prüfen und Aufrufen?

Einklappen

Neue Werbung 2019

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

  • Andere URL auf existenz prüfen und Aufrufen?

    Hallo,

    ich habe seit Tagen ein Problem und komme einfach nicht weiter:

    Ich habe eine Domain bei 1und1, darauf ist eine PHP seite. Auf dieser Seite ist ein Link, der PHP code ausführt (die Seite wird dazu neu geladen, aber ich bleibe auf der Seite). Der PHP Code soll prüfen ob eine andere URL existiert (die URL ist die IP adresse + seite.php eines Webservers - Apache auf einem Raspberry pi bei mir Zuhause). Das soll geprüft werden, falls der Server mal wegen Stromausfall oder sonst was nicht aktiv ist.

    Wenn die URL funktioniert, soll diese URL aufgerufen werden. Sie muss nicht angezeigt werden, der Code soll die URL nur ein mal ansurfen und den Inhalt der seite in eine Variable schreiben, das reicht mir bereits (Das Raspberry führt dann etwas PHP code aus). Das habe ich mit file_get_contents versucht

    Ich habe bis jetzt:

    PHP-Code:
    <a href="?code_starten">&Öffnen</a> //Link um den PHP Code zu starten

    <?php

    if(isset($_GET["code_starten"]))
    phpcode();
    function 
    phpcode() {
        try
            {
            
    $rpi file_get_contents("$adresse1");
            }
        catch (
    Exception $e)
            {
            throw new 
    Exception'Something really gone wrong'0$e);
            
    $rpi "DOWN";
        }                                            
    }
    ?>
    Der Inhalt der URL soll also in die Variable $rpi geschrieben werden, wenn die Seite nicht verfügbar ist, soll "DOWN" in die Variable geschrieben werden. Danach wollte ich anhant des Inhalts der Variable Prüfen, ob es geklappt hat (auf der .php auf dem Raspberry steht nur ein Wort, aber wenn das eingelesen wurde, hats geklappt)

    Irgendwas scheint an dem file_get_contents nicht zu laufen ...
    Wenn der Apache Server aktiv ist, gehts, nur wenn er aus ist, wartet die PHP seite, bis der Server wieder da ist, solange steht der Code und alles was danach kommt wird nicht mehr geladen :/ Try catch hat auch nicht geholfen

    Ich glaube es liegt daran, dass wenn der Apache aus ist, und ich die IP adresse manuell ansurfe, läd die Seite auch ziemlich lange, ohne etwas anzuzeigen, scheinbar macht file_get_contents das selbe, also warten, und es wird kein Fehler ausgegeben.

    Gibt es eine besser Lösung für mein Problem ?

    lg score


  • #2
    Ich frag mal ganz blöd nach: Ist die IP denn auch von aussen überhaupt erreichbar?
    Was passiert, wenn Du die Adresse ( IP-Adresse + seite.php ) im Browser direkt aufrufst?
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Anmerkung: Die Anführungzeichen sind sinnlos

      PHP-Code:
      file_get_contents("$adresse1"); 
      http://php-de.github.io/jumpto/code-...n-doppelquotes
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Das sehe ich ja jetzt erst:
        Wenn der Apache Server aktiv ist, gehts, nur wenn er aus ist, wartet die PHP seite, bis der Server wieder da ist
        Der Webserver ( hier: Apache ) muß natürlich aktiv sein, wie willst Du sonst darauf zugreifen...
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

        Kommentar


        • #5
          Es ist nicht mehr zeitgemäß, Anwendungslogik und Ausgabelogik zu kombinieren. Dadurch leidet die Wartbarkeit beider Komponenten. In der Regel folgen in PHP geschriebene Applikationen daher dem EVA-Muster, welches einen leicht nachvollziehbaren Datenfluss ermöglicht, besser wartbare Applikationen erzeugt und leichter von anderen Entwicklern verstanden wird. In der PHP-Welt hat sich hierauf aufbauend das (häufig falsch interpretierte) MVC-Muster [1] etabliert (siehe auch DCI oder ADR). Ganz einfach gesagt handelt es sich bei dem EVA-Muster um eine Aufteilung der Aktionen "Auswertung der Eingabeparameter", "Verarbeitung der damit verknüpften Anwendungslogik" und "Erzeugung und Übermittlung der Ausgabe". Oder vereinfacht: Erst Daten sammeln, dann daraus die Darstellung erzeugen und ausgeben. Die Verwendung einer Templateengine (mit Layout-Support) ist dafür Empfehlenswert - jedoch aber keine Voraussetzung. Mehr Informationen: http://php-de.github.io/jumpto/eva-prinzip/

          -----

          Der schließende Tag eines PHP-Blocks am Ende einer Datei ist optional. In einigen Fällen ist das Weglassen hilfreich:
          • Es können ungewollte Whitespaces am Ende einer Datei auftreten, durch die ein späteres setzen von headern be-/verhindert werden kann.
          • Außerdem verhindert dies, dass beim Output Buffering Whitespaces am Ende eines durch die eingebundenen Dateien erzeugten Parts.
          • Im PSR Standard (PSR-2) ist ?> sogar ausdrücklich verboten, wenn in einer Datei ausschliesslich PHP verwendet wird (2.2 Files).
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            Zitat von Arne Drews Beitrag anzeigen
            Ich frag mal ganz blöd nach: Ist die IP denn auch von aussen überhaupt erreichbar?
            Was passiert, wenn Du die Adresse ( IP-Adresse + seite.php ) im Browser direkt aufrufst?
            jup, die IP ist erreichbar. Wie gesagt, wenn der Apache server läuft, dann funktioniert mein Code auch. Mir gehts nur darum, wenn der Apache mal NICHT läuft, weil zuhause mal kurz der Strom weg war, internetverbindung unterbrochen, neue dynamische IP bekommen usw...
            Wenn ich in dem Fall meinen PHP code aufrufe, dann läd die seite, der Button auf den ich klicke wird auch angezeigt, aber alles was danach kommt, nicht mehr. Die Seite friert an der Stelle, an der der PHP code auf die URL zugreifen soll ein, und zwar so lange, bis der Apache server wieder erreichbar ist. Habs getestet, wenn ich den Server 5 minuten aus lasse, dann wartet die Seite so lange, bis ich den Server wieder an mache. Und so lange passiert nix, ich kann die Seite nicht mal neu laden, ohne dass sie "abstürzt". Deswegen suche ich einen PHP code, der mir vorher prüft, ob die Seite momentan überhaupt erreichbar ist.

            Zu den Anführungszeichen; danke für den Tipp

            "Der Webserver ( hier: Apache ) muß natürlich aktiv sein, wie willst Du sonst darauf zugreifen... " -> jup, wie gesagt, was wenn er nicht erreichbar ist, dann hängt sich der PHP code auf

            Zur gesagt, ich brauche einen Code, der eine URL prüft, ob sie erreichbar ist (gerne auch nach z.B. 10 Sekunden nicht erreichbarkeit abbricht), wenn nicht erreichbar z.B. "DOWN" in eine Variable schreibt, aber wenn die URL erreichbar ist, den Text aus der seite der URL (oder den Titel, irgendwas, ist mir alles recht^^) in eine Variable schreiben.

            danke schon mal für die Antworten!!!

            Kommentar


            • #7
              "Der Webserver ( hier: Apache ) muß natürlich aktiv sein, wie willst Du sonst darauf zugreifen... " -> jup, wie gesagt, was wenn er nicht erreichbar ist, dann hängt sich der PHP code auf
              Da kannst Du nichts machen!!!
              Code:
              if ( !is_active(WEBSERVER) || !is_reachable(WEBSERVER) ) {
              
                  WEBSERVER->isConnectPossible = false;
                  WEBSERVER->whatCanIDo = null;
              
              }
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Doch. file_get_contents wartet nur sehr lange, da hängt sich aber nichts auf.
                Um zu Testen ob eine Webseite erreichbar ist eignet sich file_get_contents() nicht besonders gut.
                Es sollte mindestens der Header ausgewertet werden, ob da ein 200er kommt.

                Ansatz zum Testen:
                PHP-Code:
                $url "http://...";
                ini_set('default_socket_timeout'2);
                $uinfo = @get_headers($url); 
                $uinfo ist false, wenn der ganze Server nicht erreichbar ist. Sonst liefert get_headers() ein Array. Das sollte überprüft werden, ob es ein
                HTTP/1.1 200 OK
                enthält oder z.B. ein "HTTP/1.1 404 Not Found". Dann existiert die Url auch nicht.

                LG jspit
                PHP-Klassen auf github

                Kommentar


                • #9
                  Woher kommt den in der Funktion $adresse1?

                  Zum Thema file_get_contents(). Setzt einfach ein Timeout. Das sieht dann so aus:
                  PHP-Code:
                  $context stream_context_create(array('http'=> array('timeout' => 5)));
                  file_get_contents($adresse1false$context); 

                  Kommentar


                  • #10
                    https://github.com/FriendsOfPHP/Goutte
                    Standards - Best Practices - AwesomePHP - Guideline für WebApps

                    Kommentar


                    • #11
                      Ändert aber alles nichts daran, daß sein Script nicht erreichbar ist, wenn der Webserver down ist!

                      Selbst gemerkt, genau das will er ja prüfen
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Zitat von Arne Drews Beitrag anzeigen
                        Ändert aber alles nichts daran, daß sein Script nicht erreichbar ist, wenn der Webserver down ist!

                        Selbst gemerkt, genau das will er ja prüfen
                        Das will er prüfen weil sonst die Anwendung blockt. Das kann er sich aber sparen, wenn er ein Timeout entsprechend setzt und dann ggf. auf den Fehler reagiert.

                        Kommentar


                        • #13
                          Ja, er hat zu Hause am Raspberry Pi z.B. eine Wetterstation hängen und möchte auf seiner Webseite die aktuellen Daten anzeigen.
                          Anstelle die Daten abzuholen kann der Homeserver doch die Daten zyklisch schicken. Da muß 'oben' nur noch gescheckt werden, ob die Daten aktuell sind. Die Transferzeit zum Abholen der Daten beim Anzeigen der seite fällt auch weg.
                          PHP-Klassen auf github

                          Kommentar


                          • #14
                            Soweit ich es verstanden habe, gibt es 2 PHP Fähige Webserver: 1. den von 1&1, wo das besagte Script drauf liegen soll und 2. den Server auf dem Raspberry Pi, wo rauf ein Script liegt, das vom 1&1 Server aus verlinkt ist. Nun möchte er aber verhindern, dass ein User eine "Server nicht gefunden" Meldung bekommt, und will den Online Status des Servers vor Generierung des Links prüfen. Korrigier mich, wenn ich da falsch wiedergegeben habe.

                            Gruß
                            phuck

                            Kommentar


                            • #15
                              Wow, danke schon mal für die viele Hilfe!!

                              also, richtig, ich habe 2 Server auf denen PHP läuft. Auf dem 1und1 Server läuft der Code den ich gerade schreiben will. Auf dem Raspberry wird code ausgeführt, sobald ich die Seite aufrufe. Am Raspberry hängt aber keine Wetterstation, sondern es wird etwas gesteuert, Licht soll an und ausgemacht werden (bzw allgemein möchte ich damit Relais an und aus schalten, was dann dran hängt ist ja erstmal egal).

                              Und da ich das aus der Ferne machen möchte (den Button also vom Smartphone drücken), hätte ich gerne eine bestätigung ob das geklappt hat. Wenn ich also die PHP seite auf dem Raspberry aufgerufen habe und den Inhalt der Seite einlese (da kannst ja von mir aus nur "OK" stehen oder so), dann kann ich ja davon ausgehen, dass es geklappt hat, das OK ja in der selben Datei steht, in der auch der PHP Code steht, der ausgeführt werden soll.
                              Wenn das Raspberry aber gerade aus ist, möchte ich das gerne angezeigt bekommen. Und wenn möglich nicht durch ewiges aufhängen des Codes das zeigt mir zwar auch dass es nicht ging, aber ist ja nicht gerade die beste lösung.

                              Ich werde später die beiden ansätze von jspit und erc ausprobieren, also den timeout einbauen und das mit dem @get_headers. Mal sehen ob etwas davon das liefert wie ichs gern hätte.

                              Und die variable $adresse habe ich vorher definiert, habe ich hier nur nicht mit reinkopiert. Der inhalt hat aber die Struktur $adresse1 = "http://" . "$externeip" . "/steuerungscode.php?Befehl=Anmachen;
                              (zum get ?Befehl ... je nachdem was da steht, wird halt die ein oder andere PHP funktion ausgeführt)
                              wobei $externeip die externe IP adresse von mir ist

                              Kommentar

                              Lädt...
                              X