php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.09.2004, 11:58  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard fsockopen: while(!feof($fp)) dauert bei manchen Servern 15 s

Hallo,

wenn ich einen HTTP-Request per Hand absenden will, benutze ich libCurl (klappt immer) oder fsockopen.
Mit fsockopen wird bei manchen Servern aber das Ende der Übertragung irgendwie nicht korrekt erkannt und die while(!feof($fp))-Schleife dauert z. B. 15 Sekunden, wobei 14,9 Sekunden für das letzte fgets() draufgehen.

Kann mir jemand entweder sagen, woran das liegt oder wie ich mit curl die Header-Zeilen stärker beeinflussen kann?

PHP-Code:
<?php 
header
('Content-Type: text/html'); 

$t0 explode(' 'microtime()); 

$fp fsockopen('web.de'80); 

echo 
'<pre>'

$get 
'GET / HTTP/1.1' "\r\n"
'Host: web.de'   "\r\n"
"\r\n"

fputs($fp$get); 

$content ''
while (!
feof($fp)) 
    
$content .= fgets($fp); 

fclose($fp); 
$t1 explode(' 'microtime()); 
echo 
'schnell: ' . ($t1[0]-$t0[0]+$t1[1]-$t0[1]) . " s\r\n"

preg_match('#^(.+)\r?\n\r?\n#Us'$content$header); 

echo 
$header[1]; 


$t0 explode(' 'microtime()); 

$fp fsockopen('phpfriend.de'80); 

echo 
'<pre>'

$get 
'GET / HTTP/1.1' "\r\n"
'Host: phpfriend.de'   "\r\n"
"\r\n"

fputs($fp$get); 

$content ''
while (!
feof($fp)) 
    
$content .= fgets($fp); 

fclose($fp); 
$t1 explode(' 'microtime()); 
echo 
'lahm: ' . ($t1[0]-$t0[0]+$t1[1]-$t0[1]) . " s\r\n"

preg_match('#^(.+)\r?\n\r?\n#Us'$content$header); 

echo 
$header[1] . '<pre>'
?>
tapferesschneiderlein ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.09.2004, 13:22  
Erfahrener Benutzer
 
Registriert seit: 17.10.2003
Beiträge: 243
MrMarco
Standard

Code:
while (!feof($fp))
    $content .= fgets($fp);
Versuche mal eine Optimiertere Abfrage, in welcher du größere Mengen Daten abrufst. Ok, geht auch so, sieht aber für mich persönlich unsauber aus und ist CPU-Lastig.

Wegen deiner Frage... mach das ganze mal nur mit wget und prüfe da mal die Reaktionszeiten. Sind sie kürzer, dann bau das fgets mal um und rufe größere Datenmengen ab. Sind sie dann immer noch nicht besser, klemm ein Watcher zwischen, mittels den du den Port abfragst und den Netztraffic prüfst.
MrMarco ist offline   Mit Zitat antworten
Alt 13.09.2004, 14:49  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Zitat:
Zitat von MrMarco
[code]Versuche mal eine Optimiertere Abfrage, in welcher du größere Mengen Daten abrufst.
Wie???

Zitat:
Wegen deiner Frage... mach das ganze mal nur mit wget
Häh???

Zitat:
bau das fgets mal um und rufe größere Datenmengen ab.
...?

Zitat:
klemm ein Watcher zwischen, mittels den du den Port abfragst und den Netztraffic prüfst.
Mmh, ich kann leider mit den gemachten Vorschlägen wenig anfangen. Könntest Du das für mich vielleicht am Beispiel zeigen?



(Als »Watcher« käme z. B. die Firewall-Statusanzeige in Frage, die mir eine aufgebaute Verbindung von php.exe zum entsprechenden Host anzeigt. Der nach Sekundenbruchteilen angezeigte Traffic entspricht der Endsumme der Daten, allerdings bleibt die Verbindung dann noch mehrere Sekunden stehen und wartet auf irgendwas. Dieses Verhalten entspricht auch den Anzeigen in der while-Schleife plazierter time()-Ausgaben.)
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 13.09.2004, 15:21  
Erfahrener Benutzer
 
Registriert seit: 17.10.2003
Beiträge: 243
MrMarco
Standard

@Admins: Bitte den Beitrag nach Anfänger verschieben. Die Grundlegenden Dinge wie die Kenntniss über den 2. Parameter von fgets

Code:
string fgets ( resource handle [, int length])
erwarte ich bei den Fortgeschrittenen schon. Sorry, aber ich empfehle dir dringend mal in der Doku von PHP auf www.php.net vorbei zu sehen.
MrMarco ist offline   Mit Zitat antworten
Alt 13.09.2004, 16:19  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

