PHP控制站点并发

通常来讲,一个项目中老是会有一些较难处理的业务,好比业务复杂花样繁多的搜索,使用搜索系统如sphinx,lucence等来处理的话,数据源的如果变化过快(如顶、踩、浏览数之类),则首先推数据的频率就较难衡量,另外没法精确搜索或排序。因此通常状况下的作法是经过DB进行搜索,而且除了尽可能将业务分解到程序层面外,还会在DB前加一层cache。可是这样作也有很多已知的弊端:php

一、实际上不少业务没法放到普通的PHP中处理,如一些较复杂的排序、筛选,经过普通的PHP来实现的话效率还不如MYSQL。ajax

二、cache的命中率也很差保证,特别是对一些使用关键词进行查询的业务,关键词变化太多。服务器


如果遇到恶意刷的话,DB服务器容易直接挂掉,所以咱们能够在程序层面上加一层限制器,限制并发数,该限制器具有如下特色:并发

一、高效(废话么,不然直接刷限制器就刷爆了)。如今是使用memcache进行原子操做计数,能够扩展成使用其余方法。this

二、精确到action层。能够单独限制单个页面。排序

三、方便。见仁见智吧it

四、成本低廉。包括研发成本与硬件成本。io


根据压测,原先只能100并发的搜索功能,限制100后,压测800结果正常。function


使用方法以下:效率


<?php

    /**

     * 搜索

     */

    public function search(){

        //增长计数器功能,超过次数则返回系统繁忙

        $viewlimiter = Library::load('viewlimiter');

        //访问限制器的名称,请用controller+action,尽可能单个页面保持惟一

        $limitName = 'search_search';

        //最多同时访问数

        $limit = 100;

        //如果超过数量则直接返回

        if(!$viewlimiter->check($limitName, $limit)) {

            ajaxOutput(0, $this->lang->line('multi_search_limit'));

        }


        /*----复杂变态的业务逻辑-----*/

        $xxxModel->search($params);

    }

    //end func

?>

相关文章
相关标签/搜索