Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Fgets langsam

Mitglied: solaris-ch

solaris-ch (Level 1) - Jetzt verbinden

22.09.2010, aktualisiert 28.09.2010, 3245 Aufrufe, 6 Kommentare

Hallo zusammen

ich habe ein Problem mit fgets(). Folgendes Script dreht ewig lange. Dies aber nicht, weil der Server so langsam antwortet, sondern, weil fgets so lange rumnudelt.

01.
$fp 	= fsockopen("ssl://hostname:443/blubb",443, $errno, $errstr, 30); 
02.
$body = " 
03.
 
04.
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:blubb.hostname\"> 
05.
   <soapenv:Header/> 
06.
   <soapenv:Body> 
07.
      <urn:request> 
08.
         <urn:cli>0441111111</urn:cli> 
09.
         <urn:technology>adsl</urn:technology> 
10.
      </urn:request> 
11.
   </soapenv:Body> 
12.
</soapenv:Envelope>"; 
13.
 
14.
$body_length = strlen($body); 
15.
 
16.
$data 	= "POST https://hostname/blubb?wsdl HTTP/1.1 
17.
Content-Type: text/xml;charset=UTF-8 
18.
SOAPAction: \"\" 
19.
User-Agent: Jakarta Commons-HttpClient/3.1 
20.
Content-Length: $body_length 
21.
Authorization: Basic aaaaaaaaa 
22.
Host: hostname 
23.
Cookie: \$Version=0; JSESSIONID=EE4D5DSDSAD15E988A4BE6C9B51AB.0308; \$Path=/"; 
24.
 
25.
$data .= $body; 
26.
 
27.
// echo $data; 
28.
 
29.
fwrite($fp, $data); 
30.
while (!feof($fp)) { 
31.
	echo fgets($fp)."<br>"; 
32.
}
Das dauert etwa 4 Minuten. Wenn ich nur den Teil bis zur while - Schlaufe knattern lasse, gehts 2 Sekunden. Ich bin ratlos. Einerseits ist klar wo das Problem liegt, aber nicht wie ich es beheben kann.

Der Output vom Server sieht übrigens so aus:

01.
HTTP/1.1 200 OK 
02.
<br>Date: Wed, 22 Sep 2010 05:22:19 GMT 
03.
<br>Server: Apache 
04.
<br>X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5 
05.
<br>Vary: Accept-Encoding,User-Agent 
06.
<br>Connection: close 
07.
<br>Content-Type: text/xml;charset=utf-8 
08.
<br>  
09.
<br><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><response xmlns="urn:hostname"><status><ccode>OK</ccode><message>Q00 This telephone line is suitable for xDSL. </message></status><serviceprofile><ccode>OK_max300_100</ccode><message>max. 300 Kbps downstream / 100 Kbps upstream</message></serviceprofile><serviceprofile><ccode>OK_max5000_500</ccode><message>max. 5000 Kbps downstream / 500 Kbps upstream</message></serviceprofile><serviceprofile><ccode>OK_max1000_100</ccode><message>max. 1000 Kbps downstream / 100 Kbps upstream</message></serviceprofile><serviceprofile><ccode>OK_max6000_600</ccode><message>max. 6000 Kbps downstream / 600 Kbps upstream</message></serviceprofile><networkprofile><ccode>OK_5000_500</ccode><message>5000 Kbps downstream / 500 Kbps upstream</message><customerclass>business</customerclass></networkprofile><networkprofile><ccode>OK_5000_500</ccode><message>5000 Kbps downstream / 500 Kbps upstream</message><customerclass>residential</customerclass></networkprofile><linetype>analog</linetype></response></soapenv:Body></soapenv:Envelope><br>
Bedanke mich jetzt schon für die (wie immer) zahlreichen Tipps!

Grüsse, tom
Mitglied: SlainteMhath
22.09.2010 um 09:27 Uhr
Moin,

versuchs mal mit stream_get_contents() oder fread() anstatt dem fgets() oder du setzt 'mal einen Timeout mit socket_set_timeout().

lg,
Slainte
Bitte warten ..
Mitglied: 76109
22.09.2010 um 09:41 Uhr
Hallo solaris-ch!

