搜索
首页后端开发php教程面试题 - 网站架构:PHP针对并发访问如何优化?

考官出题:

<code>优化一个并发量较高的社区型平台,您会采取哪些方案?(只有三台服务器,并发量大->接近无穷大)</code>

我的回答:

<code>1)采取LNMP架构,并且先确保硬件是否足够支撑如此大的访问量
2)对于不需实时更新的数据如新闻资讯可生成文件缓存,以缓解并发压力
3)针对不同的运营线路解析到不同的服务器,做分流
4)使用CDN加速缓存缓解并发压力</code>

面试结果:

<code>不满意,被pass</code>

求答案。

2015-8-21
另外一个疑惑的是,多少才算高并发?如何来计算是属于高并发?

回复内容:

考官出题:

<code>优化一个并发量较高的社区型平台,您会采取哪些方案?(只有三台服务器,并发量大->接近无穷大)</code>

我的回答:

<code>1)采取LNMP架构,并且先确保硬件是否足够支撑如此大的访问量
2)对于不需实时更新的数据如新闻资讯可生成文件缓存,以缓解并发压力
3)针对不同的运营线路解析到不同的服务器,做分流
4)使用CDN加速缓存缓解并发压力</code>

面试结果:

<code>不满意,被pass</code>

求答案。

2015-8-21
另外一个疑惑的是,多少才算高并发?如何来计算是属于高并发?

谈并发的大部分是装逼的。这是我这段时间的体会。如果真要人。你不懂他都可以招去慢慢培养。
不想要人。你就是再牛也没用。
这么多人顶我呀。受宠若惊的感觉。不过并发没办法帮你解决了。我还没有处理过上万的并发了!
但通常都是要找出瓶颈。才能去解决问题。
http://berb.github.io
这是一个基本的介绍。楼主可以去读读。
写了非常多的想法。基本是硬件+软件的解决办法。
硬件方面主要是负载均衡。CDN加速。auto scale(vertical scale && horizontal scale)。但我觉得3个服务器来scale 好像用处不大。
软件方面就是做各种缓存。还有PHP运行机制的改变。比如fastcgi通常比cgi更好等。facebook的那个hiphop应该就是从这个方面去优化的吧?
当然其他的优化还有i/o阻塞。同步。异步等等。排队等处理方式。最近流行的node.js就是在这个方面做得吧。
至于更加高级的mapreduce等等。我觉得那些已经不再普通程序员的讨论范围内了。

PS::在我看来瓶颈很少是由语言造成的。那些个拿语言来说事的。我都懒的回复了。

感觉你没有和他沟通就开始作答:
首先,他说只有三台服务器,只指三台web服务器吗?那么db主备各有几台,提到了吗?
其次,他说的并发量几乎接近无穷大?这么大的流量,他来源何处,有效的流量到底有多少?你问了嘛?无效的流量需要你做优化吗?直接干掉
最后,cdn做缓存,我有点不大理解,cdn顶多也就是存储一些静态图片资源,js,css等等,像论团这种类型的,很多可能都是UGC内容,你用cdn如何缓存啊?

应对并发的体会,暂时想到下面2点:

并发中的性能问题
1,有钱就堆设备
2,充分利用缓存(配合php的黑魔法fastcgi_finish_request非常好用)

并发中数据一致性问题
1,使用队列
2,必要的自动复查
3,数据库锁的合理利用

三台服务器肯定是满足不了无限的并发,只能是尽量的优化。优化的顺序是:业务、程序、部署。

从业务上要处理好应用超出负荷时的处理,比如:目前在线人过多请稍候访问之类的提示;减少图片、附件等上传的大小限制,甚至临时取消附件功能,减少带宽和存储空间的压力;分页只支持固定的分页。

程序上包括应用的优化和数据库的优化。有可能的话尽量使用第三方的服务减少服务器自身的压力。首页等访问量大的页面静态化,减少数据库的压力,批量的实务代替时时的处理。数据库要对业务表的锁进行细化处理,读写分离。

部署上要数据库一台,另外两台负载均衡。使用cdn尽量把流量分离出去。增加防ddos攻击,跳高防护的等级,减少网络攻击对普通用户的影响。

其实三台服务器能做很多事情 :)

三台机器,三台什么样的机器,三台机器并发接近无穷大这问题本身就是相悖的。我认为在面试中太宽泛的问题其实就是耍流氓,不过也可以说明一点,面试官没有什么处理高并发的经验,只是想听听你的看法
三台这样的:
CPU:Intel(R) Xeon(R) CPU E7-4870 v2 @ 2.30GHz×4 总计60核
内存:512G
硬盘:fio卡,文件系统采用ext4文件系统

还是三台IBM的小型机、还是三台阿里云512M的vps,这里如何保证高可用,高性能,只能说尽最大优化,达到并发的极限

