使用AJAX写出在线摸摸的神奇经历

           

发布于 2022-03-12  744 人经过了这里


这两天又心血来潮,于是想写一个能在线摸摸的网页

这次主要想实现的是点击摸摸不刷新网页,并且数据实时更新,不需要网页整体更新
因为昨天不会,于是写的是POST形式的,点一次刷新一次界面才能更新数据,非常的不银杏
大概就跟前段时间写的ARCPTT计算器一样,点提交才会刷新:qwq.re/arcaea

于是查来查去问来问去,发现AJAX对于这个很方便
在一下午的AJAX学习中,把这个也是断断续续的,最终实现了
这来使用的是JS来编写AJAX,在php文件中,所以是使用这样的格式:

echo '<script>
        function renew(){
            ......
        }
    ......
    </script>';

感谢W3School的AJAX教程,让我学的非常清晰明白:传送门
其中,这次写了3个函数,分别为刷新数据,摸1次,摸10次
三个函数的基本内容都是这样的:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()...
xmlhttp.open("GET", "...", true);
xmlhttp.send();

当然,对于刷新,我们需要文本替代,对于两个摸,需要使用GET请求的参数
前端完成了,然后是后端:后端这次我使用的是简单的PHP连接数据库
原理和上次是一样的,大概是这样的结构:

$con = mysqli_connect("...","...","...","...");
$ans = mysqli_query($con,"SELECT ... FROM ...");
if(mysqli_num_rows($ans) > 0)
    while($row = mysqli_fetch_assoc($ans))
        if($row["id"] == 1)

于是,在半个下午的折腾过后,终于!
不用刷新的牛牛摸摸网页做好了:qwq.re/click
使用截图如下(18:59截图)

你以为就这样就结束了吗?

当然不是!!!

在我把这个链接发给群友的时候,大家就开始了争前恐后的"DDOS"

首先是纸鹞开始了,我就看到每秒钟几百的摸摸增长~~~
本来以为这就没了,然后我就看到了更多的(xxx

然后接下来的几个小时,摸摸就“慢慢”地涨到了百万级别(x
当然这中间我总不能闲着吧,都看到服务器负载100%了!
于是我思考了各种限制接口调用频率的方法:

首先我是想,在SQL中多建一个时间戳,每次更新时也更新时间戳,两个时间戳必须隔0.3s
但是这个方法太本末倒置了(x
然后问了问戴兜,他甚至还帮我写好了一份(x
最后去百度搜,发现最简单的方法是使用Redis
Redis是一个PHP的扩展包,是关于缓存的,很适合作为调用限制

于是,在使用Redis的情况下,很容易的实现了限制调用
每个IP在每3秒只能使用3次接口,以下是部分代码(不全)

$redis = new Redis();
$key=get_real_ip();//获取真实IP
$limit = 3;//次数
$check = $redis->exists($key);
if($check){
    $redis->incr($key);
    $count = $redis->get($key);
    if($count > 3){//次数
        exit('请求太频繁,请稍后再试!');
    }
}else{
    $redis->incr($key);
    $redis->expire($key,3);//时间
}
$count = $redis->get($key);
echo '第 '.$count.' 次请求';

在保存后,这次终于没有再爆发式的增长啦w
也算是大功告成了!
以上就是今天的怪怪经历(什x