2012-04-11 2 views
3

Ich habe eine Datenbank mit vielen Spielobjekten, , die von den folgenden 3 PHP-Skripten abgefragt wird.Wie stelle ich sicher, dass die sich schnell ändernden Daten aus meiner MySQL DB in PHP-Skripten korrekt dargestellt werden?

  1. Liste Objekte: bekommt ein JSON-Objekt mit allen Elementen Ich brauche
  2. Objekt hinzufügen: fügt ein Objekt in der Datenbank
  3. Reset: alle Objekte aus der Tabelle wischt

Alle drei funktionieren, etwas. Obwohl, gibt es eine Timing-Mismatch. Wenn das Spiel die Reset-Funktion aufruft, wird es neu gestartet. Wenn das Spiel neu gestartet wird, werden automatisch alle Objekte geladen. Leider, und hier ist das Problem, wenn das Spiel gerade zurückgesetzt wurde, werden Objekte immer noch von Skript 1 gezogen.

Ich weiß von Transaktionen, aber ich habe sie nie verwendet und ich habe keine Ahnung, wie ich implementieren würde diese hier, da meine Transaktion Dinge von verschiedenen Skripten betrifft, die zu unterschiedlichen Zeiten ausgeführt werden.

Für Bonus-Kredit: Wird dieses Setup (AS3> php> MySQL) mich mit einer schweren Last in Schwierigkeiten bringen? Das Spiel könnte von 10, 100, 1000 Leuten aufgegriffen werden. Kann ich etwas über dieses Thema lesen?

Edit: neue Idee/Frage

Derzeit arbeitet der Wisch als solche: Die Objekte-Tabelle ein Feld ‚gelöscht‘ hat, die auf ‚1‘ gesetzt, wenn die Reset-Methode aufgerufen wird. Es könnte klüger sein, die vorhandenen Daten in eine Archiv-Tabelle zu kopieren und dann die Live-Tabelle gestutzt ...

Edit: Hier ist der (relevante) PHP-Code Ich bin mit

Objekt hinzufügen:

if ($db_found) { 

$x = $_GET['x']; 
$y = $_GET['y']; 
$type = $_GET['type']; 
$name = $_GET['name']; 
$text = $_GET['text']; 

$SQL = "INSERT INTO bodies (x,y,type,name,text) 
VALUES ('".$x."','".$y."','".$type."','".$name."','".$text."')"; 

if (!mysql_query($SQL)) 
    { 
    die('Error: ' . mysql_error()); 
    } 

}; 

mysql_close($db_handle); 

Liste/Get Objekte:

if ($db_found) { 

$SQL = "SELECT * FROM bodies WHERE deleted = 0"; 
$res = mysql_query($SQL); 

    $rows = array(); 
    while($r = mysql_fetch_assoc($res)) { 
     print $r['x'] . ',' 
     . $r['y'] 
     . ',' 
     . $r['type'] 
     . ',' 
     . $r['name'] 
     . ',' 
     . $r['text'] 
     . ';'; 
    } 

}; 
mysql_close($db_handle); 

Reset: (EDIT 2)

mysql_query("LOCK TABLES bodies WRITE;"); 

$SQL = " DELETE FROM bodies"; 

if (!mysql_query($SQL)) 
    { 
    die('Error: ' . mysql_error()); 
    } 
}; 

mysql_query("UNLOCK TABLES;"); 
+1

Können Sie den Code ???? Form, was ich sehe .. Sie müssen vorstellen .. Spiel 'Sitzung' und auch 'clear' Cache ... – Baba

Antwort

1

How to do Transactions in MySQL.

In Ihrem Fall, dass Sie in der Unteilbarkeit und Isolation von Transaktionen interessted werden könnte, was bedeutet, dass, wenn ein Spiel neu zu starten, die Sie wollen, um sicherzustellen, bevor der Reset nicht vollständig abgeschlossen hat, kann niemand holen irgendwelche Ihrer Zwischendaten. Durch das Zurücksetzen in einer Transaktion wird diese Eigenschaft * sichergestellt. (* für TRUNCATE siehe unten)

Sie benötigen InnoDB als Engine für alle Tabellen, die an Ihren Transaktionen beteiligt sind. MyISAM unterstützt keine Transaktionen.

Das Ändern großer Datenmengen in einer Transaktion kann möglicherweise zu hohen Abfrageverzögerungen führen, da die Transaktion spezielle Undo/Redo-Logs verwendet, um alle Vorgänge in der Transaktion rückgängig zu machen, wenn Sie sich für ROLLBACK entscheiden.

Ich würde die Tabellen nicht löschen, wenn ich ein neues Spiel starte. Geben Sie stattdessen Ihre Daten game_id und verwenden Sie eine neue game_id beim Starten eines neuen Spiels. Raum sollte heutzutage nicht wirklich ein Thema sein. Dies hat den Vorteil, dass Sie beim Zurücksetzen des Spiels eine Tabelle locking mit wenig bis keiner benötigen.

Wenn Sie müssen, verwenden Sie unbedingt TRUNCATE, wenn Sie die Tabellen löschen. So weit ich weiß TRUNCATE in MySQL kann nicht zurückgerollt werden, so tun es innerhalb einer Transaktion nichts nützliches tun.

Ich denke, PHP/MySQL wird gut funktionieren, wenn es richtig verwendet wird, auch für größere Besucherzahlen. Sie können Profiling-Tools wie xdebug oder MySQL slow query log verwenden, um Performance-Engpässe zu verfolgen und zu entfernen.

+0

Um klar zu sein, wird die Liste Objekte und Objekte hinzufügen viel häufiger als die" Reset "ein. Gibt es eine Möglichkeit, wenn das Zurücksetzen aufgerufen wird, laufende Skripts neu zu starten oder fehlzuschlagen? (Dies war genau die Art von Antwort, nach der ich suchte, vielen Dank.) – joon

+0

Ja, Sie können die Tabellen sperren, die beim Zurücksetzen nicht darauf zugreifen sollen. Siehe [MySQL-Handbuch zum Sperren] (https://dev.mysql.com/doc/refman/5.6/en/lock-tables.html). – Basti

+1

Die Sache, über die Sie in Ihrer ersten Bearbeitung sprechen, wird als "Schattentabelle" bezeichnet. Gefunden [diesen Link] (http://arnab.org/node/1169) für mysql. Wenn Sie Ihren Code sehen, sollten Sie auch [SQL Injection] lesen (https://en.wikipedia.org/wiki/SQL_injection#Incorrect_type_handling). :-) – Basti

Verwandte Themen