Also, ich habe Null Ahnung von PHP, frage mich allerdings, wie aus einem Stream gelesen werden kann, in den zuvor gerade noch geschrieben wurde und der Positionszeiger auf das Ende zeigt. Sollte da nicht der Positionszeiger erst per FSEEK - oder sowas in der Art - auf 0 gesetzt werden? Möglicherweise stehen die Chance dann besser, dass die While-Schleife ein FEOF findet.

Gruß Dieter
Bitte warten ..
Mitglied: solaris-ch
22.09.2010 um 10:20 Uhr
Hi Dieter

besten Dank. Das hat leider nichts gebracht

Trotzdem danke!

Gruss, tom
Bitte warten ..
Mitglied: solaris-ch
22.09.2010 um 10:40 Uhr
Hallo Slainte

hilft alles nix :/

Gruss, tom
Bitte warten ..
Mitglied: solaris-ch
22.09.2010 um 18:42 Uhr
Hallo zusammen

Problem gelöst. Und für die Nachwelt hier noch die Lösung:

man muss die HTTP Spezifikationen genau anschauen. Dort sieht man, dass man eine Connection auch Header-mässig schliessen muss.

Was ist nun passiert, bei meinem Script, bevor ich auf die Lösung gekommen bin.

Mein Skript hat die Socketverbindung eröffnet und den Header, sowie den Body geschickt und darauf gewartet, das der Server den Empfang quasi bestätigt, damit es dann die Socket-Verbindung hätte kappen können. Da aber die Header Connection nie geschlossen wurde, wartete die Socketverbindung bis zum Timeout des Servers (ca 4 Minuten) und erst dann gings - wenn überhaupt - weiter.

Was habe ich gemacht, das es der Request nun innerhalb 2 Sekunden abgehandelt wird?
Mir helfen und zeigen lassen wie man diese Verbindung kappt. Ist - wenn man weiss wie - ganz einfach. So habe ich am Ende des Headers (bevor der Body gesendet wird!) folgendes eingefügt:

01.
Connection: close\r\n\r\n
Und siehe da, es geht. Das ganze Script sieht so aus:

