[PHP] "telnet-script" sehr langsam

dark_angel

Well-Known Member
Hi,
habe mir ein kleines Skript geschustert, dass mir die im VPN angemeldeten User anzeigt.
Das Skript funktioniert soweit auch ganz gut, nur es ist höllisch lahm. Wenn ich mit 'telnet 127.0.0.1 7505' auf den Telnetdienst von OpenVPN zugreife geht alles rasend schnell. Die CPU Auslastung liegt bei 10% auch nicht gerade am Maximum.

Meine Frage ist nun, ob jemand ne schnellere Lösung hat.

PHP:
<HTML>
<HEAD>
	<TITLE>Logged in VPN Users</TITLE>
</HEAD>
<BODY>
<?php
$out = "";
$fp = fsockopen("127.0.0.1", 7505, $errno, $errstr, 5);
if (!$fp) {
	echo "$errstr ($errno)<br>";
} else {
	fputs($fp, "status\r\n");
	while(!feof($fp)) {
		$c = fgetc($fp);
		if($c === false) break;
		if($c == "\r") {
			$out .="<br>";
		} else {
			$out .= htmlentities($c);
		}
}
echo($out);
fclose($fp);
}
?>
</BODY>
</HTML>

Hier nochmal der Link, damit ihr euch von der Geschwindigkeit überzeugen könnt ^^:
http://digitalc.dyndns.org/stuff/vpn.php

Thx schomal!

Gruß,
Chris
 
Ist PHPs fgetc() ein Wrapper um fgetc(3)? Wenn ja, dann wundert es mich nicht, dass das Skript langsam ist, denn Du liest ja jedes Zeichen einzeln ein. Evtl ist der PHP Wrapper um fgets(3) schneller, falls vorhanden.
 
Jo würd ich ja gern benutzen, nur das Problem ist, dass feof() n Fehler hat und die letzte Zeile 2x durchläuft, jedoch der Zeiger beim 2. Durchlauf nicht zurückgesetzt wird und man hat n netten Fehler.
Ich schau mal, dass ich das fgets() reingefrickelt bekomme. Thx fürn Tipp.

I really thought that the feof() was TRUE when the logical file pointer is a EOF.
but no !
we need to read and get an empty record before the eof() reports TRUE.

So

$fp = fopen('test.bin','rb');
while(!feof($fp)) {
$c = fgetc($fp);
echo ftell($fp), ",";
}
echo 'EOF!';

prints for two time the last byte position.
If our file length is 5 byte this code prints

0,1,2,3,4,5,5,EOF!
 
Zu dem Thema fällt mir noch folgendes ein:

der Telnet-Dienst sendet am Anfang der Verbindung Escape-Sequenzen, die der Telnet-Client beantworten kann/soll.
Damit werden irgendwelche Parameter ausgehandelt, wozu es auch ein RFC gibt.

Evtl. kommen da auch einige der o.g. Probleme her?
 
Ich habe so etwas lang nicht mehr gemacht, aber ich weiß, dass ich immer fread verwendet habe.
 
@Kamikaze: Ist jetzt mein erstes mal. ^^ Aber dein Tipp mit fread() war ein Volltreffer! Jetzt läuft das Ding 1A. Thx dir.

@rMarkus: Thx für den Hinweis. Werde dem mal zur Optimierung nachgehen, aber nun rennt das Teil wirklich 1a.
 
Zurück
Oben