微信在线答题小程序_新手能自己做微信小程序么_公众号小程序怎么做_微信小程序免费开发工具_公众号关联小程序
当前位置:建站首页 > 新闻资讯 > 常见问题 >

PHP 高并发情景的几类处理计划方案

发表日期:2021-04-06 09:56文章编辑:jianzhan浏览次数: 标签:    

王国CMS技术性互帮互助群: 一帮高手陪你装逼陪你飞!也有好看的妹子陪你玩哦!帝国CMS技术互助群

在限时秒杀,限时抢购等高并发情景下,将会会出現超卖的状况,在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 

二、运用文档排他锁(堵塞方式)

堵塞方式下,假如过程在获得文档排他锁时,其他过程已经占有锁得话,此过程会脱机等候其他过程释放出来锁后,并自身获得到锁后,再向下实行。

实例编码:

 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 

三、运用文档排他锁(非堵塞方式)

非堵塞方式下,假如过程在获得文档排他锁时,其他过程已经占有锁得话,此过程会立刻分辨获得锁不成功,而且再次向下实行。

实例编码:

 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 

最终得出三种解决方法的检测結果较为

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 事务管理方法好于文档排他锁方法,而文档排他锁方法中,非堵塞方式好于堵塞方式。

之上便是文中的所有內容,期待对大伙儿的学习培训有一定的协助,也期待大伙儿多多的适用剖要网。

如对文中有疑惑,请递交到沟通交流小区,众多热情网民会给你解释!! 点一下进到小区

打赏主播一下,大家会为大伙儿出示大量优良資源!


推券客CMS系统安装配置使用详细图文教程

推券客CMS系统软件安裝配备应用详尽文图实例教程 点一下:754次 升级时间:2017-10-24

phpwind默认后台地址修改详细教程

phpwind默认设置后台管理详细地址改动详尽实例教程 点一下:500次 升级时间:2017-10-24

Catfish(鲶鱼)CMS安装使用详细图文教程

Catfish(鲶鱼)CMS安裝应用详尽文图实例教程 点一下:46两次 升级时间:2017-10-24

PHPWind8.5论坛风格安装使用详细教程

PHPWind8.5社区论坛设计风格安裝应用详尽实例教程 点一下:42两次 升级时间:2017-10-24

ECShop安装时提示创建管理员帐号失败的解决办法

ECShop安裝时提醒建立管理方法员账号不成功的处理方法 点一下:395次 升级时间:2017-10-24

ECShop安装时提示创建管理员帐号失败的解决办法

ECShop安裝时提醒建立管理方法员账号不成功的处理方法 点一下:395次 升级时间:2017-10-24

:297次 升级时间:2017-10-24

ECSHOP去掉前台模板以及后台官网版权链接的详细教程

ECSHOP除掉前台接待模版及其后台管理官方网站著作权连接的详尽实例教程 点一下:264次 升级时间:2017-10-24

Catfish(鲶鱼)CMS安装使用详细图文教程

Catfish(鲶鱼)CMS安裝应用详尽文图实例教程 点一下:46两次 升级时间:2017-10-24

推券客CMS系统安装配置使用详细图文教程

推券客CMS系统软件安裝配备应用详尽文图实例教程 点一下:754次 升级时间:2017-10-24
相关新闻

企业网站建设收费标准的高矮不一怎样去限定

闭于基本建设网站,很多公司都基本建设自身的网站,一些公司年夜足一挥便能划注资金去建...

日期:2021-04-05 浏览次数:70

小区团购价

拓客成本费已经越来越越来越越高,但服务一个老顾客的成本费,仅有开发设计一个新顾客户...

日期:2021-04-04 浏览次数:65

出口外贸建网站网络推广服务承诺诚信,卓光高新

联络人:刘主管Q Q:电 话:传 真:邮 箱:地 址:重庆市市沙坪坝区石碾盘ARC中间城市广场...

日期:2021-04-04 浏览次数:175

amazon协同英国高校发布买东西网站

据英国《美国华尔街日报》二月2日报导,amazon与英国三所大中型高校达到协议书,联名经营网...

日期:2021-04-03 浏览次数:98

服装商城小程序开发-怎样用微宣传单制作高转换

在这个看重创意和美感的互联网时代里,广告主和企业商如果连基本的宣传促销都做不好,那...

日期:2021-03-31 浏览次数:60

「PHPCMS方法」频道栏目和目录页完成有缩列图就

企业网站建设实例教程 「PHPCMS方法」频道栏目和目录页完成有缩列图就显示信息,沒有就显示...

日期:2021-03-29 浏览次数:157