PHP:防止数据库溢出

时间:2012-02-07 22:26:21

标签: php mysql

我有微小的URL服务,向服务器发送数据只是使用ajax函数,它将数据发送到某个页面并将数据插入数据库。

我只是玩了一下firebug,我发现我可以在一秒钟内循环ajax函数数千次,它正在浮动我的数据库..我刚刚做了..

会话和cookie无法从明显的原因起作用。

how can i prevent this?

2 个答案:

答案 0 :(得分:1)

解决此问题的一种非常简单的方法,可以很好地工作并防止DDOS攻击,就是在后期处理功能上使用批量插入。对于你的tinyurl,调用保存在平面文本文件中作为文件系统上的连接文件输入的所有数据,例如(CSV)适用于此。

然后每隔1~5分钟运行一次cron作业,读取文本文件,然后将 bulk 插入到mysql中。这里的关键是进行批量插入。执行1次批量插入比100,000,000次单次查询更有效。

为了让您了解我每天处理大量数据插入,每分钟我们会收到大约100万次插入请求。单个查询执行1 mil插入将占用我们的巨大数据库服务器大约15分钟。将它们作为批量插入执行大约需要18秒。令人震惊的是,批量插入的速度有多快,而且你的mysql盒上只消耗了1个连接。

批量插入与常规插入非常相似,查询中唯一的区别在于VALUES部分。例如,你通常会有VALUES =('abc','123','abc')你现在有...... VALUES =(('abc','123','abcd'),('cde' , '456', 'DSW');

希望这会有所帮助:)

答案 1 :(得分:0)

我认为你想要防止的是DOS(拒绝服务)攻击。网上有很多关于如何防止这种情况的信息。对于非常简单的服务解决方案,您可以限制与数据库的交互,以要求请求之间暂停。

您可以使用会话来帮助防止这种情况发生。

流速:

  1. 用户观看页面 - 创建会话
  2. 用户使用基于ajax的服务
  3. 在ajax请求中 - 检查会话是否包含“last_run”时间戳。
  4. 如果它不存在,请允许查询,添加“last_run”
  5. 如果它确实存在并且时间戳早于超时(比如1秒),请允许查询,更新“last_run”。
  6. 如果确实存在并且时间戳不早于超时,请不要允许查询。