phpbar.de logo

Mailinglisten-Archive

[php] Zeitproblem mit fread

[php] Zeitproblem mit fread

Yannik Hampe yannik at cipher-code.de
Die Sep 11 22:01:55 CEST 2007



Michael Hansen wrote:
> Hallo Yannik,
> 
> danke für diesen Ansatz. Also laut Manual liest fread solange bis die
> angegebene Anzahl an Bytes _oder_ ein EOF gelesen wird. 
> 
> Selbst PEARs Net_Socket verwendet fsockopen, fread und prüft auf EOF. Meinst
> nicht das Problem liegt woanders? Mit blocking habe ich auch schon
> rumgespielt. 

Das es am blocken liegt ist nur eine Vermutung. Es kann durchaus an 
etwas anderem liegen. Aber die Möglichkeit mit dem Blocken liegt sehr 
nahe und ich habe auch keine andere Idee. Immerhinhängt dein script am 
letzten fread() und es dauert ziemlich genau 60 Sekunden. Was soll es 
sonst sein?
Ich würde aber einfach mal vermuten, das kein EOF gelesen wird, obwohl 
du längst alle deine benötigten Daten hast. Das ganze bringt mich zur 
Vermutung, dass du dich möglicherweise mit persistenten Verbindungen 
rumärgerst:
"  A significant difference between HTTP/1.1 and earlier versions of
    HTTP is that persistent connections are the default behavior of any
    HTTP connection. That is, unless otherwise indicated, the client
    SHOULD assume that the server will maintain a persistent connection,
    even after error responses from the server."

Um zu verhindern, dass du eine persistente Verbindung bekommst:
"  An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to
    maintain a persistent connection unless a Connection header including
    the connection-token "close" was sent in the request."

Oder du implementierst die Erkennung einer fertig übertragenen Seite 
(der Abschnitt ist was länger, den copy und paste ich mal nicht): 
http://www.faqs.org/rfcs/rfc2616.html Section "4.4 Message Length".
> 
> Ich sollte noch dazu sagen, dass die gleiche Funktion mit einem GET-Request
> statt POST problemlos klappt. Sorry, das hab ich vergessen zu erwähnen.

Das ist zwar etwas störend, aber vielleicht hängt das mit deinem Server 
zusammen. Immerhin hat der Server die Freiheit die Verbindung zu schliessen.

Yannik
> 
> 
> Yannik Hampe wrote:
> 
> [...]
> 
>> ohne jetzt deinen Quelltext gelesen zu haben kombiniere ich folgendes
>> Problem:
>> - fread() liest solange, bis genug daten vorhanden sind.
>> - sind nicht genug Daten vorhanden, blockt fread(), bis Daten vorhanden
>> sind, was nie der Fall ist
>> - Nach 60 Sekunden wird phps socket timeout aktiv und killt die
>> Verbindung. Dein Script läuft weiter.
>>
>> Es sollte dir helfen die socket_*-Funktionen zu verwenden statt fsockets.
>> Ausserdem könnte dir stream_set_blocking helfen.
>>
>> Yannik
> 

php::bar PHP Wiki   -   Listenarchive