能不能用PHP实现,限制服务器每2秒接受单个IP最多5次请求。如何实现呢

解决方案 »

  1.   

    session_start();
    if(isset($_SESSION['lasttime']) && time()-$_SESSION['lasttime'] < 2)
      exit;
    else
      $_SESSION['lasttime'] = time();
      

  2.   


    那IP也是存在SESSION里面吗?
    如果这个文件几秒内的访问量超过几十万的,用SESSION好还是用表好?
      

  3.   

    一般的说 IP 和 SESSION 是捆绑在一起的几秒内的访问量超过几十万的
    这是不肯能出现的现象,如这有这种情况,你的服务器早就崩溃了
      

  4.   


    哦哦,谢谢指导!!
    简单的几句好像就解决问题了,我本来是打算存在数据库里,每一个IP对应一条记录,然后有访问量,时间等等字段的。。
    其实很好奇,前辈说的崩溃,大概多少算是正常的,对这方面真的一窍不通。。
    最后希望能告诉我一下,哪种方法最好,SESSION还是数据库。、
    万分感谢、、
      

  5.   

    对了,SESSION和浏览器的开启到关闭的实际关系是怎么样的,如果有人恶意向你网站的文件不断POST信息,例如抢购,SESSION能够解决上面的问题吗。
      

  6.   

    如果不设置COOKIE的时间的话,浏览器关闭SESSION失效
      

  7.   

    浏览器关闭,session失效。
    能,可以记录ip.阻止它重复提交。
      

  8.   

    本帖最后由 PhpNewnew 于 2012-04-25 20:50:28 编辑
      

  9.   

    没有详细,根据你的实际情况定夺。高并发会占用你服务器的内存.如果要存储到SESSION可以考虑存储到memcache.
    上面说了,一般情况下关闭浏览器 SESSION就结束,如果你的要求严格可能不符合你的需要.
    如果仅仅是为了防止他人攻击,还是应该考虑防火墙这类专业的软件.
      

  10.   

    你需要了解的只是实在是太多太多了
    用户的请求到达php,需要经过n多的环节本版只讨论归php解决的问题,之前的种种环节的问题都有相应的讨论区
      

  11.   


    谢谢,那我再详细说明一下我的PHP要处理的事情吧,其它的就不提了。
    其实是为了防止一些人恶意抢购活动的,因为只要满足了条件的账号,就可以抢购,我们假设对方已经有一批满足条件的账号,然后用程序不断替换账号向我们的抢购链接进行POST数据,导致短时间内把所有名额抢空。为了避免这种情况,只好限制IP,对同一IP内请求这个文件的人,进行SLEEP(暂时想到这个),再返回。。所以一开始打算存在数据库里。
    希望前辈指点下,成分感谢
      

  12.   

    $_SERVER是可以拿到IP的,把IP入库到memcached里就行了,存入ip=>(last_time,count)。算法:如果ip不存在,插入ip=>(now(),count=1)
    如果now() - last_time > 2秒,令count=0 ,并++count,记录last_time(使用memached原子加法)。
    如果now() - last_time < 2秒,令++count。
      

  13.   


    -,- 忘了说如何限制了,先在memcahced查ip,如果ip被拉黑直接过滤,否则:如果now()-last_time < 2秒的情况下:1, ++ count
    2, 如果count > 5,拉黑(需要入数据库黑名单,同时写memcached标记为黑(生命期1天))
    3,如果count < 5,不操作。
      

  14.   

    那就你按照自己的加密方法加token 然后到提交后的页面解出这个token 正常的就是安全的提交 不正常的就是假的 直接抛弃。//$_POST['token']='xoaUIjxn3osmssapoeoj2983';
    if (myunencode($_POST['token'])=='mytest'){
    ....
      

  15.   

    谢谢你的详细回答,我去看下memcache的相关文档先。。
      

  16.   


    思路应该没什么问题:某ip第一次请求,记录下该用户访问的ip,访问次数当然是1,可以把值放到sessin也可以是数据库。session是访问内存,数据库查询是访问磁盘文件文件,所以前者速度快。
    当第二次请求,先从session或者数据库中,查询是否有该用户访问记录,没有就创建,有就添加访问次数。PS:memcache的优势在于大并发下做负载均衡和存储容量的横向扩展。此处使用毫无优势可言。