欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP 并發(fā)場景的幾種解決方案

PHP 并發(fā)場景的幾種解決方案

熱門標簽:百度地圖怎樣標注圖標 百度地圖標注偏差 咸寧銷售電銷機器人系統 余姚電話機器人 開發(fā)地圖標注類網站 400電話蘭州申請請 電銷機器人問門薩維品牌my 外呼系統能給企業(yè)帶來哪些好處 廣東廣州在怎么申請400電話

在秒殺,搶購等并發(fā)場景下,可能會出現超賣的現象,在PHP語言中并沒有原生提供并發(fā)的解決方案,因此就需要借助其他方式來實現并發(fā)控制。

列出常見的解決方案有:

  • 使用隊列,額外起一個進程處理隊列,并發(fā)請求都放到隊列中,由額外進程串行處理,并發(fā)問題就不存在了,但是要額外進程支持以及處理延遲嚴重,本文不先不討論這種方法。
  • 利用數據庫事務特征,做原子更新,此方法需要依賴數據庫的事務特性。
  • 借助文件排他鎖,在處理下單請求的時候,用flock鎖定一個文件,成功拿到鎖的才能處理訂單。

一、利用 Redis 事務特征

redis 事務是原子操作,可以保證訂單處理的過程中數據沒有被其它并發(fā)的進程修改。

示例代碼:

?php
$http = new swoole_http_server("0.0.0.0", 9509);  // 監(jiān)聽 9509

$http->set(array(
  'reactor_num' => 2, //reactor thread num
  'worker_num' => 4  //worker process num
));

$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {
  $uniqid = uniqid('uid-', TRUE);  // 模擬唯一用戶ID
  $redis = new Redis();
  $redis->connect('127.0.0.1', 6379);  // 連接 redis

  $redis->watch('rest_count'); // 監(jiān)測 rest_count 是否被其它的進程更改

  $rest_count = intval($redis->get("rest_count")); // 模擬唯一訂單ID
  if($rest_count > 0){
    $value = "{$rest_count}-{$uniqid}"; // 表示當前訂單,被當前用戶搶到了

    // do something ... 主要是模擬用戶搶到單后可能要進行的一些密集運算
    $rand = rand(100, 1000000);
    $sum=0;
    for ($i=0;$i$rand;$i++){ $sum+=$i; }

   // redis 事務
    $redis->multi();
    $redis->lPush('uniqids', $value);
    $redis->decr('rest_count');
    $replies = $redis->exec(); // 執(zhí)行以上 redis 事務

   // 如果 rest_count 的值被其它的并發(fā)進程更改了,以上事務將回滾
    if(!$replies){
      echo "訂單 {$value} 回滾".PHP_EOL;
    }
  }
  $redis->unwatch();
});

$http->start();

使用 ab 測試

$ ab -t 20 -c 10 http://192.168.1.104:9509/

二、利用文件排他鎖(阻塞模式)

阻塞模式下,如果進程在獲取文件排他鎖時,其它進程正在占用鎖的話,此進程會掛起等待其它進程釋放鎖后,并自己獲取到鎖后,再往下執(zhí)行。

示例代碼:

?php
$http = new swoole_http_server("0.0.0.0", 9510);

$http->set(array(
  'reactor_num' => 2, //reactor thread num
  'worker_num' => 4  //worker process num
));

$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {

  $uniqid = uniqid('uid-', TRUE);
  $redis = new Redis();
  $redis->connect('127.0.0.1', 6379);

  $fp = fopen("lock.txt", "w+");

  // 阻塞(等待)模式, 要取得獨占鎖定(寫入的程序)
  if(flock($fp,LOCK_EX))  //鎖定當前指針
  {
   // 成功取得鎖后,放心處理訂單
    $rest_count = intval($redis->get("rest_count"));
    $value = "{$rest_count}-{$uniqid}";
    if($rest_count > 0){
      // do something ...
      $rand = rand(100, 1000000);
      $sum=0;
      for ($i=0;$i$rand;$i++){ $sum+=$i; }

      $redis->lPush('uniqids', $value);
      $redis->decr('rest_count');
    }

   // 訂單處理完成后,再釋放鎖
    flock($fp,LOCK_UN);
  }
  fclose($fp);

});

$http->start();

使用 ab 測試

$ ab -t 20 -c 10 http://192.168.1.104:9510/

三、利用文件排他鎖(非阻塞模式)

非阻塞模式下,如果進程在獲取文件排他鎖時,其它進程正在占用鎖的話,此進程會馬上判斷獲取鎖失敗,并且繼續(xù)往下執(zhí)行。

示例代碼:

?php
$http = new swoole_http_server("0.0.0.0", 9511);

$http->set(array(
  'reactor_num' => 2, //reactor thread num
  'worker_num' => 4  //worker process num
));