社区型平台的瓶颈在哪里,活跃用户有多少,数据量有多大,什么都没有怎么做?
只好回单业内通用的架构了

1.拆表:大表拆小表(垂直拆,水平拆;分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分;提高系统性能。
2.分库:把表放到不同的数据库,这也是分布式数据库的基础;提高系统性能。
3.分布式:不同的数据库放到不同的服务器;提高系统性能。
4.集群:使用数据库复制等技术组建集群,实现读写分离、备份等;提高系统性能、可用性。
5.缓存:对常用的数据进行缓存。提高系统性能。
6.备份:主从库,快照,热备,异地备份等;提高系统可用性
架构:LVS+keepalived+Java/PHP/Python+mysql/mongodb+memcached/redis+centos+nginx/apache+sphinx/solr+Gearman+Munin+TFS

你的回答的确很普通,你应该说三台机器根本就扛不住高并发,3台服务器会直接宕机的,无论怎么优化都无法做到抗住高并发,这个面试官是个SB.

话说有一次我去蓝汛面试,“面试官”问了我两道题,我都答上来了,但是他非说我错了,还说自己写了5年shell,《shell编程》那本书从头到尾都看过,从没见过这种写法,云云。 当时他带着电脑来面试的。我说在电脑上试一下就可以知道对不对。但是他说没必要。然后就说我不合适。我回去之后,在自己的电脑上试一下,完全正确。
这个故事告诉我们,有些所谓“面试官”其实水平很烂,而且有些人怕地位不保,还不想招水平比自己高的人。
所以也没必要为了一次面试没过或者答案被否定就否定自己。

:) 楼上的很多人对面试官有意见啊。其实,面试的时候被问一些模糊的问题很正常,我面试的时候也会问几个这种问题。站在面试官的角度来说,抛出一个边界不确定的问题,让被面试者自己界定和分析问题,既能有效观察到被面者的应对技巧和分析思路,又能避免把问题限定到被面者不熟悉的地方从而让被面者无法发挥。而且,在实际项目中,项目经理或者产品经理甚至同事给你建任务的时候,提的需求或者问题,很可能是模糊的。所以从面试官来讲,问些模糊甚至不着边的问题其实还是蛮需要的。

就这个问题来讲,楼主过早的给出了答案,而没有把问题条件分析清楚。面试官的意思是,在给定的三台服务器情况下优化现有社区型平台的并发能力,越高越好。1.先分析清楚社区型平台的特性,计算密集还是IO密集?2.现有社区型平台的技术架构是什么?3.三台服务器里服务和DB的部署情况是什么样的,利用率有没有达到最优?4.确定前三个问题,找到性能节点,如果是数据库,换数据库/分表/分库/热存balabala,如果是前端,那用的是前端模板还是后端模板,cdn/静态化/API合并/缓存balabala,如果是后端,根据平台框架,可能的优化方案更多了。。。5.结合问题的界定和分析,给出答案以后,可以抛开面试官给的限定谈一下对高并发看法,比如硬件堆砌,集群等等。

负载均衡
读写分离
缓存,分布式缓存

才三台服务器,还谈什么并发,单台机器的并发是有瓶颈的,社区型平台并发瓶颈不应该是写入,而是读取,可以用一台物理服务器做为缓存服务器,还需要在高并发时,缓存的网卡会不会被打满,社区型发贴也可以有延时,写入时可以使用消息队列写入,同时处理与队列处理,用户可能是无感知的,消费一个队列的时间很快,在写入数据库中,可以同时刷新缓存,也可以使用nosql数据库来做,就是控制好内存使用,cache与storage合理使用。
如果硬要说构架:
分层,分割,分布式,集群,缓存,异步等,就三台机器,说构架,我也是醉了

其实面试官是个技术垃圾的一逼,他害怕招人比他优秀,然后把它顶掉!你想啊,三台机器,就想着并发无限大,有这想法的人会是啥水平?单机瓶颈在那放着呢,说不定就是三台512的阿里云,哈哈。
或者他根本不是招人,而是让人免费提供解决方案的!然后你说了,他觉得查点资料他自己就能搞了。
再者吧,他可能就是渣,用的还是Windows图形界面的服务器呢,你上来说lnmp环境,他根本不会玩啊,不pass你,pass谁啊!以上是玩笑话!

不过呢,对于面试优化的,你说的什么生成静态啊,cdn啊,这些都是太宽泛,你要具体到事例上。

其实考官只是看你怎么在有限的资源内处理问题的能力。
现在很多程序员根本只知道程序内的事,不考虑资源的合理利用。

并发量大->接近无穷大 的时候,最简单,最有效的解决问题的方法就是: 增加服务器,强哥当年说的都是真理啊

