Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[PHP] Wie kann man einen wirkungsvollen Timeout bei Socket-Verbindungen setzen?

Empfohlene Antworten

Veröffentlicht

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?

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.