Hamza Raya: Pingen mit PHP

Hallo Leute

Ich möchte mit PHP einen Host anpingen um dessen erreichbarkeit zu überprüfen. Das habe ich so gelöst.

$ping = ping -n 1 $host;
echo $ping

Jedoch wird nichts ausgegeben... Warum ? Gibt es nicht vielleicht schon eine fertige Ping Funktion ? warum wird der DOS Befehl nicht ausgeführt ?

Dankbar für jede Hilfe

Gruss
H. Raya

  1. $ping = ping -n 1 $host;
    echo $ping

    Jedoch wird nichts ausgegeben... Warum ? Gibt es nicht vielleicht schon eine fertige Ping Funktion ? warum wird der DOS Befehl nicht ausgeführt ?

    ner variable was zuweisen ?? - was php ist weisst du aber oder ?

    1. lies das handbuch
    2. schau genau bei exec nach
    3. lies das handbuch

  2. Ich möchte mit PHP einen Host anpingen um dessen erreichbarkeit zu überprüfen. Das habe ich so gelöst.

    $ping = ping -n 1 $host;
    echo $ping

    Jedoch wird nichts ausgegeben... Warum ? Gibt es nicht vielleicht schon eine fertige Ping Funktion ? warum wird der DOS Befehl nicht ausgeführt ?

    Das ist nie im Leben ein DOS-Befehl, den Du da schreibst. Von der Syntax her sieht es ein bischen aus wie ein Bash Shell Script (`).
    Ich kann nur empfehlen, gründlichst das Manual zu studieren, damit Du Dir erst mal klar wirst, welche Sprache Du überhaupt verwendest.

    1. moin!

      ich glaube du solltest dir ersteinmal klar werden welches os der server besitze denn wenn da linux läuft dann werden Consolenbefehle für windows wohl kaum weiterhelfen und zweitens würde ich an deiner stelle mal überlegen was du da in php überhaupt geschrieben hast.

      aso, und hier ist der link zu der seite die jeder php'ler kenne sollte: http://www.php.net/manual/

      tschau

  3. Hello,

    Ich möchte mit PHP einen Host anpingen um dessen erreichbarkeit zu überprüfen. Das habe ich so gelöst.

    $ping = ping -n 1 $host;
    echo $ping

    Ich würde vermuten, dass das _fast_ funktionieren könnte. Du müsstest die Befehlsausgabe nur nicht auf die Standardausgabe lenken, sondern an den Programmloader (Shell).

    $ping = ping -n 1 $host;
    $lastLine = exec($ping);
    echo $lastLine;

    Das könnte ggf. funktionieren. Ich probier's mal
    ...
    .....
    ........
    Hat leider nicht geklappt.

    Aber so klappt's bei Linux:

    <?php  ### ping.php ###

    $host = "teamone.de";
    $ping = "ping -c 1 $host";
    $lastLine = exec($ping);
    echo $lastLine;

    ?>

    Du lagst also gar nicht sooo falsch. lass Dich hier bloß nicht zu sehr abschrecken durch die ewigen faq-reiter und "Oberlehrer".
    "Versuch macht kluch" und nicht jeder Tipp führt gleich zum Erfolg. Manchmal führt aber auch gemeinsames Raten zum Ziel.

    Grüße

    Tom

    1. Hello,

      $host = "www.teamone.de";    ## Vorführeffect

      Grüße

      Tom

    2. Hi!

      $ping = ping -n 1 $host;
      $lastLine = exec($ping);
      echo $lastLine;

      Das könnte ggf. funktionieren. Ich probier's mal
      ...
      .....
      ........
      Hat leider nicht geklappt.

      3 kleine Lesetipps:

      http://de3.php.net/manual/de/language.operators.execution.php
      http://de3.php.net/shell-exec
      http://de3.php.net/system

      lass Dich hier bloß nicht zu sehr abschrecken durch die ewigen faq-reiter und "Oberlehrer".

      "Versuch macht kluch" und nicht jeder Tipp führt gleich zum Erfolg. Manchmal führt aber auch gemeinsames Raten zum Ziel.

      Manchmal ist "Doku lesen" aber auch nicht das dümmste ;-)

      Grüße
      Andreas

      1. Hello Andreas,

        Hat leider nicht geklappt.

        3 kleine Lesetipps:

        http://de3.php.net/manual/de/language.operators.execution.php
        http://de3.php.net/shell-exec
        http://de3.php.net/system

        lass Dich hier bloß nicht zu sehr abschrecken durch die ewigen faq-reiter und "Oberlehrer".
        "Versuch macht kluch" und nicht jeder Tipp führt gleich zum Erfolg. Manchmal führt aber auch gemeinsames Raten zum Ziel.

        Manchmal ist "Doku lesen" aber auch nicht das dümmste ;-)

        Wieso hast Du denn die Lösung abgeschnitten?
        Musst schon zu Ende lesen...

        [pref:t=62693&m=354759] bitte nach unten scrollen *grins*

        Grüße

        Tom

        1. Hello Andreas,

          http://de3.php.net/manual/de/language.operators.execution.php

          http://de3.php.net/shell-exec
          http://de3.php.net/system

          Na gut, geb mich geschlagen. Die Kurzform hätte es also auch gebracht.

          Tom

        2. Hi!

          Wieso hast Du denn die Lösung abgeschnitten?
          Musst schon zu Ende lesen...

          [pref:t=62693&m=354759] bitte nach unten scrollen *grins*

          Ich hab das schon gelesen, nur kann man auf den von mir verlinkten Seiten des Manuals genau nachlesen wie der Backstick-Operator funktioniert, also warum Dein erster Versuch nicht geklappt hat, und man kann nachlesen wie man die komplette Ausgabe des ausgeführten Befehls erhält, einmal als Rückgabewert und einmal als direkte Ausgabe. Nicht immer reicht die letzte Zeile des Outputs.

          Grüße
          Andreas

          1. Hello,

            Ich hab das schon gelesen, nur kann man auf den von mir verlinkten Seiten des Manuals genau nachlesen wie der Backstick-Operator funktioniert, also warum Dein erster Versuch nicht geklappt hat, und man kann nachlesen wie man die komplette Ausgabe des ausgeführten Befehls erhält, einmal als Rückgabewert und einmal als direkte Ausgabe. Nicht immer reicht die letzte Zeile des Outputs.

            Jau, hab ich ja eingesehen. Ich hatte eben "nur eine Idee" und die hat funktioniert. Eigentlich will ich es ja sonst auch immer genauer wissen. Man lernt eben nie aus ;-)

            Weißt Du denn, wie man gleiche Ergebnis ohne Shell erreichen kann?
            Das hatte wir ja die letzten Tage schon mal gesucht.

            Grüße

            Tom

            1. Hallo!

              Jau, hab ich ja eingesehen. Ich hatte eben "nur eine Idee" und die hat funktioniert. Eigentlich will ich es ja sonst auch immer genauer wissen.

              sehr vernünftig ;-)

              Man lernt eben nie aus ;-)

              wem sagst Du das.... ;-)

              Weißt Du denn, wie man gleiche Ergebnis ohne Shell erreichen kann?

              gar nicht, es sei denn Du erweiterst PHP im Quellcode, oder schreibst eine eigene Erweiterung in C.

              In Programmiersprachen wie PHP und auch Java wird sowas normalerweise nicht benötigt, daher ist es nicht implementiert(auch nicht in Java). Das Problem liegt darin, dass ping über das ICMP Protokoll funktioniert, und das kannst Du aus PHP heraus nicht verwenden. Die verfügbaren Protokolle findest Du im Manual ;-)
              http://de3.php.net/transports

              Grüße
              Andreas

              1. Hello,

                Weißt Du denn, wie man gleiche Ergebnis ohne Shell erreichen kann?
                gar nicht, es sei denn Du erweiterst PHP im Quellcode, oder schreibst eine eigene Erweiterung in C.

                Das Problem liegt darin, dass ping über das ICMP Protokoll funktioniert, und das kannst Du aus PHP heraus nicht verwenden. Die verfügbaren Protokolle findest Du im Manual ;-)
                http://de3.php.net/transports

                Ok, vielen Dank. Das leuchtet ein. Nur UDP (für den DNS-Teil von Ping) wäre da und das reicht dann also nicht.

                Kann ich also die Variante mit den Backticks als elegenest mögliche in meine Sammlung aufnehmen.

                Grüße

                Tom

                1. Hello,

                  Das Problem liegt darin, dass ping über das ICMP Protokoll funktioniert

                  Noch ein Gedanke dazu. Eigentlich ist ja auch Ping dann keinesfalls der Weiseheit letzter Schluss, um die Erreichbarkeit des Hosts zu testen. ICMP könnte ja auch generell abgeschaltet sein. HTTP kann doch dann trotzdem funktionieren, oder?

                  Tom

                  1. Hi!

                    Noch ein Gedanke dazu. Eigentlich ist ja auch Ping dann keinesfalls der Weiseheit letzter Schluss, um die Erreichbarkeit des Hosts zu testen. ICMP könnte ja auch generell abgeschaltet sein. HTTP kann doch dann trotzdem funktionieren, oder?

                    Ja. Daher würde ich genau das testen wovon Du wissen willst dass es läuft. Und für TCP/UDP brauchst Du auch keine Systemaufrufe ;-)

                    Grüße
                    Andreas

  4. Hallo!

    Ich möchte mit PHP einen Host anpingen um dessen erreichbarkeit zu überprüfen. Das habe ich so gelöst.

    $ping = ping -n 1 $host;
    echo $ping

    Jedoch wird nichts ausgegeben... Warum ? Gibt es nicht vielleicht schon eine fertige Ping Funktion ? warum wird der DOS Befehl nicht ausgeführt ?

    Hm, ich habe keine Ahnung wie die Shell-Umgebung von PHP unter Windows aussieht(und schon gar nicht speziell bei Dir), wenn man Systemaufrufe startet. Eigentlich sieht das so richtig aus, aber vieleicht solltest Du mal den kompletten Pfad zur ping.exe versuchen? Ich verwende eigentlich lieber shell_exec(), dazu habe ich mehr Vertrauen ;-)

    Du solltest den Befehl vielleicht mal testweise mit exec() oder system() ausführen, denn diese bietet im Gegesatz zu den anderen Systemaufrufen die Möglichkeit einen "Statuswert" zu erzeugen, der Dir sagt ob der Aufruf in der Shell geklappt hat, siehe http://de3.php.net/manual/en/function.system.php für Details (ich habe bewußt die englische Version verlinkt, da diesbezüglich aktueller)

    Nur zum testen würde ich mal folgendes probieren(ungetestet):

    <?php
    echo '<pre>';
    $last_line = system('ping web.de', $retval);
    echo '
    </pre>
    <hr>Last line of the output: '.var_dump($last_line).'
    <hr>Return value: '.var_dump($retval);
    ?>

    Poste mal die Ausgabe des Scriptes, und versuche es mal mit dem absoluten Pfad zur ping.exe.

    Variablen in einem Systemaufruf zu verwenden ist ein potentielles Sicherheitsrisiko, wenn $host z.B. aus $_POST['host'] kommt, kann das sehr gefährlich werden. eigentlich sollte man das wo geht vermeiden, und sonst solltest Du Dir auf alle Fälle folgende Funktionen ansehen:
    http://de3.php.net/escapeshellcmd
    http://de3.php.net/escapeshellarg

    Grüße
    Andreas