Hallo,
ich habe einen kleinen Dienst in PHP geschrieben, der Nachrichten über das lokale Netzwert mithilfe eines UDP Broadcasts verteilt. Das funktioniert auch, die Pakete kommen bei allen Zielservern an, und zwar jeweils genau einmal.
Das Problem ist, dass das Skript, dass die Nachricht empfangen soll nicht einmal, sondern dutzende von malen gestartet wird, Ewigkeiten braucht und ich weiß nicht wieso. Ich habe Testweise ein Dummy-Skript geschrieben und mit tcp-Wrapper in den inetd gehängt. (Der tcp Wrapper ist nicht das Problem, ich habe auch schon versucht ihn wegzulassen.)
$ grep testservice /etc/inetd.conf /etc/services /etc/inetd.conf:testservice dgram udp nowait user /usr/sbin/tcpd /home/user/test.php /etc/services:testservice 2802/udp
test.php:
1 2 3 4 5 6 7 8 9 10 11 12 | #!/usr/bin/php <?php $message = trim(fgets(STDIN)); // ich habe es auch schon mit fread(STDIN, 1024) versucht, dasselbe Problem fclose(STDIN); // daran liegts nicht, es macht keinen Unterschied, wenn man es weglässt $fp = fopen("/var/tmp/test.log", "a"); fwrite($fp, $message . "\n"); fclose($fp); ?> |
Am Ende habe ich dann ein ganzes Rudel gleichartiger Meldungen in /var/log/syslog, obwohl laut tcpdump nur ein einziges Paket eingegangen ist:
May 3 14:24:51 server test.php[28879]: connect from 10.123.9.1 (10.123.9.1) May 3 14:24:51 server test.php[28861]: connect from 10.123.9.1 (10.123.9.1) (...)
Die genaue Anzahl der Meldungen ist unterschiedlich. Von einem Falle weiß ich das es 63 waren. Das sind sehr viele, aber dann doch weniger als es mögliche Adressen in dem Netzwerk (10.112.0.0/12, broadcast 10.127.255.255) gibt. Die Skripte hängen hinterher, aber ob sie bei dem fgets oder dem fopen hängen weiß ich nicht. Wieso startet inetd so viele Instanzen des Skriptes, warum nicht nur eine? In dem Logile tauchen hinterher jede Menge Leerzeilen auf und vereinzelt eine mit einer Nachricht. In der Prozessliste stehen die jeweiligen Skripte jedoch weiterhin. (Also es steht weiterhin "/home/user/test.php" da, nicht aber der dadurch aufgerufene PHP Prozess.)