Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung PHP

Mitglied: solaris-ch

solaris-ch (Level 1) - Jetzt verbinden

22.09.2010, aktualisiert 28.09.2010, 3194 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 ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows Server
Server sehr langsam bei vielen kleinen Dateien (5)

Frage von MichiBLNN zum Thema Windows Server ...

Festplatten, SSD, Raid
Samsung SSD zu langsam (20)

Frage von Protected zum Thema Festplatten, SSD, Raid ...

Netzwerkgrundlagen
gelöst Kopiervorgang im Gigabit Heimnetzwerk mit 2 NICs langsam (20)

Frage von John.D zum Thema Netzwerkgrundlagen ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...