只要不是代码、架构问题(该索引索引,该缓存缓存),3台**普通**服务器的情况下,优先考虑的确是应该是加机器或者提高机器性能:
现在普通web服务器一台3~5万,能支持PHP或Java Web页面并发500~1000(大概经验,不喜勿喷),招技术做高级架构优化就不止这点钱了。

PHP也有高并发框架,楼主可以试试,接触过swoole,一般机器单机能上万。

p.s.单机百万并发听说过,但是并发量接近无穷大这种要求还真没听说过,不知道考官怎么想的,无穷大并发首先考虑带宽的钱给不给的起吧。。。(要是楼主没听清楚问题建议再沟通,要是真要求无穷大并发,这个考官可能不是工程师而是老板)

考官的问题问的很笼统。并发量接近无穷大是什么意思?

三台服务器,无限并发,你问问他,吃三个馒头,从此不用再吃饭了,行不行?

技术主管装逼的情况的太普遍了,面试时总会刁难你

这种公司还是不用去了~相当于问你一个没有范围的问题,然后要你一个没有范围的答案。这种非确定性结果跟程序员的思维是相悖的

你是面试高级工程师还是架构师?

他招你进去一般不会想你改他的架构的,我觉得问这个问题只是想了解你是否对网站架构有所了解。

如果你没有参与过高并发的项目,只是根据网上的资料,然后回答,我觉得被pass掉很正常。

这样回答可能效果更好点:

<code>我以前在XXX公司做过XXX项目,也遇到了高并发的问题,我们采取的解决方案有....
</code>

其实高并发的问题要码农和运维人员一起解决,关键在于实战。。。

这个问题可是很宽泛的,分为好几个方面.

最基本的各种配置文件的优化是有必要的.

程序方面:数据文件缓存,内存缓存,静态缓存,opcode缓存等等

数据库方面:设计合适的表结构,表缓存优化,主从动静分离,集群,冷热数据分离等....

系统架构方面:redis,高可用啦等等.....我就不说了,太多了

这种问题,回答大致的思路就好了。另外,考官的问题描述也不够准确。

只能说你回答的思路 对不上面试官的。

其实你就应该反问他 给他问萌了为止, 机器的配置。 别说什么无限大,每秒峰值多少
然后你就告诉他 保证多少吞吐的情况下 支持并发,要考虑高负载情况下的一些极端情况。 而且你得假设 所谓并发高、但业务支撑少的原则,按此说,3台机子理论上 就是2台web机 1台db,2台机子LVS+keepalived这种东东根本用不上,就直接在nginx上面写策略。然后你再问他 瓶颈可能还出现在哪里? 支持高并发的原则就是,哪里有瓶颈就解决哪里,拒绝空谈 大谈 特谈 扯淡 !

最后 最主要 你要告诉他一个答案,按着你的配置和计算,最大可以支撑多少并发的业务 ,如果清晰完整的说完这些他还不满意,我建议你对他呵呵后再见。 我就有一次面试 跟面试官抬杠,最后大哥跟我聊上硬件了 估计也是急眼了

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
哪些常见问题会导致PHP会话失败?哪些常见问题会导致PHP会话失败?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置错误、Cookie问题和Session过期。1.配置错误:检查并设置正确的session.save_path。2.Cookie问题:确保Cookie设置正确。3.Session过期:调整session.gc_maxlifetime值以延长会话时间。

您如何在PHP中调试与会话相关的问题?您如何在PHP中调试与会话相关的问题?Apr 25, 2025 am 12:12 AM

在PHP中调试会话问题的方法包括:1.检查会话是否正确启动;2.验证会话ID的传递;3.检查会话数据的存储和读取;4.查看服务器配置。通过输出会话ID和数据、查看会话文件内容等方法,可以有效诊断和解决会话相关的问题。

如果session_start()被多次调用会发生什么?如果session_start()被多次调用会发生什么?Apr 25, 2025 am 12:06 AM

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

您如何在PHP中配置会话寿命?您如何在PHP中配置会话寿命?Apr 25, 2025 am 12:05 AM

在PHP中配置会话生命周期可以通过设置session.gc_maxlifetime和session.cookie_lifetime来实现。1)session.gc_maxlifetime控制服务器端会话数据的存活时间,2)session.cookie_lifetime控制客户端cookie的生命周期,设置为0时cookie在浏览器关闭时过期。

使用数据库存储会话的优点是什么?使用数据库存储会话的优点是什么?Apr 24, 2025 am 12:16 AM

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

您如何在PHP中实现自定义会话处理?您如何在PHP中实现自定义会话处理?Apr 24, 2025 am 12:16 AM

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

什么是会话ID?什么是会话ID?Apr 24, 2025 am 12:13 AM

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

您如何在无状态环境(例如API)中处理会议?您如何在无状态环境(例如API)中处理会议?Apr 24, 2025 am 12:12 AM

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

See all articles

热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

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

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

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

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具