Lydia: PHP-Programm zu exe-Programm compilieren

Hallo,
ich wollte beim Start meines Windows meine IP-Adresse ausgeben.
Ich habe dazu das triviale PHP-Programm geschrieben:

<?php
    $ip = $_SERVER["REMOTE_ADDR"];  
    echo "IP Adresse: $ip";  
?>

(Edit Rolf B: Lydias Zeilenschaltungen sichtbar gemacht)

Dann dieses über PHPFlexer in eine EXE-Datei umgewandelt.

Bei der Ausführung kommt aber die Fehlermeldung:

Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3

Was bedeutet diese Fehlermeldung?Was ist falsch?
Schönen Gruß
Lydia

  1. Tach!

    <?php $ip = $_SERVER["REMOTE_ADDR"]; echo "IP Adresse: $ip"; ?>
    Bei der Ausführung kommt aber die Fehlermeldung:

    Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3

    Debugging mit Kontrollausgaben. Das ist immer die erste Amtshandlung, wenn irgendwas nicht will. Du hättest dann gesehen, dass $_SERVER["REMOTE_ADDR"] nichts ergibt. Bei einer Exe gibt es schließlich keinen Client, der von fern zugreift.

    dedlfix.

    1. Danke, gibt es eine andere Möglichkeit die IP-Adresse automatisch auszugeben? Optimal wäre es in der Taskleiste anzuzeigen.

      1. Tach!

        gibt es eine andere Möglichkeit die IP-Adresse automatisch auszugeben?

        Bevor man etwas ausgeben kann, muss man erstmal die Daten ermittelt haben. Die eigentliche Frage lautet also, wie man die IP-Adresse des Servers rausbekommt, ohne in $_SERVER nachschauen zu können. Das heißt, vielleicht steht es ja drin, aber eigentlich sind da nur Daten zum Request zu finden, der ja im Stand-Alone-Modus nicht existiert.

        Also müsste man die Netzwerk-Konfiguration befragen. Dazu habe ich aber keine direkte Funktin gefunden, welche die Netzwerk-Interfaces auflisten kann, geschweige denn Daten dazu.

        Eine Google-Suche sagte, dass es so gehen soll:

        $host= gethostname();
        $ip = gethostbyname($host);
        

        Wenn das nicht will, oder einen unbrauchbaren Hostnamen ermittelt, dann kannst du versuchen andere Windows-Programme aufzurufen, die die gewünschte Angabe aus dem System holt. ipconfig wäre eine Möglichkeit, aber da muss man die Adresse aus einer Menge anderem Text rausoperieren. Vielleicht gibt es ein anderes Systemkommando, oder was in der Powershell.

        Optimal wäre es in der Taskleiste anzuzeigen.

        Ich denke, du solltest lieber Visual Studio nehmen (gibt es kostenlos) und es mit einem echten Windows-Programm versuchen. Da wirst du bessere Erfolge und mehr Hinweise dazu im Netz finden, als PHP für diese Aufgabe vergewaltigen zu wollen.

        dedlfix.

  2. Hi,

    <?php $ip = $_SERVER["REMOTE_ADDR"]; echo "IP Adresse: $ip"; ?>
    Dann dieses über PHPFlexer in eine EXE-Datei umgewandelt.

    Bei der Ausführung kommt aber die Fehlermeldung:

    Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3

    Das ist irritierend - denn getHostByAddr wird nirgends aufgerufen. Die Fehlermeldung paßt nicht zum Programm.

    Da Du eine .exe haben willst, geh ich mal von Windows aus.

    PHP wird eigentlich gar nicht gebraucht.

    Erstelle eine .bat-Datei mit Inhalt

    ipconfig | grep -i ipv4
    pause
    

    und laß diese laufen. Wenn Du kein grep hast: das gibt's an vielen Stellen zum Download ...

    cu,
    Andreas a/k/a MudGuard

    1. Bei der Ausführung kommt aber die Fehlermeldung:

      Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3

      Das ist irritierend - denn getHostByAddr wird nirgends aufgerufen. Die Fehlermeldung paßt nicht zum Programm.

      Intern fragt PHP den DNS, da wird die Funktion aufgerufen. Passt also doch. MFG

      1. Hello,

        Bei der Ausführung kommt aber die Fehlermeldung:

        Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3

        Das ist irritierend - denn getHostByAddr wird nirgends aufgerufen. Die Fehlermeldung paßt nicht zum Programm.

        Intern fragt PHP den DNS, da wird die Funktion aufgerufen. Passt also doch.

        Welcher Localhost oder entfernte Host läuft denn gerade, wenn die EXE ausgeführt wird?

        Stellt die EXE eine Client-Server-Umgebung her (emuliert diese), oder läuft sie als Single-Mode Desktopprogramm?

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Der Variablenname $_SERVER ist ja auch verwirrend. ENV trifft es besser denn es geht um die lokale Umgebung auf dem Host selbst. MFG

          1. ENV trifft es besser denn es geht um die lokale Umgebung auf dem Host selbst.

            Wenn es denn $ENV in modernen PHP-Versionen noch gäbe. Beweis hier.

            Dedlfix hat übrigens recht: Das gezeigte Skript hat 1 Zeile, der Fehler soll in Zeile 3 sein. Schon das passt definitiv nicht. Auch passt der Fehler in gethostbyaddr() definitiv nicht zum einfachen echo $_SERVER['irgendwas']. Damit passt der Code nicht zur Fehlermeldung.

            1. Dedlfix hat übrigens recht: Das gezeigte Skript hat 1 Zeile,

              Hier ist das gezeigte Script im Original:

              
              > `<?php
              >     $ip = $_SERVER["REMOTE_ADDR"];  
              >     echo "IP Adresse: $ip";  
              > ?>`  
              
              

              Macht zsamme 4 Zeilen. MFG

              1. Dedlfix hat übrigens recht: Das gezeigte Skript hat 1 Zeile,

                Hier ist das gezeigte Script im Original:

                > `<?php
                >     $ip = $_SERVER["REMOTE_ADDR"];  
                >     echo "IP Adresse: $ip";  
                > ?>`  
                

                Macht zsamme 4 Zeilen. MFG

                1. Nach Deiner, bzw. nach Rolfs "Umformung". Gezeigt wurde es als Einzeiler.
                2. Dann verrate mir, wie
                3 | echo "IP Adresse: $ip"; 
                

                zu

                Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3
                

                führen soll. So führt man keine Diskussion.

                1. Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3
                  

                  PHPFlexer linkt Libraries aus den IP-Stacks IPv4 und IPv6 hinzu. Da sind die Funktionen gethostbyaddr() und weitere. MFG

                  1. PHPFlexer linkt Libraries aus den IP-Stacks IPv4 und IPv6 hinzu.

                    Das erklärt NICHT, warum das, zur Fehlermeldung führende gethostbyaddr() bei einem echo "IP Adresse: $ip"; aufgerufen werden sollte.

                    "hinzulinken" != "aufrufen".
                    
              2. Tach!

                Dedlfix hat übrigens recht: Das gezeigte Skript hat 1 Zeile,

                Hier ist das gezeigte Script im Original:

                > `<?php
                >     $ip = $_SERVER["REMOTE_ADDR"];  
                >     echo "IP Adresse: $ip";  
                > ?>`  
                

                Macht zsamme 4 Zeilen.

                Du hast zwar Recht, dass das Script aufgrund falscher Auszeichnung als Einzeiler im Forum zu sehen ist. Aber trotzdem kommt diese Fehlermeldung nicht von diesem gezeigten Code.

                D:\Phpstorm\xampp\xampp-7.2.7\php>php
                <?php
                    $ip = $_SERVER["REMOTE_ADDR"];
                    echo "IP Adresse: $ip";
                ?>
                ^Z
                PHP Notice:  Undefined index: REMOTE_ADDR in Standard input code on line 2
                
                Notice: Undefined index: REMOTE_ADDR in Standard input code on line 2
                IP Adresse:
                D:\Phpstorm\xampp\xampp-7.2.7\php>
                

                Der Teil, der die gezeigte Fehlermeldung produziert, ist nicht vorhanden.

                dedlfix.

                1. Hallo dedlfix,

                  ich habe die Zeilenschaltung im Originalposting mal gefixt.

                  Rolf

                  --
                  sumpsi - posui - clusi
                2. Tach!

                  Der Teil, der die gezeigte Fehlermeldung produziert, ist nicht vorhanden.

                  Nachtrag: Auch wenn man das Script durch den PHPFlexer schickt, kommt diese Fehlermeldung nicht. Es fehlen dann nur die Notice-Meldungen, deren Ausgabe wohl in der verwendeten php.ini unterdrückt ist.

                  D:\temp\phpflexer> phpflexer.exe compile test.php
                  Created test.exe
                  D:\temp\phpflexer> test.exe
                  IP Adresse:
                  D:\temp\phpflexer> type test.php
                  <?php
                      $ip = $_SERVER["REMOTE_ADDR"];
                      echo "IP Adresse: $ip";
                  ?>
                  D:\temp\phpflexer>
                  

                  dedlfix.

            2. Tach!

              ENV trifft es besser denn es geht um die lokale Umgebung auf dem Host selbst.

              Wenn es denn $ENV in modernen PHP-Versionen noch gäbe. Beweis hier.

              Siehe variables_order. $_ENV wird nicht mehr befüllt, weil der Wert für Development und Production in den ensprechenden php.ini auf GPCS gesetzt wird. $_SERVER ist der abzufragende Platz, weil die Environment-Variablen dort untergebracht werden, wie dem roten Kasten der verlinkten Seite zu entnehmen ist.

              dedlfix.

      2. Tach!

        Bei der Ausführung kommt aber die Fehlermeldung:

        Warning: gethostbyaddr(): Address is not a valid IPv4 or IPv6 address in res:///PHP/RUN(70) : eval()'d code on line 3

        Das ist irritierend - denn getHostByAddr wird nirgends aufgerufen. Die Fehlermeldung paßt nicht zum Programm.

        Intern fragt PHP den DNS, da wird die Funktion aufgerufen. Passt also doch.

        Jedenfalls nicht zu der gezeigten Code-Zeile. Da wird lediglich ins Array $_SERVER gegriffen und der Wert ausgegeben. Es gibt keine Notwendigkeit, dass PHP für die Ausgabe der IP-Adresse eine Rückwärtsnamensauflösung ausführt, die dann diese Fehlermeldung geben könnte. Für den Namen wäre auch REMOTE_HOST zuständig, nicht REMOTE_ADDR. Die Meldung passt aber auf das, was vermutlich anschließend in der nicht mehr gezeigten Zeile 3 versucht wird.

        dedlfix.

        1. Für den Namen wäre auch REMOTE_HOST zuständig,

          Nein. Für den Namen ist COMPUTERNAME zuständig, eine Umgebungsvariable der Umgebung eines Windows PC um den es hier geht. MFG

          1. Tach!

            Für den Namen wäre auch REMOTE_HOST zuständig,

            Nein. Für den Namen ist COMPUTERNAME zuständig, eine Umgebungsvariable der Umgebung eines Windows PC um den es hier geht.

            Njein. In diesem Fall war REMOTE_irgendwas ganz verkehrt. Das war aber an der Stelle nicht Gegenstand der Diskussion. Da ging es lediglich darum, dass du da einen Zusammenhang zwischen dem gezeigen Code und der Meldung gesehen hast. Nur das wollte ich klarstellen. Wenn REMOTE_irgendwas für den Anwendungsfall sinnvoll gewesen, dann ... siehe oben/meine vorige Antwort.

            Dass die Lösung des eigentlichen Problems an anderer Stelle zu suchen ist, steht auf einem anderen Blatt dieses Threads. Und dagegen hab ich auch nichts einzuwenden.

            dedlfix.

            1. Da ging es lediglich darum, dass du da einen Zusammenhang zwischen dem gezeigen Code und der Meldung gesehen hast.

              Den es mit Sicherheit auch gibt!

              Nur das wollte ich klarstellen.

              Na dann klär das mal.

  3. In Perl geht das da:

    use Socket;
    $, = ".";
    print unpack "CCCC", gethostbyname( $ENV{COMPUTERNAME} );
    
    # 10.0.0.5
    

    Nach PHP umschreiben:

    echo gethostbyname( $_SERVER['COMPUTERNAME'] );
    

    Fertig.

    1. Ja, dann stehen wir nach langer Diskussion wieder am Anfang!
      Die Frage war nicht, wie es in PHP funktioniert, denn meine vorgestellte PHP-Lösung funktionierte ja!

      1. Tach!

        Ja, dann stehen wir nach langer Diskussion wieder am Anfang!
        Die Frage war nicht, wie es in PHP funktioniert, denn meine vorgestellte PHP-Lösung funktionierte ja!

        Ach, hat sie das? Dann gab es diese Fehlermeldung also gar nicht? Was also ist nun Phase?

        Ich kann nur nochmal wiederholen, dass ich PHP hier für ein ungeeignetes Werkzeug halte. Du bekommst noch recht einfach die Angaben zum Namen und der dafür zugeordneten IP-Adresse raus. Soweit stehen wir auch gar nicht mehr am Anfang, denn dafür wurden Lösungsvorschläge gegeben. Aber dein weiterer Wunsch, am Ende ein Taskbar-Programm zu bekommen, geht mit PHP nur unschön umständlich, und das auch nicht ohne weiteres mit Bordmitteln. Du brauchst eine Zwischenschicht, mit der du an die Windows-Eigenheiten rankommst. Abgesehen davon, dass du vielleicht noch kein C# mit dem .NET-Framework kannst, kommst du damit deutlich angenehmer ans Ziel. Der Weg dahin wird bei beiden Systemen nicht grundlegend anders sein, aber PHP in diesen Weg zu zwingen, für den es nicht ausgelegt ist, ist eine undankbare Aufgabe.

        dedlfix.

        1. Ach, hat sie das? Dann gab es diese Fehlermeldung also gar nicht? Was also ist nun Phase?

          Die Fehlermeldung kam aus der exe-Datei. Ich habe im letzten Beitrag und im ersten Beitrag geschrieben, das das PHP-Script funktioniert. Und pl bringt nun eine andere Variante eines PHP-Scripts! Daher meine Antwort an pl. Von einer PHP-Lösung habe ich mich schon längst verabschiedet.

          1. Tach!

            Ach, hat sie das? Dann gab es diese Fehlermeldung also gar nicht? Was also ist nun Phase?

            Die Fehlermeldung kam aus der exe-Datei.

            Das ist für mich nicht nachvollziehbar.

            Von einer PHP-Lösung habe ich mich schon längst verabschiedet.

            Dann wäre es nett gewesen, wenn du uns längst davon erzählt hättest, damit wir uns nicht länger mit PHP-Lösungen für das Problem zu beschäftigen brauchen.

            dedlfix.

      2. Hallo Lydia,

        denn meine vorgestellte PHP-Lösung funktionierte ja!

        Du möchtest dein PHP aber als Phpflexer-EXE lokal laufen lassen, und nicht remote auf einem Webserver, richtig? Das ist ein gewaltiger Unterschied.

        REMOTE_ADDR ist - wie schon erwähnt - ein Wert, der vom Webserver bereitgestellt wird, wenn das PHP Script über HTTP aufgerufen wird. Und der Wert ist auch nur dann sinnvoll, wenn der Webserver auf einer anderen Maschine ist als der Client. Mein lokaler PHP Webserver (IIS unter Windows) gibt mir bei einem Aufruf von localhost/testweb/phpinfo.php als REMOTE_ADDR den Wert ::1 aus, also die IPv6 localhost-Adresse.

        WENN aber der Webserver auf einer anderen Maschine ist, ist REMOTE_ADDR immer noch nicht zuverlässig. Ein NAT-Router auf dem Weg zwischen Client und Server verändert die Adresse.

        Das gezeigte Batchfile, das IPCONFIG aufruft, kommt der Sache schon näher. Und es zeigt auch die weiteren Probleme deiner Aufgabenstellung: Ein Computer muss nicht unbedingt nur eine IP haben. Er kann bei Parallelbetrieb der IPv4 und IPv6 Stacks zwei Adressen haben. Und je nach Szenario gibt es auch mehr als einen Netzwerkadapter, jeder mit eigener IP. Es gibt diverse Kriterien, die bestimmen, welcher Adapter verwendet wird.

        Und wenn Du hinter einem NAT-Router sitzt und wissen willst, mit welcher IP Du auf einem Internet-Server ankommst, hilft Dir weder PHP noch IPCONFIG, dann musst Du deinen Router befragen welche externe IP ihm der Provider gegeben hat, oder Du musst einen Webservice jenseits des Routers aufrufen, der Dir die IP zurückmeldet.

        Die Frage, wie man das Ergbnis in "die Taskleiste" bekommt, ist dann nochmal eine andere. Das ist Windows-Programmierung. Meinst Du überhaupt die Taskleiste? Oder vielleicht den Systray? In der Taskleiste steht ein Icon pro laufendem Programm (ggf. mehrere gleichartige Programme übereinander gestapelt). Im Systray sind diese Winz-Icons ohne Text, die ggf. ein Tooltip haben und meistens ein Kontextmenü.

        Und dann gibt's noch Programme wie die Sprachenleiste (die DE/EN-Umschaltung), die es fertigbringen, sich im Systray zu zeigen aber mehr als ein Icon anzuzeigen. Das sind jetzt sehr spezielle Windows APIs, die ich selbst noch nicht anprogrammiert habe - aber die mit PHP definitiv nicht verfügbar sind. Vermutlich musst Du da auf C/C++ hinunter, in C# (Windows Forms) habe ich dazu noch nie was gesehen. Dedlfix offenbar schon, also könnte das gehen.

        Tipp: BGINFO. Dieses Programm modifiziert das Hintegrundbild deines Desktop und zeigt darüber eine Menge Infos über dein System an. Vielleicht ist das ja genau das, was Du brauchst.

        Rolf

        --
        sumpsi - posui - clusi
  4. Falls Du eine der lokalen IP-Adressen auf den Desktop-Hintergrund schreiben lassen willst hilft Dir z.B. BgInfo.

    Freilich geht das, wenn man das wirklich so will, auch mit PHP. Führe etwas wie "$data=`ipconfig`" aus. Dann kannst Du mit explode(), foreach(), preg_replace(), explode() die Zeilen isolieren und bearbeiten(mehrere aufeinanderfolgende Spaces durch genau eines ersetzen), die einzelnen Spalten isolieren, schauen in welcher das gewünschte Netzgerät und also die gewünschte IP steht und dann, auch das kann PHP, mit imageCreate(), imageString() aus der gd-lib die IP auf das Hintergrundbild malen. Das Hintergrundbild muss dann nur vom angemeldeten Benutzer bearbeitbar sein ... Mach das also einfach mit einem Hintergundbild aus dem eigenen Ordner. Zuletzt muss die Chose in den eigenen Autostart. Ich weiß jetzt nicht, ob Du noch was tun musst, damit Windows davon informiert wird, dass das Hintergrundbild mal neu gelesen werden müsste.

    Übrigens:

    <?=gethostbyname( gethostname() );?>
    

    Liefert bei mir (unter XUbuntu) zuverlässig 127.0.1.1. Es würde auch die IP liefern, von welcher das DNS (inclusive der Hosts-Datei) behauptet, dass diese zum Name des Rechners passt. Es kann also (in missgestalteten Netzwerken) so sein, dass Du dann auf eine falsche Information vertraust.

    1. P.S.

      Unter Linux geht es mit:

      ifconfig enp5s0 | grep "inet " | sed -E -e "s/ +/ /g" | awk -F " " '{ print $2; }'
      

      192.168.1.2

      Du kannst ipconfig statt ifconfig verwenden und natürlich die guten alten GNU-Utilities for Win32 (da sind sehr nützliche Werkzeuge wie grep, sed und awk dabei) herunterladen und benutzen. "enp5s0" ist mein Netzgerät. Das musst Du natürlich austauschen.

    2. BgInfo wird auch von Microsoft empfohlen. Hier der direkte Link:

      https://docs.microsoft.com/de-de/sysinternals/downloads/bginfo

    3. Hallo ursus,

      bei ipconfig würde ich dann aber auch gründlich sein und ipconfig /all aufrufen :)

      Rolf

      --
      sumpsi - posui - clusi
      1. bei ipconfig würde ich dann aber auch gründlich sein und ipconfig /all aufrufen :)

        Klar! Sonst weiß man ja nicht, was man da tut

        wegduck

        Hier mal das Äquivalent der Linux-Ausgabe auf meinem Rechner:

        ifconfig | grep "inet " | sed -E -e "s/ +/ /g" | awk -F " " '{ print $2; }'
        
        192.168.1.2
        127.0.0.1
        172.16.15.1
        172.16.61.1
        

        Jetzt muss man nur noch den Lokalhost und die IPs jener virtuellen Geräte, die VM-Ware anlegt, ausfiltern:

        ifconfig | grep "inet " | sed -E -e "s/ +/ /g" | awk -F " " '{ print $2"/"$4; }' | grep -Pv '^127\.|^172\.16\.15\.|172\.16\.61\.'
        
        192.168.1.2
        

        und vielleicht auch die Netzwerkmaske zeigen:

        ifconfig | grep "inet " | sed -E -e "s/ +/ /g" | awk -F " " '{ print $2"/"$4; }' | grep -Pv '^127\.|^172\.16\.15\.|172\.16\.61\.'
        
        192.168.1.2/255.255.255.0