phpbar.de logo

Mailinglisten-Archive

[php] Warten auf Event (socket_accept + msg_receive)

[php] Warten auf Event (socket_accept + msg_receive)

Andreas Heigl a.heigl at wdv.de
Don Dez 2 09:19:30 CET 2004


Am 01.12.2004 15:14 Uhr schrieb "Bernhard Kraft" unter <kraftb at mokka.at>:

> Hallo !
> 
> Ich hab mich soeben auf dieser Mailingliste subscribed und hoffe jemand
> von euch kann mir bei einem Problem weiterhelfen.
> 
> Mein Problem ist folgendes:
> Ich habe eine PHP Applikation die ständig am laufen ist
> (set_time_limit(0))
> Die applikation wird nicht über den apache aufgerufen sondern
> auf der kommandozeile gestartet.
> 
> In der Applikation muss ich einen TCP/IP (AF_INET) socket öffnen und einen
> server socket initialisieren. Der Server socket wartet dann mit
> $msgsock = socket_accept($server_sock);
> auf eine verbindung von aussen ....
> Wenn eine Verbindung aufgebaut wird kann diese nicht komplett abgehandelt
> werden sondern sie muss beständig offen bleiben.
> 
> Und hier liegt auch schon das problem: ich müsste nebenbei noch auf eine
> Benachrichtigung per IPC (messages, semaphoren) warten. kommt nämlich per
> IPC eine benachrichtigung muss auf die bereits verbundenen sockets etwas
> rausgeschickt werden.
> 
> ich muss also gleichzeitig auf dem socket listen ob sich jemand verbindet
> und währenddessen per IPC auf input warten.
> 
> hätte ich threads zur verfügung wäre das alles keine problem aber soviel
> ich mich bis jetzt schlau gemacht habe gibts nicht mal im neuen PHP5 threads.
> 
> Wie kann ich sowas also lösen ?
> 
> Die einzige Lösung die mir bis jetzt eingefallen ist ist die das ich den
> socket auf non_blocking schalte und so mit socket_accept() immer gucken kann
> ob sich ein neuer client verbinden will ...
> und danach kann ich mit msg_receive() und dem MSG_IPC_NOWAIT flag nachsehen
> ob eine neue message angekommen ist ...
> 
> was mir an dieser lösung nicht gefällt ist das ich wenn ich diese beiden
> funktionen hintereinander aufrufe und dazwischen nirgendwo ein usleep()
> einbaue
> 100% CPU Auslastung erreiche ... was ja nicht unbedingt wünschenswert ist
> baue ich ein usleep() ein reagiert die anwendung nicht mehr schnell (so
> schnell
> wie möglich)
> 
> 
> hints ?
> 
Ich hab grade in der PHP-Doku eine Funktionalität gefunden, die dir unter
umständen helfen könnte:

http://de2.php.net/manual/de/ref.pcntl.php

Ich hab selbst noch nie damit experimentiert, bin nur kürzlich mal
drübergestollpert

Grüße

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