详解PHP服务器如何在有限的资源里最大提升并发能力
概述
假设报考app是用5W rmb 向供应商采购,报名当天涌入海量考生,并发数飙升至30W+,导致系统宕机,拒绝服务,致使考生无法报名,那么5W rmb 能否支持30W+并发呢?
不过对于我们来说,不妨把问题上升一个角度:「如何在有限的资源里最大提升服务器并发能力」。假设你是一名技术负责人,你在面对一个并发量较大的项目时会如何设计和架构呢?
首先我们可以针对这个项目捋一下大体的思路,从上述描述中不难看出,该项目的瓶颈在于「并发写」而非「读」,因此从资源分配上我们可以向「写」倾斜,在此我将数据全部写入在Redis中。除此之外,我们也需要尽量的将MySQL的读操作迁移到Redis上来,MySQL所做的工作更倾向于一些常规非并发的读写操作。
服务器
当用户请求过来,由负载均衡器负载到各个服务器上
这是一张来自symfony的压测数据,使用的是1 CPU, 4 GB and PHP 7的配置。
上图的数据来自于swoole官网,在加上我们在实际业务逻辑的执行之后,可以发现,当我们在使用常驻内存的启动方式时,3台更低配服务器就能解决上述需要16台才能解决的问题。
数据库
其实许多人在接触后端有一定的阶段之后都会了解,现在的许多互联网项目的瓶颈更多的集中在数据库I/O这块,各个语言之间并没有特别大的差距。包括广被大家所诟病的PHP-FPM的启动方式,也可以使用swoole等方式来替代。因此,在这个项目中,会将更多的把精力集中于数据库这一块,可以尝试使用Redis来解决,当然,在具体代码中,也需要提前准备好一定数量的数据连接池。 另外,也考虑MongoDB虽然在同等配置下的写入速度要比MySQL快得多,但是相比于Redis,还是存在明显不足。
注册登录
注册和登录其实应该分成两块来讲,二者分别对应的是「写」和「读」。在高并发读写情况下,直接使用MySQL,如你期待的那样,会爆。因此,我们在构建整个项目的过程中,可以将用户数据缓存到Redis中。 「写」的问题:在用户数量不明确且并发量较大的情况下,我更倾向于用户数据不直接入库。我们可以设计一个开关或阈值,来设置用户的入库方式,当并发大的情况下可以通过MQ来异步让用户入库,而平时则可以正常入库。
提交表单
因为该项目并非我们所常见的秒杀,且需要即时通知的,因此给我们项目的设计大大减少了难度。在提交表单的功能也跟注册类似,我们完全可以让数据异步入库,然后后台审核。
总结
其他的像CDN、MySQL是否需要主从之类的就不再赘述了,视实际情况而定。从理论上,如果使用PHP-FPM的方式,大概需要19000元/月来解决项目的这个问题,而当使用swoole时,大概需要4500元/月,在这里并没有鼓吹swoole,想说明的是当我们在面对大并发项目时,尤其是业务逻辑相对复杂,我们使用常驻内存更能解决问题,而这与语言无关。 最后,需要说明的是,上述仅是理论阶段,至于实际数据如何都需要进一步检验。文章素材来源于网络,如果有写的不正确的地方,望指出。
以上就是详解PHP服务器如何在有限的资源里最大提升并发能力的详细内容,更多关于PHP服务器如何在有限的资源里最大提升并发能力的资料请关注我们其它相关文章!
相关推荐
-
PHP 并发场景的几种解决方案
在秒杀,抢购等并发场景下,可能会出现超卖的现象,在PHP语言中并没有原生提供并发的解决方案,因此就需要借助其他方式来实现并发控制. 列出常见的解决方案有: 使用队列,额外起一个进程处理队列,并发请求都放到队列中,由额外进程串行处理,并发问题就不存在了,但是要额外进程支持以及处理延迟严重,本文不先不讨论这种方法. 利用数据库事务特征,做原子更新,此方法需要依赖数据库的事务特性. 借助文件排他锁,在处理下单请求的时候,用flock锁定一个文件,成功拿到锁的才能处理订单. 一.利用 Redis 事务特
-
PHP使用curl_multi实现并发请求的方法示例
本文实例讲述了PHP使用curl_multi实现并发请求的方法.分享给大家供大家参考,具体如下: class CurlMultiUtil { /** * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档 */ private static function getCurlObject($url,$postData=array(),$header=array()){ $options = array(); $url = trim($url); $options[CUR
-
PHP下用Swoole实现Actor并发模型的方法
什么是Actor? Actor对于PHPer来说,可能会比较陌生,写过Java的同学会比较熟悉,Java一直都有线程的概念(虽然PHP有Pthread,但不普及),它是一种非共享内存的并发模型,每个Actor内的数据独立存在,Actor之间通过消息传递的形式进行交互调度,且Actor是一种高度抽象化的编程模型,非常适合于游戏.硬件行业. Swoole协程与信箱 得益于Swoole4.x,我们可以基于Swoole的协程与Channel快速实现一个信箱模式调度.模拟代码如下: use Swoole\
-
PHP利用Mysql锁解决高并发的方法
前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用Mysql的锁来解决高并发的问题 先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=l
-
php多进程模拟并发事务产生的问题小结
前言 本文通过实例代码给大家介绍了关于php多进程模拟并发事务产生的一些问题,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 表 drop table if exists `test`; create table if not exists `test` ( id int not null auto_increment , count int default 0 , primary key `id` (`id`) ) engine=innodb character set utf
-
PHP高并发和大流量解决方案整理
一.高并发的概念 在互联网时代,并发,高并发通常是指并发访问.也就是在某个时间点,有多少个访问同时到来. 二.高并发架构相关概念 1.QPS (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求) 2.PV(Page View):综合浏览量,即页面浏览量或者点击量,一个访客在24小时内访问的页面数量 --注:同一个人浏览你的网站的同一页面,只记做一次pv 3.吞吐量(fetches/sec) :单位时间内处理的请求数量 (通常由QPS和并发数决定) 4.响
-
php curl批处理实现可控并发异步操作示例
本文实例讲述了php curl批处理实现可控并发异步操作.分享给大家供大家参考,具体如下: 通常情况下 PHP 中的 cURL 是阻塞运行的,就是说创建一个 cURL 请求以后必须等它执行成功或者超时才会执行下一个请求:API接口访问一般会首选CURL 在实际项目或者自己编写小工具(比如新闻聚合,商品价格监控,比价)的过程中, 通常需要从第3方网站或者API接口获取数据, 在需要处理1个URL队列时, 为了提高性能, 可以采用cURL提供的curl_multi_*族函数实现简单的并发. <?ph
-
php多进程并发编程防止出现僵尸进程的方法分析
本文实例讲述了php多进程并发编程防止出现僵尸进程的方法.分享给大家供大家参考,具体如下: 对于用PHP进行多进程并发编程,不可避免要遇到僵尸进程的问题. 僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程(zombie)进程.任何进程在退出前(使用exit退出) 都会变成僵尸进程(用于保存进程的状态等信息),然后由init进程接管.如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多,最后系统就没有可以用的进程表项,于是也无法再运行其它的
-
PHP curl批处理及多请求并发实现方法分析
本文实例讲述了PHP curl批处理及多请求并发实现方法.分享给大家供大家参考,具体如下: 在面试过程中遇到一个问题,加入一个一个网站访问一次需要两秒,我们如何实现在2秒左右请求三次? 面试官想问的就是如何使用curl并发处理请求 关于curl_multi_init() 一般来说,想到要用curl_multi_init()时,目的是要同时请求多个url,而不是一个一个依次请求,否则就要curl_init()了. 不过,在使用curl_multi的时候,你可能遇到cpu消耗过高.网页假死等现象,可
-
详解PHP服务器如何在有限的资源里最大提升并发能力
概述 假设报考app是用5W rmb 向供应商采购,报名当天涌入海量考生,并发数飙升至30W+,导致系统宕机,拒绝服务,致使考生无法报名,那么5W rmb 能否支持30W+并发呢? 不过对于我们来说,不妨把问题上升一个角度:「如何在有限的资源里最大提升服务器并发能力」.假设你是一名技术负责人,你在面对一个并发量较大的项目时会如何设计和架构呢? 首先我们可以针对这个项目捋一下大体的思路,从上述描述中不难看出,该项目的瓶颈在于「并发写」而非「读」,因此从资源分配上我们可以向「写」倾斜,在此我将数据全
-
详解Nginx服务器和iOS的HTTPS安全通信
详解Nginx服务器和iOS的HTTPS安全通信 简介 在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不能从根本上防止重放攻击.想要较好的解决重放攻击问题,应考虑使用HTTPS通信,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,比HTTP协议安全. 实现 对于用浏览器访问的网站,需要向CA申请证书才能保证HTTPS的网
-
详解node服务器中打开html文件的两种方法
本文介绍了详解node服务器中打开html文件的两种方法,分享给大家,具体如下: 方法1:利用 Express 托管静态文件,详情查看这里 方法2:使用fs模块提供的readFile方法打开文件,让其以text/html的形式输出. 代码: var express = require('express'); var fs=require("fs"); var app = express(); //方法1:通过express.static访问静态文件,这里访问的是ajax.html //
-
详解Linux服务器最多能开放多少个端口
目录 端口相关的概念: 端口与服务的关系 1:nmap工具检测开放端口 2:netstat 工具检测开放端口 3:lsof 工具检测开放端口 4:ss 工具检测开放端口 5: 使用telnet检测端口是否开放 6:netcat工具检测端口是否开放 关闭端口和开放端口 端口相关的概念: 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.SC端口等等.逻辑端口是指
-
详解如何查看 docker 容器使用的资源
在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸运的是 docker 自己就提供了这样的命令:docker stats. 默认输出 docker stats 命令用来显示容器使用的系统资源.不带任何选项执行 docker stats 命令: $ docker stats 默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c.下面是输出的主要内容: [CONTAINER]:以短格式显示容器的 ID. [CPU %
-
详解Nginx服务器的配置中开启文件Gzip压缩的方法
gzip(GNU- ZIP)是一种压缩技术.经过gzip压缩后页面大小可以变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多.gzip的压缩页面需要浏览 器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析.浏览器那里不需要我们担心,因为目前的巨大多数浏览器都支持解析gzip 过的页面. Nginx的压缩输出有一组gzip压缩指令来实现.相关指令位于http{-.}两个大括号之间. 下面大致讲一下配置开启gzip压缩的方法: 1.Vim打开Nginx配置文件 v
-
图文详解Linux服务器搭建JDK环境
首先,当然是去下载Linux的JDK咯. 先看你Linux的系统多少位: getconf LONG_BIT 然后去下载对应的JDK位数 版本.-自己去谷歌搜索哦 我这里下载的是:jdk-7u79-linux-x64.tar.gz 首先我创建了2个文件夹: mkdir -p /java/jdk jdk-7u79-linux-x64.tar.gz我放在java目录下 java -version #查看服务器是否安装过jdk 我没有安装过,会提示 -bash: java: command not fo
-
详解Nginx服务器中配置超时时间的方法
一.啥时候用到 用来设置请求资源和服务器返回的时间,保证一个请求占用固定时间,超出后报504超时!这样可以保证一个请求占用过长时间. 二.主要参数 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; 读取 fastcgi_send_timeout 600; 发请求 这两个选项. fastcgi_read_timeout是指
-
详解Nginx服务器中配置Sysguard模块预防高负载的方案
nginx做为HTTP服务器,有以下几项基本特性: 处理静态文件,索引文件以及自动索引:打开文件描述符缓冲. 无缓存的反向代理加速,简单的负载均衡和容错. FastCGI,简单的负载均衡和容错. 模块化的结构.包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter.如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待. Nginx专为性能优化而开发,性能是其最重要的考量,实
-
详解Nginx服务器中的nginx.conf配置文件
Nginx 配置文件主要分成四部分:main(全局设置).http(HTTP 的通用设置).server(虚拟主机设置).location(匹配 URL 路径).还有一些其他的配置段,如 event,upstream 等. 通用设置 user nginx 指定运行 nginx workre 进程的用户和组 worker_rlimit_nofile # 指定所有 worker 进程能够打开的最大文件数 worker_cpu_affinity 设置 worke
随机推荐
- SQL Server 2008 R2 为用户权限分配的操作步骤
- 正则表达式判定保留2位小数的实现代码
- XorEncode的vbs实现代码
- JQery 渐变图片导航效果代码 漂亮
- 当json键为数字时的取值方法解析
- Angular.js基础学习之初始化
- java环境变量path和classpath的配置
- 浅谈Java自定义注解和运行时靠反射获取注解
- Js四则运算函数代码
- Apache下禁止php文件被直接访问的解决方案
- javascript求日期差的方法
- Lesson02_01 表格标签
- 一个监控LINUX目录和文件变化的Shell脚本分享
- 一个获取第n个元素节点的js函数
- Last_Errno: 1062,Last_Error: Error Duplicate entry
- jQuery实现宽屏图片轮播实例教程
- 几个比较实用的JavaScript 测试及效验工具
- 新浪滑门技术
- php session_start()出错原因分析及解决方法
- 十三、WIN2000下的xcopy可以复制文件的安全设置