Hängende PHP-Threads verhindern Symcon Neustart

Hallo,

ich habe das Problem, dass bei einigen Modulen, in denen Funktionen zyklisch über Events aufgerufen werden, PHP-Threads hängen bleiben und diese auch nicht mehr aus der Thread-Liste verschwinden - teilweise über mehrere Stunden.

Manchmal führt dies dazu, dass alle Threads belegt sind und entsprechende Fehlermeldungen kommen.
Außerdem lässt sich IPS auch nicht beenden, wenn ein PHP-Thread hängt.

In den Modulen, bei denen dieser Fehler auftritt, verwende ich die Funktion file_get_contents, die vermutlich diesen Fehler erzeugt.

Müsste aber nicht der Thread, nach der maximalen Laufzeit automatisch beendet werden, falls file_get_contents zu lange hängt?
Wie kann ich diese Probleme am besten umgehen?

Hatte ich auch bei bestimmten Http-Servern.
Scheint ein PHP-Problem zu sein. Auch das ändern des Timeouts hat nicht funktioniert.
Kann daran liegen das PHP nicht vom HTTP-Server mitgeteilt bekommt, dass die Datei zu Ende ist.
Bin dann auf cURL umgestiegen und das lief.
Oder es liegt an einem Bug der Namensauflösung (in PHP)… habe da mal so was gehört… welches OS?
Michael

Hallo
Sind das zufaellig immer SSL-Verbindungen ?
In der Doku findet man folgende Warnung:
http://php.net/manual/de/function.file-get-contents.php

Warnung

Bei SSL-Verbindungen zusammen mit Microsoft IIS hält sich dieser Webserver nicht an das Protokoll und schließt die Verbindung ohne ein close_notify zu senden.
PHP quittiert dieses Fehlverhalten mit "SSL: Fatal Protocol Error", wenn das Ende der Daten erreicht ist. 
Eine mögliche Lösung besteht darin, den Level von error_reporting herabzusetzten und Warnings auszuschließen. 
PHP kann fehlerhafte IIS-Serversoftware erkennen, wenn Sie einen Stream mit dem https://-Wrapper öffnen, 
und unterdrückt die Warnung für Sie. 
Falls Sie fsockopen() benutzen, um einen ssl://-Socket zu öffnen, müssen Sie selbst dafür Sorge tragen,
die Warnung zu erkennen und diese zu unterdrücken.

Hallo,

danke schon mal für eure Antworten.

IPS läuft in diesem Fall auf einem Raspberry. Mit dem file_get_contents Befehl übertrage ich per GET Daten einen HTTP Server (ohne SSL). Eine Namensauflösung ist auch nicht notwendig, da ich immer die IP des Servers verwende.

Grundsätzlich funktioniert dies auch in der Mehrheit der Fälle. Da dieser Fehler nur manchmal auftauchen, vermute ich, dass es an einer fehlerhaften Internetverbindung liegt. Dennoch sollte auch in diesem Fall das Skript nach dem Timeout beendet werden.

Hallo Zusammen,

ich habe nun die HTTP Abfrage mal von file_get_contents auf curl umgestellt.

Leider tritt das oben beschriebene Problem weiterhin auf. Sowohl bei Servern außerhalb als auch bei Geräten im lokalen Netz. In beiden Fällen werden aber IP-Adressen verwendet, um die Geräte zu erreichen.

Auch wenn das Problem evlt. an der lokalen Netzwerkverbindung liegen mag, sollten die Threads doch trotzdem nicht in IPS hängen. Nach einen Tag ist nur noch ein freier Thread verfügbar - die anderen werden nie freigegeben.

Für alle die auch dieses Problem haben:

Ich konnte es durch ein rpi-update lösen. Siehe dazu auch folgenden Thread https://www.symcon.de/forum/threads/31345-Nicht-beendete-Skripte