PHP Variablen über Instanzen hinaus speichern

MikeRofon

Cadet 3rd Year
Registriert
Sep. 2017
Beiträge
48
Das ist mal eher eine theoretische Frage:
Also ich rufe jede halbe Sekunde ein PHP Script auf, welches einen XML Stream verarbeitet. In dem Stream überwache ich einen bestimmten Wert. Wenn er einen bestimmten Value hat, soll Aktion A oder B oder C usw. ausgeführt werden. ABER nur EINmal. Wenn eine halbe Sekunde später der Wert immer noch den gleichen Value hat, soll die Aktion NICHT nochmal ausgeführt werden.
Elegant wäre speichern in einer Session-Variablen, aber bleibt diese Session am Leben, wenn ich die PHP immer neu aufrufe?
Anderer Weg wäre was mit AJAX zu machen. Oder mit irgendwas, was ausschließlich nur dann reagiert, wenn der betreffende Wert sich ändert. Wovon ich aber keine richtige Ahnung habe. Theoretisch und technisch gäbe es auch die Möglichkeit, den XML Stream per Websocket zu verarbeiten. Wovon ich mal sowas von GAR keine Ahnung habe.
Also bleibt mir nur PHP. Funktioniert das mit den Sessions? Oder muß/kann ich was ganz anderes machen?

Gruß
Mike
 
Das Adjektiv dafür heißt “persistent” - hier werden z.B. ein paar Alternativen beschrieben: https://stackoverflow.com/questions/1150944/variable-persistence-in-php
Für dich wahrscheinlich relevanter: https://stackoverflow.com/questions/26984067/php-persist-variable-across-all-requests

Nochmal wiederholt:
  • Sessions (wie du erwähnt hast - der Sender muss aber Sessions unterstützen)
  • Versteckte Felder (funktioniert nur bei Auslieferung einer HTML-Seite)
Noch mehr:
  • Filesystem (einfache Datei und dadrin Wert speichern)
  • Datenbank

Lg
 
  • Gefällt mir
Reaktionen: Drexel
Jo, ne Datenbank.
Wenn es wirklich nur ein gammliger Wert ist, reicht auch ne .txt Datei.
 
Würde auch eine Datenbank nehmen. Gibt allerdings noch eine Möglichkeit, die noch erwähnt wurde... Cookies :)
 
bubu9 schrieb:
Würde auch eine Datenbank nehmen. Gibt allerdings noch eine Möglichkeit, die noch erwähnt wurde... Cookies :)
ja, da kam ich dann auch drauf und das hab ich dann auch mal probiert. Nur funktionierts nicht wie ich will und kapier nicht warum:

PHP:
$racestatus = $data->METADATA->RACESTATE;
// Cookie lesen wenn er vorhanden ist
$c_racestatus = isset($_COOKIE["RaceStatus"]) ? $_COOKIE["RaceStatus"] : "";

// OVERLAY umschalten
if ($racestatus !== $c_racestatus ) {
     echo $racestatus . " " . $c_racestatus . " nicht gleich<br>";
     if ( $racestatus == 5 ) { $f = fopen("http://127.0.0.1:8088/api/?Function=OverlayInput3In&Input=17" , "r"); fclose($f);}
     if ( $racestatus == 2 ) { $f = fopen("http://127.0.0.1:8088/api/?Function=OverlayInput3In&Input=14" , "r"); fclose($f);}
    } else {
     echo $racestatus . " " . $c_racestatus . " ist gleich. Nichts tun<br>";
     }

    // Cookie schreiben
    setcookie("RaceStatus", $racestatus, time()+7200);  // verfällt in 2 Stunden

Rein logisch funktioniert
if ($racestatus !== $c_racestatus )
denn die Kontroll-Echos melden sich, wie es sein soll.
Trotzdem werden auch dann, wenn es heisst "nichts tun", die fopen Befehle ausgeführt. Also zumindest der für racestatus = 2
Und das versteh ich nicht.
 
Sieht doch eigentlich gut aus. Mach mal bitte aus if ( $racestatus == 2 ) ein "elseif"
 
