Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

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

Frage Entwicklung PHP

Mitglied: solaris-ch

solaris-ch (Level 1) - Jetzt verbinden

22.09.2010, aktualisiert 28.09.2010, 3229 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
Windows 10
gelöst Internetverbindung nach gewisser Zeit langsamer (15)

Frage von crack24 zum Thema Windows 10 ...

Microsoft Office
Excel auf TS langsam (16)

Frage von Nerofu zum Thema Microsoft Office ...

Webbrowser
Mausbewegungen langsamer in Chrome Flashanwendungen (5)

Frage von Torsten78 zum Thema Webbrowser ...

Windows 10
Langsames Windows 10 (7)

Frage von Kamoranesi zum Thema Windows 10 ...

Neue Wissensbeiträge
Windows Update

Novemberpatches und Nadeldrucker bereiten Kopfschmerzen

(14)

Tipp von MettGurke zum Thema Windows Update ...

Windows 10

Abhilfe für Abstürze von CDPUsersvc auf Win10 1607 und 2016 1607

(7)

Tipp von DerWoWusste zum Thema Windows 10 ...

RedHat, CentOS, Fedora

Fedora 27 ist verfügbar

Information von Frank zum Thema RedHat, CentOS, Fedora ...

Heiß diskutierte Inhalte
Windows Server
Kennwort vergessen bei Hyper vserver 2012r (12)

Frage von jensgebken zum Thema Windows Server ...

Linux Desktop
Bildschirmauflösung unter Linux festlegen (12)

Frage von itebob zum Thema Linux Desktop ...

Windows Userverwaltung
gelöst Administrator hat alle Rechte verloren (10)

Frage von mrdead zum Thema Windows Userverwaltung ...