PING-Script arbeitet sehr langsam..

5-8 Sekunden um 2 Pings auszugeben?
Da stimmt wohl irgendwo anderes etwas nicht.
Oder werden mit dem Script noch mehr Funktionen abgearbeitet?

[edit]
So, ich habe jetzt mal das Script von meinem Server (im Intranet) auf tutorials.de angesetzt:
Code:
PING www.tutorials.de (193.28.88.250): 56 data bytes
64 bytes from 193.28.88.250: icmp_seq=0 ttl=50 time=32.4 ms
64 bytes from 193.28.88.250: icmp_seq=1 ttl=50 time=32.1 ms
 
--- www.tutorials.de ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 32.1/32.2/32.4 ms
[/edit]
 
Zuletzt bearbeitet:
nene sorry also ich meinte für 4 pings...mit 1ms rücklaufzeit...das ist das einzige was in dieser datei steht..
 
Siehe oben..... dass hat max. 2 Sekunden gedauert.

[edit]
Wenn dein Server auch eine Verbindung nach aussen aufbauen kann, dann versuche es auch mal mit ping -c 2 www.tutorials.de
[/edit]
 
Zuletzt bearbeitet:
Ich bin ja allgemein nicht wirklich Freund von exec(), system() und wie sie alle heissen.

Daher hier mal mein Vorschlag zum Thema:
PHP:
<html>
<body>
<?php
if ((isset($_POST['startping'])) && (!empty($_POST['host'])) && (!empty($_POST['port'])))
	{
		$host=$_POST['host'];
		$port=$_POST['port'];
		$starttime=microtime();
		$socket=@fsockopen($host,$port);
		$endtime=microtime();
		if ($socket!=false)
			{
				fclose($socket);
				list($msec,$sec)=explode(" ",$starttime);
				$starttime=(float)$msec+(float)$sec;
				list($msec,$sec)=explode(" ",$endtime);
				$endtime=(float)$msec+(float)$sec;
				$pingtime=($endtime-$starttime)*1000;
				echo $host.' ('.$port.'): '.round($pingtime,2).' ms<br>';
			}
		else
			{
				echo 'Port '.$port.' could not be reached on '.$host.'<br>';
			}
	}
?>
<form method="post" action="ping.php">
Host:<input type="text" name="host" value="localhost"><br>
Port:<input type="text" name="port" value="80"><br>
<input type="submit" name="startping" value="Ping">
</form>
</body>
</html>

Dies ist kein ICMP-Ping, sondern ein TCP-Ping an einen bestimmten Port. Der muss halt offen sein. Bei Windows-Rechnern findet man haeufig in der Regel Port 139, im Web eben Port 80. Da bei Unixen oft SSH laeuft, kann dort Port 22 genutzt werden.

Soweit funktioniert das Script ganz gut, auch die Zeiten werden, wie's aussieht, recht akkurat ausgegeben. In der Regel erhalte ich hier das gleiche Ergebnis wie beim Ping in der Shell.

So, hab das Script grad mal was ueberarbeitet, jetzt kann auch die Anzahl der Pings angegeben werden.
PHP:
<html>
<body>
<?php
if ((isset($_POST['startping'])) && (!empty($_POST['host'])) && (!empty($_POST['port'])) && (!empty($_POST['numpings'])))
	{
		$host=$_POST['host'];
		$port=$_POST['port'];
		$numpings=$_POST['numpings'];
		for ($x=0;$x<$numpings;$x++)
			{
				$starttime=microtime();
				$socket=@fsockopen($host,$port);
				$endtime=microtime();
				if ($socket!=false)
					{
						fclose($socket);
						list($msec,$sec)=explode(" ",$starttime);
						$starttime=(float)$msec+(float)$sec;
						list($msec,$sec)=explode(" ",$endtime);
						$endtime=(float)$msec+(float)$sec;
						$pingtime=($endtime-$starttime)*1000;
					}
				else
					{
						$pingtime=-1;
					}
				if ($pingtime!=-1)
					{
						echo $host.' ('.$port.'): '.round($pingtime,2).' ms<br>';
					}
				else
					{
						echo 'Port '.$port.' could not be reached on '.$host.'<br>';
					}
				flush();
			}
	}
?>

<form method="post" action="ping.php">
Host:<input type="text" name="host" value="localhost"><br>
Port:<input type="text" name="port" value="80"><br>
Pings:<input type="text" name="numpings" value="4"><br>
<input type="submit" name="startping" value="Ping">
</form>
</body>
</html>
 
Zuletzt bearbeitet:
stanleyB hat gesagt.:
Was spricht eigentlich gegen PEAR`s NET PING?

Gruesse,
stanleyB
Das Wetter. ;)

Nutzt die Komponente ICMP?
Wenn ja werd ich mir das mal ansehen, wuerde mich schon interessieren wie man mittels PHP ICMP-Pakete erstellt und verschickt.

Hab grad noch was gefunden was gegen diese PEAR-Komponente spricht.
Es nutzt das Ping-Binary, also arbeitet mit exec()
Da find ich mein kleines Script schon besser. Ist dann zwar kein ICMP-Ping, aber ein TCP-Ping tut's ja auch. Port 80 ist im Internet in der Regel eh erreichbar, also hat man auch kein Problem.
 
Zuletzt bearbeitet:
Ich persönlich halte nicht viel von Birnen (pear), da es nicht jeder Server/Apache Version Standardmäßig unterstützt und teilweise sogar auf manchen Systemen nicht installierbar ist...
 
aKraus hat gesagt.:
Ich persönlich halte nicht viel von Birnen (pear), da es nicht jeder Server/Apache Version Standardmäßig unterstützt und teilweise sogar auf manchen Systemen nicht installierbar ist...
Quatsch. Ganz grosser Quatsch. Solange ein . im Include_path ist, kann man die Dinger einfach im Docroot ablegen - installieren kann man es also ueberall. Und da Du ja herausgefunden hast, dass manche Apache-Versionen es nicht unterstuetzen, kannst Du uns ja sicher auch erklaeren, was denn der Apache damit zu tun hat...

Edit: Achja, reptiler: Ein TCP-Ping ist bei weitem nicht so gut/zuverlassig wie ein ICMP-Ping.
 
@JR: Mir faellt nur leider kein Weg ein wie ich mit PHP ein ICMP-Paket erstellen und absenden sollte. Ich denke das ist dann nun wirklich nicht vorgesehen.
Mit fsockopen kann man TCP- und UDP-Verbindungen aufbauen, aber von ICMP hab ich bisher nirgends was gelesen.
Ich bin der Meinung, dass mein kleines Script ganz gut laeuft. Natuerlich muss man einen offenen Port kennen im Gegensatz zum ICMP-Ping, aber wenigstens ist diese Variante platformunabhaengig und hat auch keine Probleme mit dem SafeMode, was beides bei der exec()-Variante durchaus der Fall ist.
 
Ich habe auch nicht gesagt, dass die exec()/Variante besser ist. Aber ein TCP-Ping ist auch nicht das wahre. Er funktioniert nur auf einem offenen Port und ist von daher, im Grunde genommen, unnuetz, weil er keine Ping-Funktionalitaet bietet, sondern nur einen gebenchmarketen Portscan auf einem Port. Wahrscheinlich ist PHP einfach nicht das beste Mittel um zu pingen. *schulterzuck*
 
Zurück