首页 > 后端开发 > 正文

api框架高并发php php 高并发解决思路解决方案

2023-09-20 20:45:31 | 我爱编程网

今天我爱编程网小编整理了api框架高并发php php 高并发解决思路解决方案相关信息,希望在这方面能够更好的大家。

api框架高并发php php 高并发解决思路解决方案

php 高并发解决思路解决方案

php 高并发解决思路解决方案,如何应对网站大流量高并发情况。本文为大家总结了常用的处理方式,但不是细节,后续一系列细节教程给出。希望大家喜欢。

一 高并发的概念

在互联网时代,并发,高并发通常是指并发访问。也就是在某个时间点,有多少个访问同时到来。

二 高并发架构相关概念

1、QPS (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指 HTTP 请求)

2、PV(Page View):综合浏览量,即页面浏览量或者点击量,一个访客在 24 小时内访问的页面数量

--注:同一个人浏览你的网站的同一页面,只记做一次 pv

3、吞吐量(fetches/sec) :单位时间内处理的请求数量 (通常由 QPS 和并发数决定)

4、响应时间:从请求发出到收到响应花费的时间

5、独立访客(UV):一定时间范围内,相同访客多次访问网站,只计算为 1 个独立访客

6、带宽:计算带宽需关注两个指标,峰值流量和页面的平均大小

7、日网站带宽: PV/统计时间(换算到秒) * 平均页面大小(kb)* 8

三 需要注意点:

1、QPS 不等于并发连接数(QPS 是每秒 HTTP 请求数量,并发连接数是系统同时处理的请求数量)

2、峰值每秒请求数(QPS)= (总 PV 数*80%)/ (六小时秒数*20%)【代表 80%的访问量都集中在 20%的时间内】

3、压力测试: 测试能承受的最大并发数 以及测试最大承受的 QPS 值

4、常用的性能测试工具【ab,wrk,httpload,Web Bench,Siege,Apache JMeter】

四 优化

1、当 QPS 小于 50 时

优化方案:为一般小型网站,不用考虑优化

2、当 QPS 达到 100 时,遇到数据查询瓶颈

优化方案: 数据库缓存层,数据库的负载均衡

3、当 QPS 达到 800 时, 遇到带宽瓶颈

优化方案:CDN 加速,负载均衡

4、当 QPS 达到 1000 时

优化方案: 做 html 静态缓存

5、当 QPS 达到 2000 时

优化方案: 做业务分离,分布式存储

五、高并发解决方案案例:

1、流量优化

防盗链处理(去除恶意请求)

2、前端优化

(1) 减少 HTTP 请求[将 css,js 等合并]

(2) 添加异步请求(先不将所有数据都展示给用户,用户触发某个事件,才会异步请求数据) 我爱编程网

(3) 启用浏览器缓存和文件压缩

(4) CDN 加速

(5) 建立独立的图片服务器(减少 I/O)

3、服务端优化

(1) 页面静态化

(2) 并发处理

(3) 队列处理

4、数据库优化

(1) 数据库缓存

(2) 分库分表,分区

(3) 读写分离

(4) 负载均衡

5、web 服务器优化

(1) nginx 反向代理实现负载均衡

(2) lvs 实现负载均衡

api框架高并发php php 高并发解决思路解决方案

php怎样应对高并发


高并发下的数据安全
我们知道在多线程写入同一个文件的时候,会出现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的)。
如果是MySQL数据库,可以使用它自带的锁机制很好的解决问题,但是在大规模并发的场景中,是不推荐使用MySQL的。秒杀和抢购的场景中,最关键的问题,就是“超发”,如果在这方面控制不慎,会导致实际产生的订单比预售商品还多的问题。
超发的原因:(推荐学习:PHP编程从入门到精通)
假设某个抢购场景中,我们一共只有100个商品,在最后一刻,我们已经消耗了99个商品,仅剩最后一个。这个时候,系统发来多个并发请求,这批请求读取到的商品余量都是1个,然后都通过了余量的判断,最终导致超发。
值得注意的是:记得将库存字段number字段设为unsigned,当库存为0时,因为unsigned字段不能为负数,将会返回false
优化方案
优化1:使用MySQL的事务,锁住操作的行 BEGIN ; SELECT ... FOR UPDATE ; COMMIT ; ROLLBACK
<?php
//优化方案1:使用MySQL的事务,锁住操作的行
include('./mysql.php');
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
//记录日志
function insertLog($event,$type=0){
global $conn;
$sql="insert into ih_log(event,type)
values('$event','$type')";
mysqli_query($conn,$sql);
}

