目录
回复内容:
首页 后端开发 php教程 用 PHP 编写支持高并发的网站,需要做什么处理?

用 PHP 编写支持高并发的网站,需要做什么处理?

Jun 17, 2016 am 08:30 AM

但是很难做静态化啊,像做一个微博那样子的东西,并发又高,跟新又快,这种需求的话,应该怎么处理呢?

回复内容:

一般来说,解决WEB高并发的有效手段都是采用可线性扩展的多层分布式架构,
我生产项目的架构是这样的,就在这里抛砖引玉一下。
  1. Webserver (Nginx) :这一层是可以轻松分布式部署的,结合智能DNS解析可以简易地防止单点故障、实现区域访问加速,结合LVS很容易实现负载均衡。这一层主要是负责处理静态请求和转发PHP请求至第二层的PHP处理节点,至于静态资源地址(misc.xxxx.com)可以单独拿出来部署,或者直接使用商用的云存储服务(国内七牛不错,国外有Amazon S3)
  2. PHP处理节点:一个节点其实就是一个监听特定端口的系统进程,webserver的请求通过负载均衡器(我用的AWS的loadbalancer)进行分发,很好实现分布式和负载均衡。我现在用的还是php自带的php-fpm,其实facebook出的hhvm性能非常强悍,但是还不能100%通过我项目的单元测试,等hhvm成熟过后可以平滑替换
  3. 高速缓存:用的memcached,这一层的作用主要是减轻数据库IO和加快热数据访问,缓存策略与程序耦合度较高,不赘述,但简单地说有两种方式,一种是在程序的全局层面加一个缓存处理,这种方法代码耦合度低,但是有效命中率不高,有些项目不一定适应,另一种是在具体的数据存取处加缓存处理,这种办法程序耦合度较高,但是缓存命中率非常高,几乎没有无效缓存存在,我用的是这种。
  4. 数据库 :我现在的项目数据规模不大,暂时只用了单台数据库,但是程序逻辑上已做好了数据库线性扩展的准备。其实数据库层的扩展是老生常谈了,常用手段是分库分表,这一块需要在前期的代码就打下基础,另外更平滑地手段是使用中间件,比如360的Atlas,阿里巴巴的cobar,淘宝的TDDL,中间件可以在不大范围变更代码的情况下扩展,但是具体的使用场景还是有限的,具体项目还需单独考察。
  5. 其他:根据不同的项目,架构还可以选择性地使用队列,我现在用的beantalkd,Redis也是一个很好的选择。队列常用的使用环境是邮件发送和站内消息推送上面,但是在某些场景下也可以作为核心数据库的缓冲,对应对大并发或者突发性流量也是不错的选择
一般使用LVS+PHP集群(1000台),就算日均80亿次请求,每秒有10万并发,那分到每台机器的请求只有100个。只要你的PHP程序不是太差,100QPS总没问题吧?

而真正的瓶颈在于数据库和存储系统,数据的一致性,可扩展性,可用性很难保证。所以需要根据具体的业务场景再做横向和纵向的分库分表。

再辅以memcache集群缓存,key-value高性能存储,异步队列任务系统,整个架构就可以建立起来。

还有一类是真正的高并发,比如WebIM,一台机器要承受数十万的TCP客户端连接,进行大规模的实时通信。这种的可以用PHP的异步高并发扩展swoole 。链接:Swoole: PHP的异步、并行、分布式扩展框架 亿级Web系统搭建——单机到分布式集群
【问底】徐汉彬:亿级Web系统搭建——单机到分布式集群-CSDN.NET 这个问题能写本书了、
PHP网站的瓶颈基本在数据库上。
一般中小项目,硬件比人力便宜,老板都是会算账的。别说主从同步了,那只能解决实时性不高的场景。比如12306,用户A在第一台DB里下了单,还没传到第100号DB,这时候第100号DB已经接受用户B下单了。

恩,那就减少数据库连接吧,100个用户读一样的内容,那么读一次就行了。于是有了cache。
有了cache也有问题啊,比如怎么保证cache和数据库的内容一致,缓存失效一下子涌到DB怎么办?

恩,上面那个问题等遇见再谈吧。 前面讲了减少读,现在要讲减少写,减少写的频率。 比如微博里给一群好友发条信息,实际上好多没上线的,把上线的那些用户的消息放在Redis里,数据不急着更新。

有钱,能不能再加台DB服务器,反正服务器便宜?每台各存一部分数据,要偶数id的帖子到A服务器去拿,奇数到B服务器拿。 什么?帖子按照时间排序怎么办?按照点击数排序怎么办? 新搞个DB服务器去存点击数和帖子id,有了id啥都好办。 再有乱七八糟的需求找搜索团队支持,实时性不高都好办。另外看看访问量大的搞几个缓存。

