【问题标题】:PHP: prevent from overflow the databasePHP:防止数据库溢出
【发布时间】:2012-02-07 22:26:20
【问题描述】:

我有一个很小的 ​​url 服务,向服务器发送数据只是使用 ajax 功能,它将数据发送到特定页面并将数据插入数据库。

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

由于明显的原因,会话和 cookie 无法在这里工作..

how can i prevent this?

【问题讨论】:

标签: php mysql


【解决方案1】:

解决这个问题的一个非常简单的方法是在后处理功能上使用批量插入,并且效果非常好并且可以防止 DDOS 攻击。对于您的 tinyurl,调用将所有正在输入的数据作为文件系统上的串联文件保存在平面文本文件中,例如 (CSV) 非常适合。

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

为了给您一个想法,我每天处理大量数据插入,我们每分钟收到大约 100 万个插入请求。将 1 百万次插入作为单个查询在我们的 huge 数据库服务器上花费大约 15 分钟。将它们作为批量插入执行大约需要 18 秒。令人惊讶的是,批量插入的速度快得多了,而且您的 mysql 机器上也只消耗了 1 个连接。

批量插入与常规插入非常相似,唯一不同的是查询中的 VALUES 部分。例如,您通常会有 VALUES=('abc','123','abc') 的地方... VALUES=(('abc','123','abcd'),('cde' ,'456','dsw');

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

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

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

    流程:

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

    【讨论】:

    • 这可能是为了防止意外误用和 refresh-refresh-refresh “攻击”。它不会妨碍某人丢弃会话 cookie 并发出新请求。
    • 正确,这只是一个简单的解决方案。如果需要更多信息,我们需要更多关于特定设置、他实际试图阻止的内容、交易数量、硬件解决方案是否可行等方面的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多