亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP 并發場景的幾種解決方案

2024-05-05 00:09:38
字體:
來源:轉載
供稿:網友

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

列出常見的解決方案有:

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

一、利用 Redis 事務特征

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

示例代碼:

<?php$http = new swoole_http_server("0.0.0.0", 9509);  // 監聽 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'); // 監測 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(); // 執行以上 redis 事務   // 如果 rest_count 的值被其它的并發進程更改了,以上事務將回滾    if(!$replies){      echo "訂單 {$value} 回滾".PHP_EOL;    }  }  $redis->unwatch();});$http->start();

使用 ab 測試

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

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

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

示例代碼:

<?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/

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

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

示例代碼:

<?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 {   // 如果獲取鎖失敗,馬上進入這里執行    echo "{$uniqid} - 系統繁忙,請稍后再試".PHP_EOL;  }  fclose($fp);});$http->start();

使用 ab 測試

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

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

redis 事務方式:

......Concurrency Level:   10Time taken for tests:  20.005 secondsComplete requests:   17537Failed requests:    0Total transferred:   2578380 bytesHTML transferred:    0 bytesRequests 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:   10Time taken for tests:  20.003 secondsComplete requests:   8205Failed requests:    0Total transferred:   1206282 bytesHTML transferred:    0 bytesRequests 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:   10Time taken for tests:  20.002 secondsComplete requests:   8616Failed requests:    0Total transferred:   1266846 bytesHTML transferred:    0 bytesRequests 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 事務方式優于文件排他鎖方式,而文件排他鎖方式中,非阻塞模式優于阻塞模式。

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


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲毛片在线观看.| 亚洲精品视频中文字幕| 久久99热精品这里久久精品| 国产日韩综合一区二区性色av| 国产精品激情av电影在线观看| 人人澡人人澡人人看欧美| 国产精品久久久久久网站| 中文字幕精品久久| 久久人人爽人人爽人人片亚洲| 国产成人免费91av在线| 欧美日韩激情视频8区| 热re91久久精品国99热蜜臀| 亚洲精品成人久久| 美女精品久久久| 92国产精品视频| 伊人久久免费视频| 欧美专区在线视频| 超碰日本道色综合久久综合| 亚洲欧美在线一区二区| 精品国产美女在线| 久久天堂电影网| 欧美成人在线免费视频| 在线精品视频视频中文字幕| 国产精品视频区| 亚洲国产精品视频在线观看| 成人一区二区电影| 日韩av影视综合网| 久久99精品国产99久久6尤物| 亚洲精品免费一区二区三区| 亚洲欧美中文在线视频| 欧美午夜激情在线| 日韩欧美在线中文字幕| 久久成人这里只有精品| 欧美激情日韩图片| 国产精品成熟老女人| 日韩亚洲成人av在线| 亚洲最大av在线| 热久久这里只有| 精品国产精品自拍| 中文字幕亚洲综合久久筱田步美| 91视频免费在线| 国产精品黄页免费高清在线观看| 国产午夜精品麻豆| 亚洲欧美中文日韩v在线观看| 久久精品男人天堂| 色综合久久精品亚洲国产| 亚洲久久久久久久久久| 精品国产一区二区三区久久| 日韩精品视频免费在线观看| 国产成人涩涩涩视频在线观看| 亚洲аv电影天堂网| 日韩精品高清视频| 成人欧美一区二区三区在线| 91香蕉嫩草神马影院在线观看| 亚洲在线视频观看| 在线精品视频视频中文字幕| 国产免费亚洲高清| 色无极亚洲影院| 久久精品视频va| 日韩h在线观看| 亚洲最大在线视频| 亚洲最新中文字幕| 欧美极品第一页| 亚洲精品成人av| 欧美视频二区36p| 久久久在线视频| 亚洲欧美日本伦理| 91久久国产精品| 国产日韩一区在线| 国产91色在线|免| 国产丝袜一区视频在线观看| 国产精品www网站| 国产精品色婷婷视频| 欧美电影免费观看高清完整| 日韩精品久久久久久久玫瑰园| 亚洲欧美日韩中文在线制服| 亚洲第一区在线| 日韩在线一区二区三区免费视频| 91超碰caoporn97人人| 欧美精品亚州精品| 国产一区二区三区在线视频| 亚洲黄色免费三级| 欧美另类极品videosbestfree| 中文字幕在线观看日韩| 亚洲日本中文字幕免费在线不卡| 日韩大陆欧美高清视频区| 中文字幕视频在线免费欧美日韩综合在线看| 欧日韩不卡在线视频| 成人国产精品日本在线| 亚洲天堂av高清| 久久亚洲春色中文字幕| 亚洲人成伊人成综合网久久久| 亚洲人成伊人成综合网久久久| 91精品国产综合久久香蕉922| 亚洲欧美另类在线观看| 久久久久久综合网天天| 日本成人免费在线| 欧美亚洲国产日本| 久热精品视频在线| 欧美性xxxx| 国产91色在线播放| 欧美视频一二三| 成人免费网站在线看| 欧美在线视频免费播放| 国产成人久久久精品一区| 午夜精品久久久久久久99热| 欧美夫妻性生活视频| 欧美日韩免费网站| 91精品免费看| 精品一区二区三区三区| 日韩国产高清污视频在线观看| 欧美日韩成人黄色| 国产精品日韩在线一区| 欧美激情免费观看| 久久久久久久91| 中日韩午夜理伦电影免费| 国产亚洲激情视频在线| 国产日韩欧美中文在线播放| 久久久久久免费精品| 97在线看免费观看视频在线观看| 日韩精品在线视频观看| 欧美性黄网官网| 欧美激情在线狂野欧美精品| 最近2019年日本中文免费字幕| 欧美一级大片在线免费观看| 两个人的视频www国产精品| 性欧美长视频免费观看不卡| 久久久久久久电影一区| 日韩欧亚中文在线| 555www成人网| 国产91对白在线播放| 狠狠躁夜夜躁久久躁别揉| 97久久伊人激情网| 久久久久久久久中文字幕| 日韩精品在线电影| 国产视频亚洲精品| 欧美专区福利在线| 久久久日本电影| 国产精品视频地址| 色yeye香蕉凹凸一区二区av| 日韩电影大片中文字幕| 成人黄色在线播放| 欧美精品激情在线观看| 欧美亚洲另类制服自拍| 欧美激情国产日韩精品一区18| 一区二区在线免费视频| 中文日韩在线观看| 亚洲免费伊人电影在线观看av| 国产精品日韩在线播放| 久久男人的天堂| 亚洲色图av在线| 啪一啪鲁一鲁2019在线视频| 欧洲日韩成人av| 91精品视频免费| 国产一区二区黑人欧美xxxx| 亚洲少妇中文在线| 国产精品成人一区二区| 国产精品久久久久久久7电影| 成人网页在线免费观看| 久久精品一偷一偷国产| 亚洲电影在线看| 2023亚洲男人天堂| 一区二区三区国产视频| 91久久久久久久|