Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

Event bei Datenbankzugriff / Daten live zw. Scripten übergeben

Hallo,

ich habe ein Problem, bei dem ich mir nicht sicher bin, ob es überhaupt eine Lösung gibt. Aber vielleicht habt Ihr ja einen Tip?

Ich möchte von einem PHP-Programm an ein anderes PHP-Programm Daten übergeben. Das Problem ist, dass das zweite Programm währenddessen schon läuft und die Daten sehr schnell (also ohne Verzögerung) übergeben werden sollen.

Meine derzeitige Lösung ist, dass das erste Script die Daten in einer Datenbank schreibt und das zweite sie 2*/Sekunde dort abholt. Das reicht aber eigentlich nicht und ist auch nicht gerade Ressourcenschonend. Denke, dass eine Übergabe via Datei (und deren Abfrage) noch langsamer wäre.

Gibt es eine Möglichkeiten Daten direkt (in anderen Programmiersprachen wäre das ein Eventhandler denke ich) an das laufende Programm zu senden oder evtl in dem laufenden Programm eine Funktion aufzurufen, wenn die Datenbank geändert wurde (direkt durch das erste Programm oder auch die Datenbank (Mysql) selbst?

Oder kann man irgendwie eine Pipe zwischen zwei Scripten legen?

Freue mich über jeden Lösungsansatz und jeden Gedanken zu diesem Problem.

Viele Grüße aus Hannover und vielen Dank schon im Vorraus,
andreas :o)

Hier gehts zum Orginal Eintrag "Event bei Datenbankzugriff / Daten live zw. Scripten übergeben" im Forum

Antworten

Mal anders gefragt: Warum läuft das zweite Script unterdessen bereits?

Es liegt auf dem selben Server wird, wahrscheinlich, über Cronjobs oder ein anderes, ähnliches Construct regelmäßig aufgerufen oder in einem seperaten Browser gestartet und ruft sich immer wieder selbst auf.

Nun, warum gehst Du nicht hin und baust für das zweite Script eine Queue-Tabelle in die DB ein, in welche das erste Script - nach erfolgtem Update ein entsprechendes Flag - z.B. in Form des aktualisierten Keys! - einstellt. Beim nächsten Zugriff auf diese - zweispaltige - Tabelle erkennt Dein zweites Script die Änderung und setzt die Daten entsprechend um. Die Tabelle muß deshalb zweispaltig sein, weil Du einen eindeutige Kennung mitführen solltest, damit Du hinterher auch nur den entsprechenden Eintrag aus der Queue löschst und nicht ggf. Einträge die ggf. noch gar nicht verarbeitet wurden.

Das es bei solchen abhängigen Konstrukten gilt, das die Scripte untereinander kommunizieren müssen, hast Du ja erkannt. Aber diese Kommunikation kann nunmal nur im Rahmen der Möglichkeiten ausfallen....

Wenn es möglich ist, auf Deinem Server per "Net Send"-Entsprechung eine Nachricht - z.B. über ein CGI-Script - an den anderen Prozess, welcher das zweite Script enthält, müßte dort dennoch immer ein Wächter laufen, welcher auf diese Nachricht lauscht.

Ergo - irgendetwas, das die reinkommende Nachricht gerade verpasst hat, wird es immer geben. Und wenn es nicht der Wächter ist, der für die Verzögerung(en) sorgt, dann ist es das Script welches für die Weiterverarbeitung der Daten zuständig ist, denn das benötigt nunmal auch zeit....

Gruß

Arno


2.

Hast Du Dir schon mal sockets angesehen?


3.

Hi,

vielen Dank für Eure Ideen.

Das eine Script ist ein Ausgabescript, dass der User mit seinem Browser startet. Das andere nimmt Daten an und verarbeitet sie und beendet sich dann wieder.