// Irgendwie schlecht gelaunt heute?

Ich habe es bereits mit sowohl kleineren als auch größeren Werten (bis 64000) probiert, denke aber nicht, daß das für die Dauer relevant ist.
Beispiel:
Ich lasse mir nach jedem fgets($fp) [also ohne length] die vergangene Zeit ausgeben.

1 (17): 0.0901 s
2 (37): 0.0903 s
3 (36): 0.0905 s
4 (25): 0.0906 s
5 (64): 0.0908 s
6 (40): 0.0909 s
7 (79): 0.0911 s
8 (18): 0.0912 s
9 (46): 0.0914 s
...
445 (170): 0.1514 s
...
456 (8): 0.1529 s
457 (8): 0.1530 s
458 (1): 0.1532 s
459 (2): 0.1533 s
460 (3): 0.1535 s
461 (2): 0.1536 s
462 (0): 15.0910 s

In der Klammer stehen die gelesenen Bytes, Zeile 445 ist die längste und damit immer noch unter 1024. Das Warten passiert erst am Ende. Daß es hier (reproduzierbar) glatt 15 Sekunden sind, läßt mich einen Timeout-Wert und kein korrektes EOF vermuten.

Da aber sowohl Browser als auch curl, file() und file_get_contents() die Seite in 0,14 s laden, müssen die wohl irgendwas anders machen. Aber was?
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 13.09.2004, 16:24  
Erfahrener Benutzer
 
Registriert seit: 17.10.2003
Beiträge: 243
MrMarco
Standard

Zitat:
Zitat von tapferesschneiderlein
// Irgendwie schlecht gelaunt heute?
Nein, aber genau dieser Thread kam vor ein paar Tagen (afaik 2 Wochen) schonmal hier vor und irgendwann wird es wirklich ermüdend den gleichen Sermon laufend runterzubeten.

Ich erwarte von jedem der Hilfe sucht das gleiche was ich auch immer mache.

1. Dokumentation lesen
2. Googeln
3. Boardsuche benutzen



Und eine Lösung haben wir damals auch nicht gefunden. Meine Vermutung ist, das es einen Implementationsfehler in PHP beim Webaccess über fgets gibt.

Da du die Seiten mittels fgets ließt... stellst du auch sicher das der Webserver ein Signal bekommt, das der Client die Daten erhalten hat?

Du hast eine 2-Wege Kommunikation mittels TCP aufgemacht und ich kann mir durchaus vorstellen, das der Webserver brav auf ein RECEIVED o.ä. wartet und nach einem eigenen Timeout dann die Verbindung abbricht.
MrMarco ist offline   Mit Zitat antworten
Alt 13.09.2004, 16:52  
Erfahrener Benutzer
 
Registriert seit: 30.06.2004
Beiträge: 619
tapferesschneiderlein
Standard

Zitat:
Zitat von MrMarco
stellst du auch sicher das der Webserver ein Signal bekommt, das der Client die Daten erhalten hat?
Aha. Und Du meinst also, daß fgets() ihm dies nicht übermittelt.
Wenn das so wäre, gibt es die Möglichkeit, dieses Signal manuell zu übermitteln und wann? Mit einem neuen fputs() nach jedem fgets()?

Aber ich bin hier vielleicht nicht unbedingt auf fsockopen angewiesen, wenn mir jemand einen Tip geben kann, wie ich z. B. bei curl den Host-Header beeinflussen kann ...
tapferesschneiderlein ist offline   Mit Zitat antworten
Alt 13.09.2004, 18:47  
Erfahrener Benutzer
 
Registriert seit: 17.10.2003
Beiträge: 243
MrMarco
Standard

Auf der Seite von CURL habe ich folgendes gefunden zu deiner Frage:

Zitat:
When a server receives the request the host is not given in the GET line.
the GET looks like :

GET /path HTTP/1.1
Host: hostname.

The GET line contains the host only in the proxy requests.
Hast du schonmal in der Doku von CURL nachgesehen?
MrMarco ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php fsockopen fgets, php fsock, while(!feof($fp)), php fgets timeout, while feof, fsockopen php, fsockopen feof, php fsockopen feof, fsockopen fgets dauert, fsockopen while, fsockopen dauert lange, feof fsockopen, while (!feof($fp)), while(!foef, fgets dauert lange, while (!feof($fp)) {, fread fsockopen dauert lange, http://www.php.de/php-fortgeschrittene/8877-fsockopen-while-feof-fp-dauert-bei-manchen-servern-15-s.html, dokumentation fsockopen, fsockopen timeout

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:56 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.