mysqli_query($conn,"BEGIN"); //开始事务
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' FOR UPDATE";//此时这条记录被锁住,其它事务必须等待此次事务提交后才能执行
$rs=mysqli_query($conn,$sql);
$row=$rs->fetch_assoc();

if($row['number']>0){
//生成订单
$order_sn=build_order_no();
$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
$order_rs=mysqli_query($conn,$sql);
//库存减少
$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
$store_rs=mysqli_query($conn,$sql);
if($store_rs){
echo '库存减少成功';
insertLog('库存减少成功');
mysqli_query($conn,"COMMIT");//事务提交即解锁
}else{
echo '库存减少失败';
insertLog('库存减少失败');
}
}else{
echo '库存不够';
insertLog('库存不够');
mysqli_query($conn,"ROLLBACK");
}优化2:文件锁的思路
对于日访问量不高或者说并发数不是很大的应用,用一般的文件操作方法完全没有问题。但如果并发高,在我们对文件进行读写操作时,很有可能多个进程对进一文件进行操作,如果这时不对文件的访问进行相应的独占,就容易造成数据丢失。
<?php
//优化方案2:使用非阻塞的文件排他锁
include ('./mysql.php');
//生成唯一订单号
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}

//记录日志
function insertLog($event,$type=0){
global $conn;
$sql="insert into ih_log(event,type)
values('$event','$type')";
mysqli_query($conn,$sql);
}
$fp = fopen("lock.txt", "w+");
if(!flock($fp,LOCK_EX | LOCK_NB)){
echo "系统繁忙,请稍后再试";
return;
}

//下单
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
$rs = mysqli_query($conn,$sql);
$row = $rs->fetch_assoc();
if($row['number']>0){//库存是否大于0
//模拟下单操作
$order_sn=build_order_no();
$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)
values('$order_sn','$user_id','$goods_id','$sku_id','$price')";
$order_rs = mysqli_query($conn,$sql);
//库存减少
$sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";
$store_rs = mysqli_query($conn,$sql);
if($store_rs){
echo '库存减少成功';
insertLog('库存减少成功');
flock($fp,LOCK_UN);//释放锁
}else{
echo '库存减少失败';
insertLog('库存减少失败');
}
}else{
echo '库存不够';
insertLog('库存不够');
}

fclose($fp);

api框架高并发php php 高并发解决思路解决方案

高并发的API接口选用什么PHP框架合适

Yaf的其实本质上讲,是个基础框架,仅提供了一个简单粗暴的基础URI路由功能,完事了。
最关键是并发和多线程以及定时器等等,Yaf本身不能实现。
这点小性能没有必要在乎,c框架有些bug让你无从下手,phalcon就被坑过
如果想用的6都会去看框架源码,用c写的框架看源码多么痛苦
我觉得随着php逐渐的发展,性能逐渐的优化,这种类型框架迟早会被淘汰的

以上就是我爱编程网小编给大家带来的api框架高并发php php 高并发解决思路解决方案全部内容,希望对大家有所帮助!
与“api框架高并发php php 高并发解决思路解决方案”相关推荐
php高并发接口框架 php 高并发解决思路解决方案
php高并发接口框架 php 高并发解决思路解决方案

高并发的API接口选用什么PHP框架合适Yaf的其实本质上讲,是个基础框架,仅提供了一个简单粗暴的基础URI路由功能,完事了。最关键是并发和多线程以及定时器等等,Yaf本身不能实现。这点小性能没有必要在乎,c框架有些bug让你无从下手,phalcon就被坑过如果想用的6都会去看框架源码,用c写的框架看源码多么痛苦我觉得随着php逐渐的发展,性能逐渐的优化,这种类型框架迟早会被

