我有一个专用的Linux服务器和我的多人游戏(C ++ / Sockets),最近我为我的网页获得了一个MySQL服务器“服务”(我还有一个用PHP完成的小型多人游戏)所以我不喜欢需要考虑备份等。
MySQL服务非常适合我的网页,但我无法从服务器连接到数据库,因为它们不在同一个内部网络上。 唯一可以完成的连接必须来自提供商服务器上托管的网页。
我想过将来自服务器(C ++游戏服务器)的请求发送到连接到数据库的PHP网页并发回答案。 这适用于任何简单的请求(比如有多少HP有玩家X)但是当涉及到迭代请求时(即“SELECT id FROM player”),那里有很多答案,它变得更加复杂。
有没有一种标准的方法来规避这个?有没有证据可以在某处读取PHP / C ++代码?任何其他方式(即某种假端口转发)?
或者我应该咬酸苹果并开始摆弄Linux自动备份?
在这种情况下,速度不是问题,数据完整性和可靠性是。
答案 0 :(得分: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错误等.MySQL中MySql如此受欢迎的原因之一是因为它是可靠的:成千上万的开发人员/应用程序每天都在使用它,它可以被认为是稳定的。但是你仍然可以找到一些关于PHP的MySql驱动程序的bug报告,想象一下在一些很少使用的代码中会有多少bug?而且,使用稀有程序几乎总是坏主意 - 如果有一天你得到一些模糊的错误,那么就无处可寻找解决方案。
另一方面,很多程序/脚本/建议如何进行自动MySql备份,而且最有可能在您的Web(PHP)服务器上使用众所周知的方法之一你可以自己做。
答案 1 :(得分:1)
如果您关心的是备份,那么您肯定应该进行自动备份,这非常简单。假设您希望每天早上12点备份您的mysql数据库,请使用此cron作业:
0 0 * * * mysqldump dbname -u username -ppassword > /path/to/store/backup
如果您想将其存储在异地,则可以下载此备份。
答案 2 :(得分:1)
我不确定我是否理解这个问题,但我会试一试。您可以使用您想要的任何语言生成SQL命令客户端的数组...确保处理转义。获取该数组,使用Serialize,JSON等对其进行编码。将纯文本字符串通过post传递给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对数组的值。