bubu9 schrieb:
Mach mal bitte aus if ( $racestatus == 2 ) ein "elseif"
Was soll das bringen? Bestenfalls könnte man da ein SWITCH machen, um zwischen Racestatus 5 oder 2 oder allen anderen, die da noch kommen, zu unterscheiden, welcher Befehl dann an die Software geht. Ist aber eher nur code-optischer Natur...

Der Punkt ist: Warum bekomme ich das echo "... ist gleich", also aus dem ELSE-Pfad... und TROTZDEM führt der das fopen() aus dem anderen Pfad aus.
 
Zuletzt bearbeitet:
MikeRofon schrieb:
Was soll das bringen?
Das nicht beide conditions überprüft werden? Wird wahrscheinlich weg optimiert (keine Ahnung wie gut PHP da ist), aber ist einfach ein Code-Smell.

Zu deinem Problem: Wie gesagt: Der aufrufende muss Cookies auch unterstützen! Wenn jemand in seinem Browser alle Cookies geblockt hat, wird bei dir nie ein Cookie ankommen. Sessions nutzen auch nur Cookies.

Lg
 
Das nicht beide conditions überprüft werden? Wird wahrscheinlich weg optimiert (keine Ahnung wie gut PHP da ist), aber ist einfach ein Code-Smell.
Ja, sicher kann man das wegoptimieren. Alles zu seiner Zeit.
Zu deinem Problem: Wie gesagt: Der aufrufende muss Cookies auch unterstützen! Wenn jemand in seinem Browser alle Cookies geblockt hat, wird bei dir nie ein Cookie ankommen. Sessions nutzen auch nur Cookies.
Ich dachte, der Anwendungsfall mit dem Fernsteuern einer externen Windows-Anwendung legt nahe, daß der ganze Kram nur hier lokal auf dieser einen Maschine laufen soll. Und da das schreiben bzw. Auslesen der Cookies keine Fehler erzeugt, geh ich mal davon aus, daß das funktioniert. Ich lasse mir an einer Stelle die Variablen $racestatus und $c_racestatus anzeigen, da is alles so wie es sein soll.
 
Hab kein Bock das jetzt nachzuprogrammieren, aber mir sind noch ein paar Dinge in deinem Code aufgefallen...

if ( $racestatus == 2 )

Du hast nirgendwo definiert, das $racestatus eine Zahl ist. Der cookie übergibt einen string. Mag sein, dass das so funktioniert, aber if ( $racestatus == "2" ) macht für mich mehr Sinn.
 
bubu9 schrieb:
Hab kein Bock das jetzt nachzuprogrammieren, aber mir sind noch ein paar Dinge in deinem Code aufgefallen...

if ( $racestatus == 2 )

Du hast nirgendwo definiert, das $racestatus eine Zahl ist. Der cookie übergibt einen string. Mag sein, dass das so funktioniert, aber if ( $racestatus == "2" ) macht für mich mehr Sinn.
Diese Ungenauigkeit muß ich eingestehen. Und beim Überprüfen kommt für mich verwirrendes zutage:
gettype($racestatus) liefert "object" als Antwort. Hä?
$racestatus = $data->METADATA->RACESTATE; liefert als Ergebnis ein Object?
Das ist doch nur ein Wert aus einem XML-Baum:
XML:
<?xml version="1.0" encoding="UTF-16"?>
<EVENT VERSION="1.0" KEY="B18D6AD1161A1E614C03" TIMESTAMP="37262917">
<METADATA>
    ...
    <RACESTATE>2</RACESTATE>
    ...
</METADATA>
 
Ne, das macht so schon Sinn. Du musst dieses Objekt dann aber auch in eine Zahl umwandeln, um es vergleichen zu können, so wie du es machst. Du vergleichst in deinem Script eine Zahl.
 
ich sag mal so... gute und schlechte Nachrichten.
Gut: Es funktioniert
Schlecht: Es funktioniert nicht.
Denn es funktioniert NUR in einem Browser, aber die PHP wird aus dem Windows-Programm heraus ausgeführt, und somit stehen weder Sessions noch Cookies zur Verfügung. Derzeit werd ich wohl nicht um Datenbank oder Dateisystem herumkommen :-(
Trotzdem danke für Eure Hilfe.
 
Zurück
Oben