php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 06-05-2010, 07:07
ShadoX
 Registrierter Benutzer
Links : Onlinestatus : ShadoX ist offline
Registriert seit: May 2010
Beiträge: 5
ShadoX befindet sich auf einem aufstrebenden Ast
Standard PHP Events steuern

Hallo,
ich entwickle selbst an einem kleinem OpenSource Browergame. Momentan bin ich an ein Problem gekommen, wo ich Hilfe benötige, die Events.
Event sollen klar sein, User A greif User B an, ein Beispiel.
Bei jedem Seitenaufruf(außer Login und ACP) wird geschaut ob es ein Event auszuführen gibt, per SQL. Natürlich wird noch geprüft, ob der "Handler" nicht grad von jmd. anderes ausgeführt wird. Allerdings, wenn ein Aufruf exakt zur selben Zeit kommt, wird es 2x ausgeführt.
Meine Lösung war die, dass beim Starten des Auftrages, via shell_exec ein einmaliger Cronjob ausgeführt werden kann, vom Server aus. Das PHP-Script selbst ist nicht via HTTP ausrufbar, also lytx funktioniert nicht.

Bitte um Ratschläge
Gruß
Mit Zitat antworten
  #2 (permalink)  
Alt 06-05-2010, 11:40
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Bei jedem Seitenaufruf(außer Login und ACP) wird geschaut ob es ein Event auszuführen gibt
Gewöhnlich wird das durch Cronjobs erledigt, die ein entsprechendes Script anstoßen.

Zitat:
Meine Lösung war die, dass beim Starten des Auftrages, via shell_exec ein einmaliger Cronjob ausgeführt werden kann, vom Server aus. Das PHP-Script selbst ist nicht via HTTP ausrufbar, also lytx funktioniert nicht.
Verstehe ich nicht.

Und wo ist jetzt eigentlich dein Problem?
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #3 (permalink)  
Alt 06-05-2010, 11:49
rossixx
 Registrierter Benutzer
Links : Onlinestatus : rossixx ist offline
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 514
Blog-Einträge: 2
rossixx wird schon bald berühmt werden
Standard

soweit ich online-games verstehe, dann werden dort angriffe zeitlich gesteuert.

das heisst, wenn user x sagt angreifen, dann wird für diesen angriff eine zeit festgelegt (angriff_table)

und du brauchst nur ein cron_job der regelmäßig die angriff_table checkt.

wenn du das bei jedem seiten aufruf bei einigen 100 oder 1000 usern machst - wird früher oder später dein server kein bock mehr haben.

is aber nur so ne vermutung von mir.
Mit Zitat antworten
  #4 (permalink)  
Alt 06-05-2010, 12:02
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von ShadoX Beitrag anzeigen
Allerdings, wenn ein Aufruf exakt zur selben Zeit kommt, wird es 2x ausgeführt.
Mit einem Semaphore/Lock kannst du das verhindern.
Zitat:
Zitat von ShadoX Beitrag anzeigen
via shell_exec ein einmaliger Cronjob ausgeführt werden kann
Das wäre dann ein At-Job.
Aber wenn für jeden Event ein At- oder Cronjob angelegt wird, könntest du an an Grenzen stossen. Ich weiß nicht wie viele Jobs dein Betriebssystem so handeln kann, aber sicherlich ist die Zahl begrenzt.

Ich rate dir zu einem Cronjob, der jede Minute die Datenbank befragt, ob für diese Minute Jobs vorliegen und ggf. für die Abarbeitung dieser separate Prozesse startet.
Mit Zitat antworten
  #5 (permalink)  
Alt 06-05-2010, 13:37
ShadoX
 Registrierter Benutzer
Links : Onlinestatus : ShadoX ist offline
Registriert seit: May 2010
Beiträge: 5
ShadoX befindet sich auf einem aufstrebenden Ast
Standard

