GoaSkin Geschrieben 4. Juli 2012 Geschrieben 4. Juli 2012 Hallo, ich möchte über ein PHP-Skript Betriebsdaten von Temperatur-Sensoren auslesen, wobei ein proprieprietärer TCP-Dienst verwendet wird, bei dem bestimmte Bytes in der Antwort ausgewertet werden müssen. Das funktioniert soweit alles, jedoch gibt es einen Haken: Die Geräte reagieren manchmal/sporadisch auf eine TCP-Anfrage nicht. Damit mein PHP-Skript an dieser Stelle nicht für Ewigkeiten wartet, habe ich zunächst in der php.ini den Timeout auf eine Sekunde gesetzt. Das hat nichts gebracht, darum habe ich nach dem Aufruf von fsockopen die Funktion stream_set_timeout mit ebenfalls einer Sekunde eingebaut. Hat ebenfalls nichts gebracht. In einem weiteren Funktion habe ich die ganze Funktion so umgestellt, dass nicht mehr fsockopen zum Einsatz kommt, sondern socket_connect und der timeout über socket_set_option($fp, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>1,'usec'=>1)) gesetzt wird. Das Problem bleibt aber dasselbe: Das PHP-Skript versucht mit dem Ziel zu verbinden und sofern dieses auf die TCP-Anfrage nicht antwortet, steht das ganze Skript etwas über eine Minute still. Wie kann ich über ein PHP-Skript eine Socket-Verbindung aufbauen und dafür sorgen, dass diese nach einer Sekunde definitiv gekillt ist, egal ob sie erfolgreich aufgebaut wurde und Daten geliefert werden oder nicht? Zitieren
flashpixx Geschrieben 4. Juli 2012 Geschrieben 4. Juli 2012 ohne jetzt die Details zu kennen, ich würde mal vermuten dass gar kein Timeout auftritt. Also das PHP Script baut die Verbindung auf, der Socket wird erzeugt, aber es kommen einfach keine Daten, d.h. technisch es existiert schon ein Socket und damit entsteht auch kein Timeout Das Problem wirst Du letztendlich nur mit einer Art Threadding in den Griff bekommen, d.h. in einem Thread baust du die Verbindung auf und der andere Prüft wie lange die Verbindung schon läuft (aber Multithreadding unter PHP geht so direkt nicht). Ich würde ggf die Sensoren anpassen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.