Mailinglisten-Archive |
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