歡迎來到深圳市來科信科技有限公司網站!
        您當前的位置:深圳APP開發 > 新聞資訊 > APP開發資訊 >

        已閱讀

        用PHP進行APP開發如何解決并發問題

        來源:www.bqtao.cn ?? ?? 發布時間:2017-09-26
        在深圳的APP開發公司中,用PHP做為開發語言的不少。雖然PHP語言適合做互聯網產品,特別是web產品,在成本和效率上都有一定優勢。但是并發量的問題,始終是PHP的弱勢。比如開發一個商城,對于商品搶購等并發場景下,可能會出現超賣的現象,這時就需要解決并發所帶來的這些問題了。在PHP語言中并沒有原生的提供并發的解決方案,那怎么辦呢,這就需要借助其他方式來實現并發控制。
         
        用PHP進行APP開發
         
        方案一:使用文件鎖排它鎖
         
        flock函數用于獲取文件的鎖,這個鎖同時只能被一個線程獲取到,其它沒有獲取到鎖的線程要么阻塞,要么獲取失敗。
        在獲取到鎖的時候,先查詢庫存,如果庫存大于0,則進行下訂單操作,減庫存,然后釋放鎖。
         
         
        方案二:使用MySQL數據庫提供的悲觀鎖
         
        Innodb存儲引擎支持行級鎖,當某行數據被鎖定時,其他進程不能對這行數據進行操作。
        先查詢并鎖定行:select stock_num from table where id=1 for update
        if(stock_num > 0){
        //下訂單
        update table set stock_num=stock-1 where id=1
        }
         
        方案三:使用隊列
         
        將用戶的下單請求依次存入一個隊列中,后臺用一個單獨的進程處理隊列中的下單請求。
         
        方案四:使用Redis
         
        redis的操作都是原子性的,可以將商品的庫存存入redis中,下單之前對庫存進行decr操作,如果返回的值大于等于0等可以下單,否則不能下單,這種方式效率較高
        if(redis->get('stock_num') > 0){
        stock_num = redis->decr('stock_num')
        if(stock_num >= 0){
        //下訂單
        }else{
        //庫存不足
        }
        }else{
        //庫存不足
        }
         
        其他并發問題:
         
        在現實應用中,很多情況下會把數據存入緩存,當緩存失效時,去數據庫取數據并重新設置緩存,如果這時并發量很大,會有很多進程同時去數據庫取數據,導致很多請求穿透到數據庫,而使數據庫奔潰,這里可用文件鎖來解決。
         
        [php] view plain copy
        $data = $cache->get('key');
        if(!$data){
        $fp = fopen('lockfile');
        if(flock($fp, LOCK_EX)){
        $data = $cache->get('key');//拿到鎖后再次檢查緩存,這時可能已經有了
        if(!$data){
        $data = mysql->query();
        $cache->set('key', $data);
        }
        flock($fp, LOCK_UN);
        }
        fclose($fp);
        }
        說到底,PHP要解決并發問題就必須要加鎖,各種方案的本質其實都是加鎖。希望上面的分享能對您有所幫助。
         
        APP開發 網站開發 產品設計 微信公眾號 APP開發公司 用戶體驗 APP運營 微信小程序 產品經理 網站設計