@Arno: Mit einer Queue-Tabelle ist mein Problem leider nicht gelöst. Ich mache das jetzt über Timestamps und speichere immer den letzten Timestamp. Damit bekomme ich schon hin, immer die neusten Daten zu bekommen. Das Problem, dass (so wie ich das verstanden habe) die Queuetabellen auch nicht lösen, ist, dass ja mein Script weiterhin ewig auf die Datenbank zugreifen muss, das löst also das Zeitproblem und auch das Performanceproblem leider nicht :-(

Ein Lauscher, der alle 500 MSekunden schaut, ob was passiert ist, fände ich auch ok. Aber der sollte eben nur dann wirklich handeln müssen, wenn es auch was zu handeln gibt. Da eine SQL-Abfarge ja auch immer ein Festplattenzugriff ist, ist die Version leider viel zu langsam. Eine Systemvariable wäre auch ok. Aber auch da habe ich noch nichts gefunden, wie ich da schnell was abrufen kann.

Ich programmiere sehr viel objektorientiert und z.B. bei C++ oder Java würde ich eben einen Eventhandler definieren, der sich im AnnahmeScript registriert und bescheid sagt, dass er immer dann eine Nachricht haben möchte, wenn es was zu handeln gibt. Dadurch lauscht er schon, aber (so wie ich das bisher verstanden habe) wird er quasi von extern angesprochen und lauscht eben passiv.

@pecoes: So wie ich das verstanden habe, stellen Sockets im Prinzip TCP-Verbindungen her. Das löst mein Problem auch noch nicht wirklich. Aber ich könnte evtl schauen, ob ich mein Ausgabescript zu einem Server mache und die Annahme als Client Daten dahin schicken lassen. Aber so ganz optimal ist das auch noch nicht weil sehr aufwendig :o( (oder habe ich das falsch verstanden? *hoff*)

Trotzdem schon mal vielen Dank für Eure Ideen. Echte Eventhandler gibt es in PHP nicht - oder?

Viele Grüße,
Andreas


4.

Zitat:
Das eine Script ist ein Ausgabescript, dass der User mit seinem Browser startet. Das andere nimmt Daten an und verarbeitet sie und beendet sich dann wieder.
Warum bringst Du nicht das Verabeiten der Daten in demselben Skript unter? Entweder machst Du da einen riesigen Denkfehler, oder Du solltest Dein Problem noch detaillierter erklaeren ...


5.

Dein Problem hat auch in Java nicht wirklich mit einem simplen Event Handler zu tun.
Du willst IPC, also musst du dich auch den mitteln von IPC bedienen. Die erwähnten Sockets stellen hier eine Möglichkeit dar. Eine andere Möglichkeit ist Shared memory. Eine Übersicht gibt es unter [url]http://www.php.net/manual/en/ref.sem.php[/url]
Und ja, IPC ist in erster Näherung etwas komplizierter als einfache Datenbankzugriffe, da hier die API einiges für dich übernimmt. Auf Kosten der Effizienz.


6.

Hi pecoes,

klasse, dass Du am Ball bleibst :o)

Von Perl bin ich gerade weg - war froh, alles nun doch Programmier-Sprachen-Rein hinzubekommen (eben nur in PHP).

Zwei Scripte brauche ich (denke ich), weil ich einen Stream zum Anwender offen halten muss - das Ausgabescript darf daher nie beendet werden, weil eben sonst die Verbindung abreißt. Immer, wenn es neue Daten gibt, sollen die sofort übertragen werden (daher kommt auch ein Reload o.ä.) nicht in Frage.

Einige der Ereignisse werden auch durch User durch Formulareingabe & abschicken ausgelöst, dadurch (denke ich) müssen die Scripte getrennt sein. Oder kann ich ein Script starten (das Ausgabesript) und dem Browser und Server beibiegen, dass genau an diesen Prozess die Daten gesendet werden sollen? (dann wäre mein Problem gelöst ;o)

Viele Grüße,
Andreas

PS: Ich hatte vorher schon mal eine Lösung über Fifo - habe dazu heute auch einen PHP-Befehl gefunden. Wenn Ein- und Ausgabe über ein Script nicht gehen, dann könnte ich mich auch noch mal daran setzen. Aber ich hoffe ja imme rnoch auf eine schönere Lösung ;o)


Hier gehts zum Orginal Eintrag "Event bei Datenbankzugriff / Daten live zw. Scripten übergeben" im Forum
 
phpforum.de | Impressum