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

?>

相關文章
相關標籤/搜索