N条评论,但是点了是空列表?这些功能99%可用就行,ICP说不定也有问题,用户点一次没反应,再点一次就行。

图片。文件小啊,linux inode有限制。 把所有图片保存在几个大文件里,建个服务读取。

音乐,视频服务。

违规文字,音乐版权,小视频,慢慢头痛吧。 yishan 一层层剥开来讲,有以下部位需要注意。
1.资源。能静态实现的就静态实现,静态资源也要尽量使用分布式存储,例如云存储。
2.效率。PHP代码里,尽量注意内存的使用,单个脚本的运行效率要Ok.
3.缓存。使用memcache来实现非持久存储,使用no-sql来实现持久存储。
4.server。使用nginx+fpm或者nginx+apache,来实现动静态分离访问。
5.mysql。作为最终的存储库以及一些不可避免的实时调用库,做主从处理,Master+多Slave,多个只读副本来实现实时的调用库。
6.负载。建议架设一层负载均衡,来实现web server的轮询。例如云平台中的LBS。 真不知道这个世界上有多少“亿级PV”的网站。
真上有上亿PV的网站现在一定不会再问这样的问题。 能静态化的静态化
不能静态化的用分布式算法


最好不要将运算交给数据库,尤其是复杂的算法

做静态化 这样就减少了数据库的压力
php是一个语言工具,由php来把apache/nginx/memcache/redis/mysql/httpds等工具组合到一起,根据具体的业务需求,选取不同的系统架构模型;高并发其实考验的是系统的架构
1. 数据的读写层
高并发更多考验的是数据的读写,最终考验的是根据具体的业务需求进行系统的架构;哪些数据要满足实时读写,哪些数据可以异步读写等要考虑好;数据的读写模型分析清楚后就要设计数据的存储方案,mysql擅长的是关系数据和数据统计,但是并发访问是瓶颈;memcache擅长的是数据缓存,但kv的数据结构有限;redis作为内存数据库但内存空间毕竟没有硬盘空间大;
各有优缺点,那么就要根据自己的业务来综合或者选取用这些工具
2. 静态/动态访问
有条件的就使用cdn,没条件的至少弄一个静态访问层,至于使用apache还是nginx或者其它的,自己在虚拟机上都安装一遍,做一个压力测试对比一下
非静态访问转发到动态访问层
3. 逻辑处理即php
到php了,php承接动态访问的输入,进行逻辑运算,最后到数据层去进行读写;
别做太傻的事就可以了,比如无谓的foreach循环,复制等操作;再比如,对于实时访问,对10个数据进行排序,就不要再用mysql 的select order by 了,直接用php的函数来排序就好了。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1663
14
CakePHP 教程
1420
52
Laravel 教程
1313
25
PHP教程
1266
29
C# 教程
1239
24
说明PHP中的不同错误类型(注意,警告,致命错误,解析错误)。 说明PHP中的不同错误类型(注意,警告,致命错误,解析错误)。 Apr 08, 2025 am 12:03 AM

PHP中有四种主要错误类型:1.Notice:最轻微,不会中断程序,如访问未定义变量;2.Warning:比Notice严重,不会终止程序,如包含不存在文件;3.FatalError:最严重,会终止程序,如调用不存在函数;4.ParseError:语法错误,会阻止程序执行,如忘记添加结束标签。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? 说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

什么是HTTP请求方法(获取,发布,放置,删除等),何时应该使用? 什么是HTTP请求方法(获取,发布,放置,删除等),何时应该使用? Apr 09, 2025 am 12:09 AM

HTTP请求方法包括GET、POST、PUT和DELETE,分别用于获取、提交、更新和删除资源。1.GET方法用于获取资源,适用于读取操作。2.POST方法用于提交数据,常用于创建新资源。3.PUT方法用于更新资源,适用于完整更新。4.DELETE方法用于删除资源,适用于删除操作。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

解释self ::,parent ::和static :: in php oop中的区别。 解释self ::,parent ::和static :: in php oop中的区别。 Apr 09, 2025 am 12:04 AM

在PHPOOP中,self::引用当前类,parent::引用父类,static::用于晚静态绑定。1.self::用于静态方法和常量调用,但不支持晚静态绑定。2.parent::用于子类调用父类方法,无法访问私有方法。3.static::支持晚静态绑定,适用于继承和多态,但可能影响代码可读性。

PHP如何安全地上载文件? PHP如何安全地上载文件? Apr 10, 2025 am 09:37 AM

PHP通过$\_FILES变量处理文件上传,确保安全性的方法包括:1.检查上传错误,2.验证文件类型和大小,3.防止文件覆盖,4.移动文件到永久存储位置。

See all articles