01.
public function doLineCheck($cli){ 
02.
		include_once("config/config.inc.php"); 
03.
 
04.
		$xipxml = ""; 
05.
		//		$time = array(); 
06.
		$fp 	= fsockopen("ssl://pkasdasdasdasdasdasdaeck_v1",443, $errno, $errstr, 30); 
07.
		//		if (!$fp) { // wenn verbindung nicht klappt, fault setzen 
08.
		//			$this->xip_fault .= "error: $errstr ($errno)<br />\n"; 
09.
		//		} else {	// wenn verbindung ok, dann weiter 
10.
 
11.
		$body = " 
12.
<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:swiasdasdadade.net\"> 
13.
   <soapenv:Header/> 
14.
   <soapenv:Body> 
15.
      <urn:request> 
16.
         <urn:cli>$cli</urn:cli> 
17.
         <urn:technology>adsl</urn:technology> 
18.
      </urn:request> 
19.
   </soapenv:Body> 
20.
</soapenv:Envelope>"; 
21.
			 
22.
		$body_length = strlen($body); 
23.
 
24.
		$header 	= "POST https://pkg-xip-iasdasdasdasdnecheck_v1?wsdl HTTP/1.1 
25.
Content-Type: text/xml;charset=UTF-8 
26.
SOAPAction: \"\" 
27.
User-Agent: Jakarta Commons-HttpClient/3.1 
28.
Content-Length: $body_length 
29.
Authorization: Basic ZGasdasdasdasd 
30.
Host: xip-t02.asdasd.net 
31.
Cookie: \$Version=0; JSESSIONID=FE4D5DA06SDASDASD51AB.0308; \$Path=/ 
32.
Connection: close\r\n\r\n"; 
33.
		$data = $header . $body; 
34.
		fwrite($fp,$data); 
35.
		while (!feof($fp)) { 
36.
			$xipxml .= fgets($fp,1024); 
37.
38.
		fclose($fp); 
39.
		//		} 
40.
		if(preg_match("@<ns1:errormessage>(.*?)<\/ns1:errormessage>@", $xipxml, $treffer)){ 
41.
			$this->xip_fault .= "CLICHECK ERROR: " . $treffer[1] . " Reasons: VoIP Number, ULL Number or Telephone Exchange System."; 
42.
		}else{ 
43.
 
44.
			preg_match("@<linetype>(.*?)<\/linetype>@", $xipxml, $treffer); 
45.
			$this->xip_linetype = $treffer[1]; 
46.
 
47.
			if(!isset($xip_fault)){ // wenn kein fehler, variabeln zur�ckliefern 
48.
				if(isset($xip_linetype)) return $xip_linetype; 
49.
			}else{ // wenn fehler, fault zur�cksenden 
50.
				return $xip_fault; 
51.
52.
 
53.
54.
	}
Nun, so einfach ist das. Gekostet hat's mich eine Woche. Aber es ist meist stets dasselbe kleine, miese, dreckige,... Detail.

Beste Grüsse und Dank an alle die mir geholfen haben!

Tom
Bitte warten ..
Mitglied: dog
22.09.2010 um 20:41 Uhr
Deine Erklärung ist völlig Quark (deine Lösung aber eine mögliche).

Dein Code erwartet immer, dass der Stream, aus dem gelesen wird ein EOF hat.
Auf Deutsch: Du kannst while(feof()) nur dann benutzen, wenn die Datei, die gelesen wird, ein vorbestimmtes Ende hat.

Das ist aber bei HTTP niemals der Fall, denn auf TCP-Ebene hat ein Stream kein Ende, sondern nur innerhalb des HTTP-Protokolls.
Du kannst HTTP darum nur korrekt laden, wenn du die Antwort-Header des Servers interpretierst und daraus die Content-Length bzw. das Transfer-Encoding ableitest und mit fread() die korrekte Anzahl der Bytes liest.

Dein Code wird übrigens prima explodieren, wenn der Server mal als Transfer-Encoding chunked benutzt.

Darum macht man sowas auch nicht selbst, sondern benutzt das cURL Library o.Ä. - da gibt es solche Fehler nicht.
Bitte warten ..
Ähnliche Inhalte
Backup
Bandlaufwerk zu langsam?
gelöst Frage von phillipe234Backup15 Kommentare

Hi Leute wir haben bei uns im Unternehmen ein tandberg bandlaufwerk mit LTO4 Bändern, dieses Laufwerk schafft die Backups ...

Netzwerke
Netzwerkzugriff langsam
gelöst Frage von slanskyNetzwerke5 Kommentare

Hallo Leute, ich habe folgendes Problem: Wir haben mehrere Rechner innerhalb der Firma umgezogen. Das bedeutet die Rechner sind ...

Festplatten, SSD, Raid
SSD zu langsam
gelöst Frage von geforce28Festplatten, SSD, Raid18 Kommentare

Hallo Leute, ich habe mal wieder ein Problem mit meinem Rechner, es nimmt kein Ende. Habe nun ein neues ...

LAN, WAN, Wireless
Netzwerkkabel zu langsam?
gelöst Frage von benq-simensLAN, WAN, Wireless25 Kommentare

Hallo, wir haben im Haus ein geschätzt 10 Jahre altes Netzwerkkabel verlegt. Da wir nun zu einem schnelleren Internet ...

Neue Wissensbeiträge
Sicherheit

MikroTik-Router patchen, Schwachstelle wird ausgenutzt

Information von kgborn vor 11 StundenSicherheit

Am 23. April 2018 wurde von Mikrotik ein Security Advisory herausgegeben, welches auf eine Schwachstelle im RouterOS hinwies. Mikrotik ...

Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 17 StundenWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 21 StundeniOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 2 TagenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Heiß diskutierte Inhalte
Batch & Shell
Powershell: Im AD nach Rechnern mit bestimmten IP-Adressen suchen
gelöst Frage von Raven42Batch & Shell36 Kommentare

Hallo zusammen, ich suche nach einer Möglichkeit nach Computern im AD zu suchen , deren IP-Adresse mit 10.11.12. beginnt. ...

C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++34 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

Windows Server
Alten DC entfernen
Frage von smartinoWindows Server24 Kommentare

Hallo zusammen, ich habe hier eine Umgebung übernommen und erstmal einen DCDIAG gemacht. Dabei fällt auf, daß eine ganze ...