Pingen mit PHP
Hamza Raya
- 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
$ping =
ping -n 1 $host
;
echo $pingJedoch 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
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 $pingJedoch 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.
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
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
Hello,
$host = "www.teamone.de"; ## Vorführeffect
Grüße
Tom
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
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/systemlass 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
Hello Andreas,
http://de3.php.net/manual/de/language.operators.execution.php
Na gut, geb mich geschlagen. Die Kurzform hätte es also auch gebracht.
Tom
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
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
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
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
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
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
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 $pingJedoch 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