Bastian: Versionsnummer auslesen aus einer Datei von anderem Server

Ich habe auf einer Webseite eine Versionsnummer unter verson.txt hinterlegt. (Kann sie natürlich auch in einem anderem Format hinterlegen.

Nun würde ich gerne von verschiedenen anderen Seiten auf diese zugreifen um sie zu vergleichen.

Mein erster Gedanke war, das ich es mit der funktion:

function.file-get-contents

bewerkstellige, doch diese ist manchmal nicht zulaässig! (weil abgeschaltet)

Wie kann ich diese Problem umgehen, bzw. wie könnte ich die Versionsnummer auslesen um mit ihr weiter zu arbeiten. Irgendwie macht das doch auch fast jede Forensoftware???

Für eine Hilfe bin ich jetzt schon mla dankbar.

Gruß

Basti

  1. Hallo,

    Mein erster Gedanke war, das ich es mit der funktion:

    function.file-get-contents

    bewerkstellige, doch diese ist manchmal nicht zulaässig! (weil abgeschaltet)

    also ich habe noch von keinem Hoster gehört, der file_get_contents() sperren würde.

    Aber davon unabhängig könntest du ja ebensogut auf readfile() ausweichen, zur Not sogar auf include - wobei im letzten Fall gültiger PHP-Code in der Datei stehen muss, einschließlich eines einleitenden <?php am Anfang.

    Ciao,
     Martin

    --
    Ich denke, also bin ich hier falsch.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Tach!

      also ich habe noch von keinem Hoster gehört, der file_get_contents() sperren würde.

      Er meint, dass allow_url_fopen auf off gesetzt wurde.

      Aber davon unabhängig könntest du ja ebensogut auf readfile() ausweichen, zur Not sogar auf include

      Das geht dann auch nicht. readfile(), abgesehen davon, dass ihm seine Funktionalität (nichts zurück- und alles gleich ausgeben) sicher nichts nützt, wäre auch von allow_url_fopen betroffen, das include würde am allow_url_include scheitern, das sicherlich auch nicht freigegeben ist. Das steht ja sogar per Default auf off.

      Unabhängig von allow_url_fopen sollten aber noch selbst erstellte Socket-Verbindungen möglich sein (siehe fsockopen()) und andere Formen der direkten Netzwerkkommunikation (Curl/FTP).

      dedlfix.

      1. Hallo,

        also ich habe noch von keinem Hoster gehört, der file_get_contents() sperren würde.
        Er meint, dass allow_url_fopen auf off gesetzt wurde.

        die übrigen Antworten gehen ja klar in die Richtung, aber das habe ich aus Bastians Posting so nicht herausgelesen. Ich bin davon ausgegangen, dass er von mehreren Seiten (oder meinetwegen auch Sites) auf demselben Server spricht. Die klare Aussage steht zwar im Thread-Titel, da habe ich sie aber schlicht und ergreifend überlesen. Zu deutlich. ;-)

        Unabhängig von allow_url_fopen sollten aber noch selbst erstellte Socket-Verbindungen möglich sein (siehe fsockopen()) und andere Formen der direkten Netzwerkkommunikation (Curl/FTP).

        Das sollte wohl möglich sein.

        Ciao,
         Martin

        --
        Lieber eine gesunde Verdorbenheit als eine verdorbene Gesundheit.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. dass ihm seine Funktionalität (nichts zurück- und alles gleich ausgeben) sicher nichts nützt,

        Ist per ob_* leicht in den Griff zu bekommen. Allerdings, wie bereits geschrieben wurde, macht das hier keinen Unterschied ;)

        1. Schu mal was ich da gefunden habe:  
            
          ***************************************** (w) tleilax, 2006 ***  
          * Funktioniert auch bei allow_url_fopen=false, solange Sockets  
          * geöffnet werden können  
          *  
          * Übergabe:  
          *  $url     - Die auszulesende URL.  
          *  $timeout - Zeit in Sekunden für den Verbindungsaufbau  
          * Rückgabe:  
          *  String, der die komplette Rückgabe der auszulesenden URL enthält  
          ***************************************************************/  
          function file_getContents($url, $timeout=30) {  
            // URL zerlegen  
            $parsedurl = @parse_url($url);  
            // Host ermitteln, ungültigen Aufruf abfangen  
            if (empty($parsedurl['host']))  
              return null;  
            $host = $parsedurl['host'];  
            // Pfadangabe ermitteln  
            $documentpath = empty($parsedurl['path']) ? '/' : $documentpath = $parsedurl['path'];  
            // Parameter ermitteln  
            if (!empty($parsedurl['query']))  
              $documentpath .= '?'.$parsedurl['query'];  
            // Port ermitteln  
            $port = empty($parsedurl['port']) ? 80 : $port = $parsedurl['port'];  
            
            // Socket öffnen  
            $fp = fsockopen ($host, $port, $errno, $errstr, $timeout);  
            if (!$fp)  
              return null;  
            
            // Request senden  
            fputs ($fp, "GET {$documentpath} HTTP/1.0\r\nHost: {$host}\r\n\r\n");  
            
            // Header auslesen  
            $header = '';  
            do {  
              $line = chop(fgets($fp));  
              $header .= $line."\n";  
            } while (!empty($line) and !feof($fp));  
            // Daten auslesen  
            $result = '';  
            while (!feof($fp)) {  
              $result .= fgets($fp);  
            }  
            // Socket schliessen  
            fclose($fp);  
            
            // Ergebnis zurückgeben  
            return $result;  
          }  
            
            
            
          echo file_getContents('http://www.google.de')  
            
            
          
          
          1. Tach!

            Könntest du dich bitte mit dir selbst einigen, wie du dich hier nennen möchtest und dann bei dem Namen bleiben? Danke.

            Schau mal was ich da gefunden habe:

            Sieht nicht schlecht aus, bis auf die Kleinigkeit, dass der Autor den Trinitätsoperator nicht verstanden hat.

            $documentpath = empty($parsedurl['path']) ? '/' : $documentpath = $parsedurl['path'];
              $port = empty($parsedurl['port']) ? 80 : $port = $parsedurl['port'];

            Die beiden Zeilen sollten so aussehen:

            $documentpath = empty($parsedurl['path']) ? '/' : $parsedurl['path'];
              $port = empty($parsedurl['port']) ? 80 : $parsedurl['port'];

            dedlfix.

            1. Hallo,

              Die beiden Zeilen sollten so aussehen:

              $documentpath = empty($parsedurl['path']) ? '/' : $parsedurl['path'];
                $port = empty($parsedurl['port']) ? 80 : $parsedurl['port'];

              ich plädiere regelmäßig noch dafür, den ternären Operator mitsamt seinen drei Operanden zu klammern. Das bringt zwar keinen technischen Vorteil, verbessert aber IMO die Lesbarkeit. Vielleicht auch einfach Gewohnheitssache ...

              Ciao,
               Martin

              --
              Der Mensch denkt, Gott lenkt.
              Der Mensch dachte, Gott lachte.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Tach!

                ich plädiere regelmäßig noch dafür, den ternären Operator mitsamt seinen drei Operanden zu klammern. Das bringt zwar keinen technischen Vorteil, verbessert aber IMO die Lesbarkeit.

                Für mich ist alles überflüssige ein kleiner Beitrag zu weniger Lesbarkeit. Ausnahmen bestätigen auch diese Regel. Das schließt zum Beispiel auch unnötig viele Leerzeilen oder Extra-Zeilen für öffnende Klammern im Code ein, was in meinen Augen nur zu zu vielen Scrollbewegungen führt.

                Der ternäre Operator hat wie jeder andere Operator auch seinen Platz in der Operatoren-Rangfolge. Die Klammern haben manchmal auch priorisierende Wirkung. Vor allem die logischen Operatoren && und || sowie and und or sind da spezielle Kandidaten. Das sind nicht einfach nur schnöde Alternativschreibweisen sondern eigenständige Operatoren mit unterschiedlichem Vorrang. && und || kommen vor ?:, and und or danach. Damit sind

                $foo = $bar && $qux ? 23 : 42;  
                $foo = $bar and $qux ? 23 : 42;
                

                nicht äquivalent und führen zu unterschiedlichen (oft unerwarteten) Ergebnissen. Die zusätzlichen Klammern verdeutlichen, wie gerechnet wird:

                $foo = ($bar && $qux) ? 23 : 42;  
                $foo = $bar and ($qux ? 23 : 42);
                

                Zusätzliche Klammern können dem Interpreter und dem Leser bei der Erfassung der Intention des Autors helfen. Das heißt, dass ich in solch einem Fall auch eigentlich überflüssige Klammern setze, wenn das der Verständlichkeit dient. Klammern würde ich hier nur den and/&&-Ausdruck, nicht jedoch einteilige Ausdrücke, also hier die 23 und 42. Da empfinde ich die Klammern genauso sinnlos wie Anführungszeichen um eine einzelne "$Variable".

                dedlfix.

                1. hi,

                  ich plädiere regelmäßig noch dafür, den ternären Operator mitsamt seinen drei Operanden zu klammern. Das bringt zwar keinen technischen Vorteil, verbessert aber IMO die

                  $foo = ($bar && $qux) ? 23 : 42;

                  $foo = $bar and ($qux ? 23 : 42);

                    
                  Was noch Lustiger wird, wenn man bedenkt, dass es auch technisch einen Unterschied hat zwischen "&" und "&&". Vor allem bei Funktionen kann das ein wesentlicher Unterschied sein. Das noch im Zusammenspiel mit der Wichtigkeit ... böse falle für nachfolgende Entwickler möglich ;)  
                    
                  Bei folgendem Beispiel sieht man das am einfachsten, auch wenns mit OR ist.  
                  ~~~php
                    
                  function a(){echo "a";return true;}  
                  function b(){echo "b";return true;}  
                  if (a() | b()){echo " erste_if ";}  
                  if (a() || b()){echo " zweite_if ";}  
                  
                  

                  => ab erste_if a zweite_if

                    
                  function a(){echo "a";return false;}  
                  function b(){echo "b";return false;}  
                  if (a() & b()){echo " erste_if ";}  
                  if (a() && b()){echo " zweite_if ";}  
                  
                  

                  => aba

                  Gruß Niklas

                  --
                  Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
                  1. Bei folgendem Beispiel sieht man das am einfachsten, auch wenns mit OR ist.

                    function a(){echo "a";return true;}
                    function b(){echo "b";return true;}
                    if (a() | b()){echo " erste_if ";}
                    if (a() || b()){echo " zweite_if ";}

                    
                    > => ab erste\_if a zweite\_if  
                    >   
                    > ~~~php
                      
                    
                    > function a(){echo "a";return false;}  
                    > function b(){echo "b";return false;}  
                    > if (a() & b()){echo " erste_if ";}  
                    > if (a() && b()){echo " zweite_if ";}  
                    > 
                    
                    

                    => aba

                    Hat das aber nicht eher was damit zutun, dass das Bit-Operationen sind?
                    Also im Prinzip wie

                      
                    function a(){echo "1";return 1;}  
                    function b(){echo "2";return 2;}  
                    if (a() + b()){echo " erste_if ";}  
                    
                    

                    Denn damit wäre es wieder logisch, dass bei if (a() & b()) und if (a() | b()) beide Funktionen ausgeführt werden, da es ja erstmal die Rückgabe-Parameter braucht um den Testwert zu bestimmen.

                    MfG
                    bubble

                    --
                    If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
                    1. Denn damit wäre es wieder logisch, dass bei if (a() & b()) und if (a() | b()) beide Funktionen ausgeführt werden, da es ja erstmal die Rückgabe-Parameter braucht um den Testwert zu bestimmen.

                      Natürlich meinte ich die Rückgabe-WERTE.

                      MfG
                      bubble

                      --
                      If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
                      1. hi,

                        Denn damit wäre es wieder logisch, dass bei if (a() & b()) und if (a() | b()) beide Funktionen ausgeführt werden, da es ja erstmal die Rückgabe-Parameter braucht um den Testwert zu bestimmen.
                        Natürlich meinte ich die Rückgabe-WERTE.

                        Da wäre ich jetzte überfragt, macht aber für mich schon auch Sinn.
                        Hat mich auf jeden Fall schon mal viel Zeit gekostet, da andere der Meinung waren, dass man doch alles auf AND umschreiben sollte, und dabei das nicht beachtet hatten. Zusätzlich zu dem von Dedlfix genannten Problem ...

                        Bei der SPS-Programmierung (Simatic S7) musste ich ja noch deutlich mehr auf der Bit-Ebene denken. Bei PHP kann man das ja häufig auch vernachlässigen ...

                        Gruß Niklas

                        --
                        Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
                    2. Tach!

                      [ | und & ]
                      Hat das aber nicht eher was damit zutun, dass das Bit-Operationen sind?

                      Ja. Dabei müssen immer beide Operanden mitspielen, und wenn dies Ausdrücke sind, müssen diese zuerst berechnet werden. Wenn diese Berechnungsfunktionen irgendwelche Nebenwirkungen haben, werden diese ausgeführt. Bei den logischen Operatoren kann das Kurzschlussverfahren angewendet werden. Wenn nach dem ersten Ausdruck bereits feststeht, dass der zweite am Ergebnis nichts mehr ändern kann, wird der nicht mehr berechnet. Seine Nebenwirkungen bleiben dann unausgeführt.

                      x and y (oder x && y): wenn x = 0 ist, kann das Ergebnis nur noch 0 werden, egal was y bringt.
                      x or y (oder x || y): wenn x = 1 ist, kann das Ergebnis nur noch 1 werden, egal was y bringt.

                      Wenn man auf die Nebenwirkungen von y angewiesen ist, sollte man jedoch nicht zu den Bitoperatoren greifen, sondern die Ausdrücke erst berechnen, Ergebnis in Variable ablegen und diese dann in der Logikoperation anwenden. Am besten auch noch dokumentieren, dass da Nebenwirkungen benötigt werden, nicht dass man das mal im Code wegoptimiert und dann Fehler suchen muss. Noch besser wäre sicher, den Code so umzubauen, dass man diese Nebenwirkungsabhängigkeit loswird.

                      dedlfix.

                  2. Hallo,

                    Was noch Lustiger wird, wenn man bedenkt, dass es auch technisch einen Unterschied hat zwischen "&" und "&&". Vor allem bei Funktionen kann das ein wesentlicher Unterschied sein. Das noch im Zusammenspiel mit der Wichtigkeit ... böse falle für nachfolgende Entwickler möglich ;)

                    sehe ich nicht so, denn & und && sowie die Kollegen | und || sind je zwei unterschiedliche Operatoren:
                    Das einfache & ist ein bitweises "Und", die Operanden sind Integerwerte, das Ergebnis ist auch ein Integerwert.
                    Das doppelte && ist ein boolsches "Und", die Operanden werden als Boolean interpretiert, das Ergebnis ist Boolean.

                    Das Ergebnis einer boolschen Operation kann schon feststehen, wenn noch nicht alle Operanden verarbeitet sind, so dass man die Auswertung der übrigen Operanden als Optimierung einsparen kann: Ist der erste Operand einer UND-Verknüpfung schon false, kann der zweite nichts mehr daran ändern. Man nennt das "Short Circuit Evaluation".
                    Diese Optimierung ist in einigen Programmiersprachen üblich. PHP gehört dazu, Javascript ebenso, und der Urahn C auch.

                    Ciao,
                     Martin

                    --
                    F: Wer waren die ersten modernen Politiker?
                    A: Die Heiligen drei Könige. Sie legten die Arbeit nieder, zogen teure Klamotten an und gingen auf Reisen.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hi,

    Mein erster Gedanke war, das ich es mit der funktion file-get-contents bewerkstellige, doch diese ist manchmal nicht zulaässig! (weil abgeschaltet)

    Wie kann ich diese Problem umgehen, bzw. wie könnte ich die Versionsnummer auslesen um mit ihr weiter zu arbeiten.

    Wenn dir HTTP-Requests via file_get_contents nicht erlaubt sind, dann hast du vermutlich auch keinen Zugriff auf andere Möglichkeiten/Techniken wie bspw. cUrl.

    Irgendwie macht das doch auch fast jede Forensoftware???

    Die läuft dann aber auf vernünftigem Hosting, wo es keine solchen unsinnigen Einschränkungen gibt.

    ---

    Ggf. könntest du die Versionsnummer als JavaScript-Code hinterlegen, den du dann auf den anderen Seiten einbindest. Dann musst du nur noch schauen, wie du den Wert an PHP übergeben bekommst … AJAX, Umleitung auf foo.php?versionsnummer={wert aus JS Variable}, …

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. hi,

    Ich habe auf einer Webseite eine Versionsnummer unter verson.txt hinterlegt. (Kann sie natürlich auch in einem anderem Format hinterlegen.

    Nun würde ich gerne von verschiedenen anderen Seiten auf diese zugreifen um sie zu vergleichen.

    Mein erster Gedanke war, das ich es mit der funktion:

    function.file-get-contents

    bewerkstellige, doch diese ist manchmal nicht zulaässig! (weil abgeschaltet)

    Wie kann ich diese Problem umgehen, bzw. wie könnte ich die Versionsnummer auslesen um mit ihr weiter zu arbeiten. Irgendwie macht das doch auch fast jede Forensoftware???

    Die meisten Tools nutzen dafür Javascript. Über die Anfrage gibst du die aktuelle Verison mit und prüfst in deiner "versioncheck.php" auf dem Server nach, ob die Versionsnumer exakt die ist, die du hinterlegt hast. Dann gibst du ein "aktuell" oder ein "bitte updaten" aus.

    Ich habe sogar schon Lösungen mit iframes gesehen. Das geht auch wirklich dann in jedem Browser. Bei Javascript bekommt man teils noch probleme mit der "same-domain-police".

    Für eine Hilfe bin ich jetzt schon mla dankbar.

    Gruß

    Basti

    Gruß Niklas

    --
    Man muss nicht alles wissen, man sollte aber wissen, wo das nicht gewusste zu finden ist.
    1. Die meisten Tools nutzen dafür Javascript. Über die Anfrage gibst du die aktuelle Verison mit und prüfst in deiner "versioncheck.php" auf dem Server nach, ob die Versionsnumer exakt die ist, die du hinterlegt hast. Dann gibst du ein "aktuell" oder ein "bitte updaten" aus.

      Nach was hast du da gesucht, denn ich finde "alles" nur nichts zu meinem Problem.