$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {

  $uniqid = uniqid('uid-', TRUE);
  $redis = new Redis();
  $redis->connect('127.0.0.1', 6379);

  $fp = fopen("lock.txt", "w+");

  // 非阻塞模式, 如果不希望 flock() 在鎖定時堵塞,則給 lock 加上 LOCK_NB
  if(flock($fp,LOCK_EX | LOCK_NB))  //鎖定當前指針
  {
   // 成功取得鎖后,放心處理訂單
    $rest_count = intval($redis->get("rest_count"));
    $value = "{$rest_count}-{$uniqid}";
    if($rest_count > 0){
      // do something ...
      $rand = rand(100, 1000000);
      $sum=0;
      for ($i=0;$i$rand;$i++){ $sum+=$i; }

      $redis->lPush('uniqids', $value);
      $redis->decr('rest_count');
    }

   // 訂單處理完成后,再釋放鎖
    flock($fp,LOCK_UN);
  } else {
   // 如果獲取鎖失敗,馬上進入這里執(zhí)行
    echo "{$uniqid} - 系統繁忙,請稍后再試".PHP_EOL;
  }
  fclose($fp);

});

$http->start();

使用 ab 測試

$ ab -t 20 -c 10 http://192.168.1.104:9511/

最后給出三種處理方式的測試結果比較

redis 事務方式:

