Frage: kann ich mit php nen interrupt werfen und so nem deamon (nicht 2. thread, sondern ganz anderer prozess) zu sagen er soll wieder was tun? und kann ich den 2. prozess denn bis zu diesem interrupt auf blocked setzen?
worum es konkret geht:
mein kampfsystem ist stinkend lahm. daher würd ich das gern als c++-deamon im hintergrund laufen haben. der soll unter anderem nen paar db-sachen im ram halten etc.
nun will ich aber nicht immer db-polling betreiben und nachsehen, ob was berechnet werden muss. da ich die sachen in php vorliegen hab wäre es viel eleganter, wenn ich nen interrupt auslösen könnte. damit will ich den deamon von blocked auf runnable setzen. der kann dann unabhängig von php weiterrechnen und ballert seine berichnungen nur alle 10 sec in die db. nur wenn er nix xzu tun hat, soll er eben nicht pollen, da es sein kann, dass er dann mal 2-3 wochen nicht gebraucht wird. daher einfach blockieren.
wichtig ist nur das wecken. kann man das auch anders lösen, falls o.g. nicht geht?
kann man evtl. per exec was machen?
Interrupt per php auslösen?
gepostet vor 18 Jahre, 3 Monate von Drezil
gepostet vor 18 Jahre, 3 Monate von Sarge
ganz simpler ansatz , definitiv ohne größeren aufwand machbar aber wohl nicht als alzu toll hier angesehen:
Schick dem daemon einfach ein bestimmtes signal per kill via system/exec o.ä. das du auf daemon seite abfängst und entsprechend reagierst.
Aber um ehrlich zu sein.. ein polling sollte absolut kein Problem für deine Datenbank darstellen wenn dus nicht gerade im zweistelligen ms bereich betreibst.
Also z.b. 1/sec ne spalte abfragen ob was gemacht werden muss.. wayne störts. Optimiere dich nicht zu tode.
Schick dem daemon einfach ein bestimmtes signal per kill via system/exec o.ä. das du auf daemon seite abfängst und entsprechend reagierst.
Aber um ehrlich zu sein.. ein polling sollte absolut kein Problem für deine Datenbank darstellen wenn dus nicht gerade im zweistelligen ms bereich betreibst.
Also z.b. 1/sec ne spalte abfragen ob was gemacht werden muss.. wayne störts. Optimiere dich nicht zu tode.
gepostet vor 18 Jahre, 3 Monate von blum
ich hoff, ich hab deine frage richtig verstanden.
du kannst zB deinen daemon auf einem port lauschen lassen und wenn ein benutzer eine aktion ausführt oder ein cronjob startet, schickt das php-skript dem daemon die aktion samt zeitsstempel, wann die aktion berechnet werden soll.
zB:
user schickt seine flotten los, ankunft: 20:00 uhr.
das php script verbindet sich mit dem daemon, sagt ihm, dass um 20 uhr ein kampf ansteht mit der id 12345, und schliesst die verbindung wieder.
das daemon nimmt die anweisung an und speichert die aktion samt zeit in einem array.
da der daemon ständig läuft und die systemzeit ständig kennt, braucht es nur noch jede sekunde in seinem array nachgucken, ob für die jetzige zeit eine aktion ansteht.
du kannst zB deinen daemon auf einem port lauschen lassen und wenn ein benutzer eine aktion ausführt oder ein cronjob startet, schickt das php-skript dem daemon die aktion samt zeitsstempel, wann die aktion berechnet werden soll.
zB:
user schickt seine flotten los, ankunft: 20:00 uhr.
das php script verbindet sich mit dem daemon, sagt ihm, dass um 20 uhr ein kampf ansteht mit der id 12345, und schliesst die verbindung wieder.
das daemon nimmt die anweisung an und speichert die aktion samt zeit in einem array.
da der daemon ständig läuft und die systemzeit ständig kennt, braucht es nur noch jede sekunde in seinem array nachgucken, ob für die jetzige zeit eine aktion ansteht.
gepostet vor 18 Jahre, 3 Monate von abuzeus
Es geht noch besser. Schau dir mal den Befehl select() (in select.h) an. Mit select kannst du folgendes machen:
Auf einem Socket/Pipe... horchen, ob was kommt. Solange nix kommt, wird der Prozess schlafen gelegt und wird aufgeweckt wenn entweder
- Datenverkehr auf dem Socket läuft (man kann gleichzeitig mehrere Sockets überwachen)
- eine vorher festzulegende Zeit abgelaufen ist (kann auch auf "warte bis Duke Nukem forever rauskommt" gesetzt werden).
Wenn du den Dameon wecken willst, dann öffnest du per php einen Socket auf dem entsprechenden Port (nicht vergessen: In den Firewallregeln diesen port nur für Verbindungen vom localhost freigeben ;-)) und sendest irgendwas - wenn du noch Infos übermitteln willst, dürfens auch Nutzdaten sein. In Php ist sowas ein Dreizeiler.
Vorteile:
Das Programm ist sofort (im Millisekundenbereich) da, wenns gebraucht wurd und solange es nicht gebraucht wird verbraucht es null CPU, da das Betriebssystem die nötigen Aufgaben übernimmt. Habe das für einen Eventhandler schon eingesetzt, hat 1a funktioniert. select ist sogar Standard C und damti Standard C++ ;-)
edit: War wieder einer schneller. Mit select spart man sich für den Eventhandler natürlich den Check jede Sekunde.
Auf einem Socket/Pipe... horchen, ob was kommt. Solange nix kommt, wird der Prozess schlafen gelegt und wird aufgeweckt wenn entweder
- Datenverkehr auf dem Socket läuft (man kann gleichzeitig mehrere Sockets überwachen)
- eine vorher festzulegende Zeit abgelaufen ist (kann auch auf "warte bis Duke Nukem forever rauskommt" gesetzt werden).
Wenn du den Dameon wecken willst, dann öffnest du per php einen Socket auf dem entsprechenden Port (nicht vergessen: In den Firewallregeln diesen port nur für Verbindungen vom localhost freigeben ;-)) und sendest irgendwas - wenn du noch Infos übermitteln willst, dürfens auch Nutzdaten sein. In Php ist sowas ein Dreizeiler.
Vorteile:
Das Programm ist sofort (im Millisekundenbereich) da, wenns gebraucht wurd und solange es nicht gebraucht wird verbraucht es null CPU, da das Betriebssystem die nötigen Aufgaben übernimmt. Habe das für einen Eventhandler schon eingesetzt, hat 1a funktioniert. select ist sogar Standard C und damti Standard C++ ;-)
edit: War wieder einer schneller. Mit select spart man sich für den Eventhandler natürlich den Check jede Sekunde.
gepostet vor 18 Jahre, 3 Monate von Drezil
danke für die antworten.
abuzeus: was du beschrieben hast trifft den nagel auf den kopf. ich werds mir mal anschauen
da du das schonmal gemach hast: hast du codebeispiele? sonst muss ich mir alles zusammengooglen..
abuzeus: was du beschrieben hast trifft den nagel auf den kopf. ich werds mir mal anschauen
da du das schonmal gemach hast: hast du codebeispiele? sonst muss ich mir alles zusammengooglen..
gepostet vor 18 Jahre, 3 Monate von abuzeus
Hab ich, aber ich muss erst Rücksprache halten. Das Programm war nämlich nicht für mein Browserspiel, sondern für das eines Kollegen, und bevor ich was rausrücke, muss ich natürlich erstmal nachfragen. Kann also ein ne kurze zeit dauern ;-)
gepostet vor 18 Jahre, 3 Monate von TheUndeadable
Nur als Info:
Wenn du viel mit Datenbanken hantierst, wirst du mit C++ nur wenig Geschwindigkeitsboost erreichen, wenn du allerdings viel rechnest, dann schon:
depon.net/downloads/benchmark_php.pdf
Ich weiß, dass man solche Benchmarks nicht als Absolutum nehmen soll und besser lieber selbst seine Routine benchmarken sollte, aber für den groben Geschwindigkeitsvergleich reicht dies.
Wenn du viel mit Datenbanken hantierst, wirst du mit C++ nur wenig Geschwindigkeitsboost erreichen, wenn du allerdings viel rechnest, dann schon:
depon.net/downloads/benchmark_php.pdf
Ich weiß, dass man solche Benchmarks nicht als Absolutum nehmen soll und besser lieber selbst seine Routine benchmarken sollte, aber für den groben Geschwindigkeitsvergleich reicht dies.
gepostet vor 18 Jahre, 3 Monate von Drezil
das problem mit der db is nur, dass ich jedesmal im script nen paar kb an (für das aktuelle script statischen) daten rausziehe, mir darau tonnen von objekten baue, 1-2 kampfticks berechne und die am ende vom script wieder lösche..
was ich mit dem deamon erreiche:
was ich mit dem deamon erreiche:
- schnellere berechnungen (die sind nicht ohne die formeln)
- nicht bei jedem funktionsaufruf (alle 10 sec zu stosszeiten) 1-2 sec db-daten laden + 1-2 sec damit rechnen (=> server ist dann für 3 sec ausgelastet und die myisam table locks locken so gut wie alle tabellen - wird aber überarbeitet)
- ich verbesser meine c++-kenntnisse
- ich hab ne effizientere speicherverwaltung
- das ganze läft auch auf meinem p2-700-t-dsl-homeserver flüssig
gepostet vor 18 Jahre, 3 Monate von RAFPeterM
Ich wuerde auch sagen lieber schauen warum dein PHP Script so langsam ist anstatt einfach auf eine ``schnellere'' Sprache umzusteigen.
Ansonsten wuerde ich da garnicht mit Kill-Signalen o.ae. rumhantieren sondern einfach auf piped sockets setzen.
Ansonsten wuerde ich da garnicht mit Kill-Signalen o.ae. rumhantieren sondern einfach auf piped sockets setzen.