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

Frage Entwicklung PHP

GELÖST

Fgets langsam

Mitglied: solaris-ch

solaris-ch (Level 1) - Jetzt verbinden

22.09.2010, aktualisiert 28.09.2010, 3232 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
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 1 TagLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 2 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 2 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 2 TagenSicherheit10 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Batch & Shell
Meltdown Microsoft Prüf Script - .zip Datei leider leer
gelöst Frage von MasterBlaster88Batch & Shell13 Kommentare

Hallo zusammen, ich patche gerade unsere Windows Server bzgl. der Meltdown Lücke. Patch vorhanden, Reg Keys gesetzt Um das ...

Batch & Shell
Shell-Skript - Syntax error: Unterminated quoted string
Frage von newit1Batch & Shell13 Kommentare

Hallo Ich schreibe ein Skript das eine CSV-Datei in eine mySQL Datenbank schieben soll. Bekomme nach start des Skrips ...

E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Windows Server
DNS Forwarding an andere Domäne
Frage von detox91Windows Server9 Kommentare

Hallo, für Testzwecke haben wir bei uns eine zweite Windows Domäne (B.local) aufgebaut, welche komplett unabhängig und isoliert der ...