......
Concurrency Level:   10
Time taken for tests:  20.005 seconds
Complete requests:   17537
Failed requests:    0
Total transferred:   2578380 bytes
HTML transferred:    0 bytes
Requests per second:  876.62 [#/sec] (mean)
Time per request:    11.407 [ms] (mean)
Time per request:    1.141 [ms] (mean, across all concurrent requests)
Transfer rate:     125.86 [Kbytes/sec] received
......

文件排他鎖(阻塞模式):

......
Concurrency Level:   10
Time taken for tests:  20.003 seconds
Complete requests:   8205
Failed requests:    0
Total transferred:   1206282 bytes
HTML transferred:    0 bytes
Requests per second:  410.19 [#/sec] (mean)
Time per request:    24.379 [ms] (mean)
Time per request:    2.438 [ms] (mean, across all concurrent requests)
Transfer rate:     58.89 [Kbytes/sec] received
......

文件排他鎖(非阻塞模式):

......
Concurrency Level:   10
Time taken for tests:  20.002 seconds
Complete requests:   8616
Failed requests:    0
Total transferred:   1266846 bytes
HTML transferred:    0 bytes
Requests per second:  430.77 [#/sec] (mean)
Time per request:    23.214 [ms] (mean)
Time per request:    2.321 [ms] (mean, across all concurrent requests)
Transfer rate:     61.85 [Kbytes/sec] received
......

經測試結果對比,redis 事務方式優(yōu)于文件排他鎖方式,而文件排他鎖方式中,非阻塞模式優(yōu)于阻塞模式。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • PHP下用Swoole實現Actor并發(fā)模型的方法
  • 淺談并發(fā)處理PHP進程間通信之System V IPC
  • 淺談并發(fā)處理PHP進程間通信之外部介質
  • PHP+Redis鏈表解決高并發(fā)下商品超賣問題(實現原理及步驟)
  • 詳解PHP中curl_multi并發(fā)的實現
  • php多進程并發(fā)編程防止出現僵尸進程的方法分析
  • PHP高并發(fā)和大流量解決方案整理
  • php多進程模擬并發(fā)事務產生的問題小結
  • 淺談Swoole并發(fā)編程的魅力

標簽:巴彥淖爾 鷹潭 銅陵 臨沂 重慶 麗江 衡陽 十堰

巨人網絡通訊聲明:本文標題《PHP 并發(fā)場景的幾種解決方案》,本文關鍵詞  PHP,并發(fā),場景,的,幾種,解決方案,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP 并發(fā)場景的幾種解決方案》相關的同類信息!
  • 本頁收集關于PHP 并發(fā)場景的幾種解決方案的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    日本不卡123| 中文字幕一区二区三区人妻| 青青操在线视频观看| 久久久777精品电影网影网| 美女视频黄 久久| 星空大象在线观看免费播放| 在线播放中文字幕一区| 亚洲午夜免费视频| 中文字幕三级电影| 5月丁香婷婷综合| 首页综合国产亚洲丝袜| 亚洲中文字幕一区| 日韩欧美一卡二卡| 六月丁香婷婷久久| 久久久视频6r| 国产人久久人人人人爽| 国产精品自在在线| 91精品少妇一区二区三区蜜桃臀| 中文字幕不卡在线播放| 国产ts人妖一区二区| 免费中文字幕在线| 亚洲乱码国产乱码精品精98午夜| 少妇高潮一69aⅹ| 在线不卡中文字幕播放| 男女激情视频一区| 欧美熟妇激情一区二区三区| 久久精品在线免费观看| 成人综合婷婷国产精品久久| 色视频一区二区| 亚洲国产视频直播| 日本高清www| 国产农村妇女精品| aaa亚洲精品| 欧美日本在线看| 免费成人性网站| sm捆绑调教视频| 亚洲人成影院在线观看| 日本久久久久久久久久| 精品国产乱码久久久久久蜜臀| 国产精品自拍在线| 欧亚洲嫩模精品一区三区| 天天影视涩香欲综合网| 91资源在线播放| 日韩美女精品在线| 亚洲熟女一区二区| 久久久久国产精品麻豆| www.久久精品| 91精品国产乱码| 国产精品自拍在线| 欧美性大战久久久| 久久精品国产99国产| 成年人午夜剧场| 午夜精品久久久久久久| 日韩不卡av在线| 一区二区三区高清| 青娱乐国产视频| 亚洲精品高清视频在线观看| 色噜噜在线观看| 国产精品乱子久久久久| 国产一级黄色录像| 免费看91的网站| 亚洲精品成人在线| 成人午夜剧场视频网站| 综合av第一页| 国产精品亚洲无码| 亚洲免费资源在线播放| 国产jk精品白丝av在线观看| 亚洲色图清纯唯美| 无码国产69精品久久久久同性| 国产精品福利一区| 精品人妻一区二区三区视频| 成人免费一区二区三区视频| 精品人妻一区二区三区视频| 亚洲免费在线电影| 一区二区三区在线观看免费视频| 一二三区精品视频| 美女视频久久久| 日韩vs国产vs欧美| 在线中文字幕一区| 国产伦精品一区二区三区视频青涩| 欧美日韩精品一区二区三区| 国产精品99久久久久久久女警 | 玖玖爱这里只有精品| 日本在线播放一区二区三区| 色域天天综合网| 国产毛片精品一区| 日韩精品中文字幕一区二区三区| av色综合久久天堂av综合| 久久久国产精华| 亚洲黄色在线网站| 亚洲伊人伊色伊影伊综合网| 亚洲欧美小视频| 国产揄拍国内精品对白| 日韩三级在线观看| 美女露出粉嫩尿囗让男人桶| 亚洲少妇屁股交4| 91n在线视频| 国产一区在线视频| 欧美一区二区视频在线观看 | 成人福利视频网站| 久久久国际精品| 欧美特黄一区二区三区| 亚洲成人一二三| 欧美日韩中文字幕精品| heyzo一本久久综合| 国产精品污www在线观看| 性欧美精品男男| 另类专区欧美蜜桃臀第一页| 91精品国产综合久久久久久漫画 | 国产日韩欧美精品综合| 一级性生活大片| 视频一区免费在线观看| 欧美日韩电影在线播放| 人妻少妇偷人精品久久久任期| 中文字幕一区二区三区四区不卡| 国产一区二区三区视频播放| 国产一区二区三区在线观看免费视频| 欧美sm美女调教| 青青草福利视频| 久久国产综合精品| 欧美v国产在线一区二区三区| 美女又爽又黄免费| 水野朝阳av一区二区三区| 欧美精品亚洲二区| 99re这里只有| 蜜臀av亚洲一区中文字幕| 无码国产69精品久久久久同性| 午夜久久福利影院| 91精品国产福利在线观看| 97精品人妻一区二区三区蜜桃| 亚洲一区二区精品3399| 欧美日韩大陆一区二区| 800av在线播放| 男女男精品视频| 337p粉嫩大胆色噜噜噜噜亚洲| 熟女俱乐部一区二区视频在线| 久久精品国产久精国产| 久久精品水蜜桃av综合天堂| 中文字幕乱码av| eeuss鲁片一区二区三区在线看| 亚洲欧洲日产国码二区| 色狠狠色噜噜噜综合网| 一区二区在线免费观看视频| 亚洲第一福利视频在线| 日韩欧美国产午夜精品| 国产在线综合视频| 国产99久久久久| 亚洲精品国久久99热| 欧美日本视频在线| 大又大又粗又硬又爽少妇毛片| 精品午夜一区二区三区在线观看 | 国产精品一区在线观看乱码 | 爽爽淫人综合网网站| 日韩女优av电影| 美女av免费看| 成人精品视频一区| 亚洲一级不卡视频| 欧美大尺度电影在线| 欧美xxxx精品| 99精品国产一区二区三区不卡| 亚洲国产成人高清精品| 亚洲精品一线二线三线| 天堂网avav| 动漫美女无遮挡免费| 美国三级日本三级久久99| 中文字幕二三区不卡| 在线这里只有精品| 国产高清自拍视频| 丁香六月久久综合狠狠色| 亚洲专区一二三| 欧美精品一区二区蜜臀亚洲| 成年人午夜剧场| 粉嫩av懂色av蜜臀av分享| 国产高清在线精品| 亚洲二区在线观看| 国产三级久久久| 欧美精品xxxxbbbb| 美女洗澡无遮挡| 成人爱爱电影网址| 日本强好片久久久久久aaa| 国产精品天干天干在观线| 欧美精品视频www在线观看| 亚洲 欧美 国产 另类| 熟女人妻一区二区三区免费看| 麻豆精品精品国产自在97香蕉| 最新日韩在线视频| 欧美精品一区二区三区很污很色的| 色综合久久中文字幕综合网| 少妇精品一区二区三区| 99精品热视频| 九九**精品视频免费播放| 一区二区三区免费看视频| 久久久99精品久久| 91精品在线免费| 丰满少妇高潮久久三区| xxxxx在线观看| 亚洲美女精品视频| 国产a级毛片一区| 蜜桃视频一区二区| 亚洲与欧洲av电影|