Philipp Hasenfratz: fsockopen() ignoriert timeout.

Beitrag lesen

Halihallo Tom

Probier doch mal, den Timeout der fsockopen() sher kurz einzustellen und einen Host anszusprechen, der routingbedingt (vorher ping) nicht innerhalb des Timeout antwortet. Dann müsste es greifen.

Hm. Wer hat zufälligerweise einen Host, der einen Ping von über
1000ms aufweist? :-)

Eine echte Flusskontrolle lässt PHP da also nicht zu, da es keine echten Interrupthandler gibt, die sich z.B. bei Intels in den Userinterrupt 1Ch einklinken könnten.

Nun, ich hoffe sogar, dass die[tm] das nie einbauen werden:
Diese "Flusskontrolle" geschieht AFAIK über Signal-Handler. Bei
einem Timeout von 1s wird intern ein sleep(1) ausgeführt, der beim
Signal SIGHUP (also Eingang eines Blocks von Daten) abbricht. In
modernen Betriebssystemen teilt das Betriebssystem dem Programm über
Signale mit, dass etwas geschehen ist. Wenn nix geschieht ist das
Programm in Schlafmodus und konsumiert keine Prozessorzeit (mehr
Zeit für andere Programme). Und so soll es sein.

Dein Vorschlag mit INT 1Ch:
Nun, INT 1Ch wird alle 1/18.2 Sekunden aufgerufen. Würde sich jedes
Programm dort einklinken um zu sehen, ob bereits Daten empfangen
wurden, würde dies bei spätestens 5 PHP Programmen zu einer
Endlosschleife führen, denn das "Nachsehen" dauert dann mehr als
1/18.2 Sekunden => der nächste Aufruf geschieht bereits während der
Aktuelle noch nichtmal abgeschlossen ist. Falls es nicht zur
Endlosschleife führen würde, so würde doch die meiste Prozessorzeit
für irrelevantes "Nachsehen" verpuffert. Das ist genau das, was
moderne Betriebssysteme vermeiden wollen/sollen.

BTW: Ich habe bei der INT 1Ch Programmierung schon ein paar mal den
Rechner lahmgelegt, spreche also aus Erfahrung :-)

Viele Grüsse

Philipp