phpbar.de logo

Mailinglisten-Archive

[php] feof() Reaktionszeit bei Socket-Connects

[php] feof() Reaktionszeit bei Socket-Connects

Andreas Heigl a.heigl at wdv.de
Don Mar 10 10:42:19 CET 2005


Andreas Demmer schrieb:

> Hi,
> 
> ich habe hier ein ärgerliches Problem beim
> Kommunizieren mit einer POP3 Mailbox über einen
> Socket Connect.
> 
> Ich habe einen Sockel auf Port 110 des Mailservers
> erstellt, sende meine Kommandos via fputs() auf
> den Sockel und hole mir die Antwort via fgets().
> 
> Alles funktioniert wunderbar bis zum eigentlichen
> Auslesen der E-Mail, die ich über "RETR <number>"
> oder über "TOP <number> <lines>" hole. Mein Code
> sieht an dieser Stelle wie folgt aus:
> 
> $email = NULL;
> 
> while ( !feof ( $this->connect ) ) {
>     $email .= fgets ( $this->connect );
> }
> 
> Hier tritt das Problem auf, dass zwar die komplette
> E-Mail ausgelesen wird, aber das FEOF nur mit erheb-
> licher Verzögerung (exakt 60 Sekunden) erkannt wird.
> 
> In meiner Testkonstellation habe ich in jedem Durch-
> lauf der While-Schleife die Zeit ausgeben lassen und
> nach der While-Schleife erneut. Die komplette Email
> wird innerhalb einer Sekunde gesaugt, aber bis er nach
> der letzen Zeile aus der While-Schleife springt,
> dauert es exakt 60 Sekunden.
> 
> Mein erster Ansatz, den socket_timeout zu kürzen, hat
> nichts gebracht. Auch wundert es mich, dass 60 Sekunden
> Verzögerung die max_exection_time von 30 Sekunden igno-
> rieren, was ja daraufhin deuetet, dass innerhalb dieser
> Zeitspanne keine Prozessorzeit verbraucht wird.
> 
> Ein hässlicher Workaround ist, die Schleife zu verlassen
> wenn zwischen den Durchläufen mehr als n Sekunden vergangen
> ist. Allerdings ist dies keine Lösung die mich zufrieden
> stellt.
> 
> Wer weiß rat bzw. hilft mir auf die Sprünge?
> 
> Gruß,
> Andreas
Oh oh, das kommt mir bekannt vor.

Ich hatte das mal bei ner http-verbindung, weil HTTP 1.1 automatisch
persistente Verbindungen nutzt.
Das bedeutet, das der server die verbindung erst nach SEINEM timeout
abbricht. Und da externe verbindungen nicht auf die Skript-laufzeit
angerechnet werden, kann das dauern, bis das Skript endlich zuende ist.

Ich habs so gelöst, das ich einen 'Connection: close'  Header mitgesedet
habe.
Ob es sowas in POP3 gibt kann dir wohl nur ein Blick in die RFC's
beantworten

Gruß

Andreas

-- 

wdv Medien & Kommunikation GmbH & Co. OHG
Mediendatenverarbeitung
Andreas Heigl
Siemensstrasse 6
61352 Bad Homburg
Germany
Telefon +49-(0)6172-670-185
Telefax +49-(0)6172-670-181
www.wdv.de



php::bar PHP Wiki   -   Listenarchive