2023-09-23 11:00:38
php框架并发测试 php 高并发解决思路解决方案
php框架并发测试 php 高并发解决思路解决方案

php每秒5000个并发请求接口怎么写要实现每秒5000个并发请求接口,可以结合以下几种方案:1.多进程或多线程:使用PHP的pcntl、pthreads等扩展库,创建多个进程或线程,每个进程或线程负责处理一部分请求。2.异步IO:使用Swoole、ReactPHP等异步IO的框架,通过异步非阻塞IO的方式,能够让一个进程或线程处理多个请求,从而提高请求的处理能力。3.负载

2023-09-14 17:40:58
并发框架php 高并发架构技术解决方案?
并发框架php 高并发架构技术解决方案?

高并发架构技术解决方案?高并发架构的难点是什么?高并发架构最大问题主要是由于网站PV访问量大,单台服务器承载大量访问所带来的压力,所以会采用多台服务器进行分流,采用服务器集群技术,对于每个请求访问会被发送到不同的服务器。这样架构的难点就在管理、维护、监控、负载等等都面临很大的技术问题,同时还需要应对某些业务的突发流量,像秒杀、促销等场景化使用什么技术解决高并发?互联网分布式架构设

2023-08-31 00:15:19
php框架并发 php并发解决方案有哪些
php框架并发 php并发解决方案有哪些

php如何处理大数据高并发大数据解决方案使用缓存:(推荐学习:PHP视频教程)使用方式:1,使用程序直接保存到内存中。主要使用Map,尤其ConcurrentHashMap。使用缓存框架。常用的框架:Ehcache,Memcache,Redis等。最关键的问题是:什么时候创建缓存,以及其失效机制。对于空数据的缓冲:最好用一个特定的类型值来保存,以区别空数据和未缓存的两

2023-08-26 07:52:18
php高并发socket框架 swoole是怎样解决高并发的
php高并发socket框架 swoole是怎样解决高并发的

swoole如何解决高并发swoole提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。Swoole还内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。(推荐学习:swoole视频教程)Swoole底层内置了异步非阻塞、多线程

2023-09-17 05:45:37
php处理高并发框架 swoole是怎样解决高并发的
php处理高并发框架 swoole是怎样解决高并发的

用PHP编写支持高并发的网站,需要做什么处理?PHP语言开发高并发的网站,需要加缓存,复杂逻辑走消息队列异步处理,mysql查询必须走索引,还搞不定就加机器分流,mysql配置升高并且一主多从,使用codis集群,增加消息队列的消费者,如果还搞不定就随机拒绝请求,当然这是最后的退路。缓存缓存是避免业务查询过多的请求mysql,导致业务不可用,根据场景来判断是否需要使用codis

2023-09-18 07:49:12
php解决并发的框架 高并发的API接口选用什么PHP框架合适
php解决并发的框架 高并发的API接口选用什么PHP框架合适

php怎么处理高并发以下内容转载自徐汉彬大牛的博客亿级Web系统搭建——单机到分布式集群当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题。为了解决这些性能压力带来问题,我们需要在Web系统架构层面搭建多个层次的缓存机制。在不同的压力阶段,我们会遇到不同的问题,通过搭建不同的服务和架

2023-09-19 17:13:37
php框架解决方案 php需要学习哪些框架
php框架解决方案 php需要学习哪些框架

php需要学习哪些框架PHP需要学习哪些框架呢?让我们一起了解一下!PHP需要学习的框架有很多,下面为您例举几种常用的框架:国内框架:ThinkPHP、Canphp、KYPHP、InitPHP、SpeedPHP、CdvPHP等。国外框架:ZendFramework、Codelgniter、CakePHP、Symfony、Yii、Seagull、Laravel等。拓展:什么

2023-09-17 17:22:46