2011-08-24 70 views
1

我有一個專用的Linux服務器與我的多人遊戲(C++ /套接字)上,最近我獲得了我的網頁的MySQL服務器「服務」(我也有一個多人遊戲遊戲在PHP中完成),所以我不需要考慮備份等。從C++連接到MySQL數據庫通過PHP

MySQL服務對我的網頁非常有效,但我無法從服務器連接到數據庫,因爲它們不在同一個位置內部網絡。 可以完成的唯一連接必須來自提供者服務器上託管的網頁。

我曾經想過從服務器(C++遊戲服務器)發送請求到一個連接到數據庫的PHP網頁併發送回答。 這將適用於任何簡單的請求(比如HP有多少玩家X),但是當涉及到迭代請求時(即「SELECT id FROM player」),如果有很多答案,它會變得更加複雜。

有沒有規範的方法來規避這種情況?是否有證據顯示PHP/C++代碼在哪裏?任何其他方式(即某種假端口轉發)?

還是應該咬酸蘋果,開始擺弄Linux自動備份?

在這種情況下,速度不是問題,數據的完整性和可靠性是。

+0

你有使用MySql的服務器的root權限嗎? – XzKto

+0

我不明白:你有一個多人遊戲服務器,並且你購買了一臺用於備份的Mysql服務器?什麼的備份?我真的不明白你在做什麼,我會說在PHP中創建一個web服務,你可以用C++調用,但似乎有一些方法可以簡化你的需求。 –

+0

等待;這是關於備份的問題,還是關於通過PHP使用某種形式的API來獲取查詢結果的問題?似乎有2個問題在這裏。 –

回答

2

你的問題基本上建議用C++客戶端和PHP作爲服務器代理MySql請求。雖然這是完全可能的,並且可以有一些很好的解決方案(PHP可以使用原始套接字,所以創建代理應該不是什麼大問題),但您還有一個限制 - 您沒有root權限,因此您可以不創建任何套接字。這使我們只能使用HTTP協議。

通過HTTP協議執行遠程查詢是可能的:例如http://www.phpclasses.org/package/4000-PHP-Execute-remote-MySQL-queries-across-the-Web.html是一個示例PHP客戶端和PHP服務器。但總會有嚴重的限制:每個單獨的請求將是一個單獨的MySql連接,因此一些MySql功能將很難做到非常準確:臨時表等。

想要執行的查詢越複雜,應用程序越複雜將得到:準備好的語句,MySql轉義,獲取最後一次插入ID等等都有不同的傳輸格式,所以它們都必須寫在你的C++客戶端和PHP服務器上。

錯誤的機會也會增加:你將會得到額外的HTTP錯誤等。PHP中的MySql非常流行的原因之一是因爲它是可靠的:成千上萬的開發者/應用程序每天都在使用它,並且它可以被認爲是穩定的。但是你仍然可以找到關於PHP的MySql驅動的一些錯誤報告,所以想象一下在一些很少使用的代碼中會有多少錯誤?更重要的是,使用罕見的程序幾乎總是一個壞主意 - 如果有一天你會遇到一些模糊的錯誤,那麼將無處尋找解決方案。

在另一方面也有程序/腳本/建議如何做到自然而然的MySQL備份和最有可能您的Web(PHP),他們與熟知的方式,你可以做你自己一個做服務器上的大量

+0

你給我的問題的答案,你也認爲這是不是要走的路。 +1已接受。 – Valmond

1

如果您擔心備份,您絕對應該進行自動備份,這非常簡單。比方說,你要備份你的MySQL數據庫,每天中午12時許,使用cron作業:

0 0 * * * mysqldump dbname -u username -ppassword > /path/to/store/backup

,如果你想存儲它異地然後,您可以只下載該備份。

+0

謝謝,但問題不在於如何備份(如果我必須由我自己來完成,我肯定會使用cron和mysql轉儲,但這只是一個開始,我需要在其他地方保護存儲並且在那裏傳輸數據(並在需要時返回)等等)。 – Valmond

+0

然後,您可以用第一個執行mysqldump並且下一行執行rsync到遠程服務器的2行腳本替換mysqldump命令。這足夠嗎?或者你需要更多的功能? – Ravi

1

我不確定我是否理解這個問題,但我會給它一個鏡頭。您可以使用任何您想要的語言生成一組SQL命令客戶端...確保處理轉義。拿這個數組,使用Serialize,JSON等進行編碼。將純文本字符串傳遞給PHP api。在PHP方面:

mysql_connect($server, $username, $pass); 
@mysql_select_db($db) or die("Cannot select DB."); 

$unencoded = unserialize($_POST['input']) //Match for w/e encoding you used 

$cnt=0; 

foreach($unencoded as $query){ 

mysql_query($query) or die(mysql_error()); 
$cnt++ 

} 

return "$cnt Queries"; 

這將是危險的,雖然因爲上面預計完全逃脫的字符串。我肯定還會加入一些散列驗證來避免漏洞。您也可以使用SOAP請求,但我非常懷疑啓用了擴展。也許一個簡單的數組結構的替代方案會更復雜一些,這將允許您逃脫用戶生成的部分...這樣的事情可能是什麼?

$queries['SELECT'][$cnt] = array('cols'=>"*", 'from'=>'table', 'where'=>'condition'); 

然後循環通過php端,使用mysql_real_escape_string對數組的值。


+0

那麼,作者說:「在這種情況下,速度不是問題,數據完整性和*可靠性*。」這是非常不可靠的。 MySql錯誤代碼,循環遍歷C++中的結果數組,超時,HTTP錯誤代碼......我甚至沒有談論準備好的語句和交易,它們必須在任何好的多人遊戲中。 – XzKto

+0

同意。沒有一種真正可靠的方法可以將完整的命令傳遞給服務器,這就是爲什麼我還建議使用備用數組結構。還應該使用MD5/SHA驗證來驗證從客戶端到服務器的數據完整性。如果僅僅是簡單的選擇查詢,這可以很容易地完成,但對於更復雜的查詢可能不是一個好主意。模具命令只是用於調試,不應該用於生產,特別是迴應實際的錯誤。 –

+0

努力的+1 :-) – Valmond