php实现接口限流

php接口限流主要是防止高并发造成服务器扛不住的情况下,需要限制数据的获取,简单实现就是结合redis实现。

<?php

/**
 * api 接口限流
 *
 */

class api
{

    public function get_client_ip($type = 0) {
        $type       =  $type ? 1 : 0;
        static $ip  =   NULL;
        if ($ip !== NULL) return $ip[$type];
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos    =   array_search('unknown',$arr);
            if(false !== $pos) unset($arr[$pos]);
            $ip     =   trim($arr[0]);
        }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip     =   $_SERVER['HTTP_CLIENT_IP'];
        }elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip     =   $_SERVER['REMOTE_ADDR'];
        }
        // IP地址合法验证
        $long = ip2long($ip);
        $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
        return $ip[$type];
    }

    public function test()
    {

        //接口时间限流,这种方式可以防止钻时间漏洞无限的访问接口 比如在59秒的时候访问,就钻了空子
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $ip = $this->get_client_ip(true);
        $len = $redis->lLen($ip);
        if($len === 0)
        {
            $redis->lPush($ip,time());
            echo "访问1次<br>";
            $redis->expire($ip,60);
        }else{
            //判断有没有超过1分钟
            $max_time = $redis->lRange($ip,0,0);
            //判断最后一次访问的时间比对是否超过了1分钟
            if((time()- $max_time[0]) < 60){
                if($len> 10){

                    echo '访问超过了限制';
                }else{

                    $redis->lPush($ip,time());
                    echo "访问{$len}次<br>";
                }
            }
        }
    }

}
(new api())->test();

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值