2012-04-11 25 views
3

我有一個數據庫有很多遊戲對象, 正在被以下3個PHP腳本查詢。如何確保我的MySQL數據庫中快速變化的數據在php腳本中準確表示?

  1. 對象列表:得到一個JSON對象與我需要
  2. 添加對象中的所有項目:將對象添加到數據庫
  3. 復位:溼巾表中的所有對象

他們三人都有點工作。雖然時間不匹配。遊戲調用重置功能時,重新啓動。遊戲重新啓動時,會自動加載所有對象。不幸的是,如果遊戲剛剛被重置,對象仍然會被腳本1拉出。

我知道事務,但我從來沒有使用過它們,我也不知道如何實現那些在這裏,因爲我的交易涉及在不同時間運行的不同腳本的東西。

對於獎金信用:這個設置(AS3> php> MySQL)會讓我陷入沉重的負擔嗎?這場比賽可能會被10,100,1000人拿起,有什麼我可以讀到的關於該主題的內容?

編輯:新的想法/問題

目前,擦拭工作這樣:該物體表有「刪除」字段被設置爲「1」當復位方法被調用。這可能是更明智的現有數據複製到存檔表,然後截斷直播表...

編輯:這是我使用

添加對象的(相關)PHP代碼:

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); 

列表/獲取對象:

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); 

復位:(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

你可以添加代碼嗎?形成我所看到的..你需要介紹..遊戲'會話'和'清除'緩存...... – Baba 2012-04-11 22:54:48

回答

1

How to do Transactions in MySQL.

在你的情況,你可能會在原子性和交易的孤立interessted,這意味着重新開始遊戲時,你要確保前復位還沒有完全結束,沒有人能取你的任何中間數據。在事務內部進行重置將確保此屬性*。 (*對於TRUNCATE見下文)

您將需要InnoDB作爲您的交易涉及的所有表的引擎。 MyISAM不支持事務。

更改交易中的大量數據可能會導致查詢很高的延遲,因爲如果您決定使用ROLLBACK,交易將使用特殊的撤銷/重做日誌來撤消您在交易中執行的所有操作。

開始新遊戲時我不會擦桌子。相反,在開始新遊戲時,請提供您的數據game_id並使用新的game_id。現在空間不應該成爲一個問題。這具有如下優點:重置遊戲時您幾乎不需要locking

如果必須,清除表格時一定要使用TRUNCATE。據我所知,MySQL中的TRUNCATE無法回滾,因此在事務內部執行這些操作不會起任何作用。

我認爲如果使用正確,PHP/MySQL將會表現良好,即使對於較大的訪問者數量也是如此。您可以使用分析工具(如xdebugMySQL slow query log)跟蹤和移除性能瓶頸。

+0

要清楚,列表對象和添加對象將被訪問比'重置'一個更頻繁。有沒有辦法在調用重置時使當前運行的腳本重新啓動或失敗? (這正是我尋找的答案的類型,非常感謝。) – joon 2012-04-11 23:11:54

+0

是的,你可以鎖定你想防止被重新訪問的蜜蜂訪問的表格。參見[MySQL的鎖定手冊](https://dev.mysql.com/doc/refman/5.6/en/lock-tables.html)。 – Basti 2012-04-12 05:10:21

+1

你在第一次編輯時所說的事情叫做「影子表」。找到[此鏈接](http://arnab.org/node/1169)爲mysql。看到你的代碼,你還應該徹底閱讀[關於SQL注入](https://en.wikipedia.org/wiki/SQL_injection#Incorrect_type_handling)。 :-) – Basti 2012-04-12 05:13:15

相關問題