Das Problem ist, wenn 2 Seitenaufrufe zur gleichen Zeit sind kann es passieren dass das Event doppelt ausgeführt wird. Theoretisch müsste dann, wenn Das "Checkscript" von vorne anfangen, wenn z.B.: Die Spyflüge nach 5 Sekunden beim Ziel sind.
Zitat:
Zitat von onemorenerd Beitrag anzeigen
Mit einem Semaphore/Lock kannst du das verhindern.
Was ist das? - Eine Art Lock ist eingebaut, entspricht aber glaube ich nicht ganz so, was es soll.
Edit.: http://www.php.net/manual/de/ref.sem.php ?


Eigentlich gehört an diese Stelle ein Eventhandler in C++ dahin, leider sehe ich dort im warsten Sinne des Wortes schwarz.

Zitat:
Zitat von rossixx Beitrag anzeigen
wenn du das bei jedem seiten aufruf bei einigen 100 oder 1000 usern machst - wird früher oder später dein server kein bock mehr haben.

is aber nur so ne vermutung von mir.
Yep. Wird er.
Deshalb such ich nach Alternativen....

Momentan siehst so aus(Kotztüten bereit halten^^):

PHP-Code:
        if($game_config['stats_fly_lock'] == && !defined('IN_ADMIN')){    
            
$config->update(array('stats_fly_lock' => TIMESTAMP));
            
$db->query("LOCK TABLE ".AKS." WRITE, ".RW." WRITE, ".MESSAGES." WRITE, ".FLEETS." WRITE, ".PLANETS." WRITE, ".TOPKB." WRITE, ".USERS." WRITE, ".STATPOINTS." WRITE;");
                
            
$fleetquery $db->query("SELECT * FROM ".FLEETS." WHERE (`fleet_start_time` <= '".TIMESTAMP."' AND `fleet_mess` = '0') 
                                                OR (`fleet_end_time` <= '"
.TIMESTAMP."' AND `fleet_mess` = '1') 
                                                OR (`fleet_end_stay` <= '"
.TIMESTAMP."' AND `fleet_mess` = '2') 
                                                ORDER BY `fleet_start_time` ASC;"
);
            if(
$db->num_rows($fleetquery) > 0)
                
$this->FleetHandler($fleetquery);

            
$db->free_result($fleetquery);
            
$db->query("UNLOCK TABLES;");  
            
$config->update(array('stats_fly_lock' => 0));
        }
        elseif(
TIMESTAMP >= ($config->stats_fly_lock 300)){
            
$config->update(array('stats_fly_lock' => 0));
        } 

Geändert von ShadoX (06-05-2010 um 14:00 Uhr) Grund: Zeilenumbrüche eingefügt.
Mit Zitat antworten
  #6 (permalink)  
Alt 06-05-2010, 14:07
rossixx
 Registrierter Benutzer
Links : Onlinestatus : rossixx ist offline
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 514
Blog-Einträge: 2
rossixx wird schon bald berühmt werden
Standard

wenn du die events in einer db ablegst, und die db über ein cronjob checkst, ob neue aktionen ausgeführt werden müssen. dann sollte doch nichts doppelt stattfinden ?!?!


- user legt ein event an z.b. angriff -> wird in db gespeichert wann dieser stattfindet

- cronjob checkt die db und startet die entsprechenden aktions

oder hab ich was falsch verstanden ?!?!
Mit Zitat antworten
  #7 (permalink)  
Alt 06-05-2010, 14:32
ShadoX
 Registrierter Benutzer
Links : Onlinestatus : ShadoX ist offline
Registriert seit: May 2010
Beiträge: 5
ShadoX befindet sich auf einem aufstrebenden Ast
Standard

Der oben gepostet Code wird bei jedem Seitenaufruf ausgeführt. Eine Art Cronjob existiert momentan nicht.

Den Cronjob alle 10 Sekunden auf Events zu checken, wär auf Dauer zu lastig für den Datenbank-Server(?).

Un den Cron jede Minuten zu starten wär für ungedulige User zu wenig...
Mit Zitat antworten
  #8 (permalink)  
Alt 06-05-2010, 15:00
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Vorab: Die Bezeichnung Event ist total daneben. Du meinst Job oder Task.
Da u.a. auch von Cronjobs gesprochen wird, verwenden ich mal Task statt Event.

(Vixie-)Crons kann man nur minutengenau festlegen. Das kürzeste Intervall ist also 1 Minute. Was nicht bedeutet, dass dann bis zur nächsten Minute keine Tasks ausgeführt werden. Der Cronjob holt sich ja alle Tasks aus der DB, die in dieser Minute ausgeführt werden sollen, sortiert nach der sekundengenauen Startzeit.
Nun vergleicht der Cronjob in einer Schleife die aktuelle Zeit mit der Startzeit des ersten Task. Stimmen sie überein, wird für den Task ein Prozess gestartet und er wird aus der Liste gestrichen. Stimmen weitere Zeitstempel überein, dasselbe.
Mit Zitat antworten
  #9 (permalink)  
Alt 06-05-2010, 17:34
ShadoX
 Registrierter Benutzer
Links : Onlinestatus : ShadoX ist offline
Registriert seit: May 2010
Beiträge: 5
ShadoX befindet sich auf einem aufstrebenden Ast
Standard

Dann bleiben wir als noch 3 Möglichkeiten:
1. Damit leben.
2. Eigenden Event/TaskHandler in C schreiben, der Permanet im Hintergrund läuft.
3. Die Tasks von der Usern ausführen lassen.
Nur noch den "Lock" dann optimieren.
Mit Zitat antworten
  #10 (permalink)  
Alt 06-05-2010, 17:59
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Wieso denn? Du kannst das sehr wohl alles in PHP programmieren. Du musst dir nur mal klar machen wie es laufen soll. Ich habe versucht dir einen Weg zu zeigen.
Mit Zitat antworten
  #11 (permalink)  
Alt 06-05-2010, 19:57
ShadoX
 Registrierter Benutzer
Links : Onlinestatus : ShadoX ist offline
Registriert seit: May 2010
Beiträge: 5
ShadoX befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Wieso denn? Du kannst das sehr wohl alles in PHP programmieren. Du musst dir nur mal klar machen wie es laufen soll. Ich habe versucht dir einen Weg zu zeigen.
Nur die Lösungen mit dem Minütigen Cronjob ist keine Lösung. Wenn hinterher die User mit hochem Speed spielen und dann die Einheit bis zu 57 Sekunden verspätung hat, würde ich Support Tickets ohne ende bekommen. Bekomme schon geung, wenn die Flotte selbst mal 30 Sekunden zu spät ist.

Ich glaube mit das größe Problem, dass sie nach Möglichkeit Sekunden genau gestartet werden müssen.

Aber ca. 500 At-Jobs zu erstellen ist ja nicht die Lösung.....
Mit Zitat antworten
  #12 (permalink)  
Alt 06-05-2010, 20:06
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ShadoX Beitrag anzeigen
Ich glaube mit das größe Problem, dass sie nach Möglichkeit Sekunden genau gestartet werden müssen.
Dass du glaubst, dass das nötig wäre, bzw. dass dein bisheriges Konzept es notwendig erscheinen lässt, ist das eigentliche Problem.

Ständig sekundengenau Berechnungen durchzuführen, ist im Umfeld eines Browsergames mit PHP Unfug. Selbst wenn das als theoretisches Konstrukt und meinetwegen sogar in einer hübschen kleinen Testumgebung funktionieren mag, bricht es dir in der Praxis garantiert irgendwann zusammen, und das schneller, als du bspw. bei der Hardware aufstocken kannst.

Überdenke also zunächst mal dein Konzept. Vor allem in Bezug darauf, wie man termingebundene Abläufe so abbilden kann, dass es beim Betrachten des Ergebnisses zum Zeitpunkt X nicht darauf ankommt, ob vorher hunderte von Rechenoperationen zu einem exakt spezifizierten Zeitpunkt ausgeführt werden konnten oder nicht.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Anmeldeliste für Events vegasfan Apps und PHP Script Gesuche 8 07-04-2010 15:36
Browsergame Events KaiP BRAINSTORMING PHP/SQL/HTML/JS/CSS 8 19-08-2006 14:44
mouse events in php Tümmel HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 21 16-08-2004 22:33
Kalender und wiederkehrende Events Dino23 PHP Developer Forum 1 11-02-2004 23:22
Events Kleinbreuer HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 5 23-01-2003 22:31

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:49 Uhr.