当前位置: 首页 > 面试题库 >

在高负载站点中使用PHP的策略

钱繁
2023-03-14
问题内容

在回答这个问题之前,我还没有开发出足以达到高服务器负载的流行方法。将我当作(叹息)刚刚降落在地球上的外星人,尽管它知道PHP和一些优化技术。

我正在用 PHP
开发一个工具,如果可以的话,它可以吸引很多用户。但是,尽管我完全有能力开发该程序,但在编写可以处理大量流量的东西时却一无所知。因此,这里有一些问题(也可以将这个问题转换为资源线程)。

资料库

目前,我计划在PHP5中使用MySQLi功能。但是,如何设置与用户和内容相关的数据库?我实际上 需要 多个数据库吗?目前,所有内容都混杂在一个数据库中-
尽管我一直在考虑将用户数据分发到一个数据库,将实际内容分发到另一个数据库,最后将核心站点内容(模板母版等)分发到另一个数据库。我这样做的原因是,将查询发送到不同的数据库将减轻它们的负载,因为一个数据库=
3个负载源。如果它们都在同一服务器上,这仍然会有效吗?

快取

我有一个模板系统,用于构建页面和换出变量。主模板存储在数据库中,并且每次调用模板时,都会调用其缓存副本(HTML文档)。目前,这些模板中有两种类型的变量-
静态变量和动态变量。静态var通常是诸如页面名称,站点名称之类的东西,这些东西不经常更改;动态变量是在每次页面加载时都会更改的内容。

我对此的问题:

说我对不同的文章有意见。这是一个更好的解决方案:每次页面加载时都存储简单的评论模板并呈现评论(通过DB调用),或者将评论页面的缓存副本存储为html页面-
每次添加/编辑/删除评论时页面被重新缓存。

最后

有没有人有任何技巧/指针在PHP上运行高负载站点。我很确定这是一种可行的语言-Facebook和Yahoo! 赋予它很高的优先级-但是我应该注意哪些经验?


问题答案:

没有两个站点是一样的。您确实需要使用jmeter和基准测试之类的工具来查看问题点在哪里。您可以花费大量时间进行猜测和改进,但是只有在衡量和比较更改后才能看到真正的结果。

例如,多年来,MySQL查询缓存一直是我们所有性能问题的解决方案。如果您的网站运行缓慢,MySQL专家建议打开查询缓存。事实证明,如果您的写入负载很高,则缓存实际上会崩溃。如果您在没有测试的情况下将其打开,您将永远不会知道。

并且不要忘记,您从未完成过扩展。处理10req / s的站点将需要更改以支持1000req / s。而且,如果您足够幸运,需要支持10,000req /
s,那么您的架构也可能看起来完全不同。

  • 不要使用MySQLi- PDO是“现代” OO数据库访问层。要使用的最重要功能是查询中的占位符。它足够聪明,可以为您使用服务器端准备和其他优化。
  • 您可能现在不想破坏数据库。如果您确实发现一个数据库无法满足需求,则有多种技术可以扩展,具体取决于您的应用程序。如果读取次数多于写入次数,则复制到其他服务器通常效果很好。分片是一种将数据拆分到多台计算机上的技术。

快取

  • 您可能不想缓存在数据库中。数据库通常是您的瓶颈,因此向数据库添加更多IO通常是一件坏事。有几个PHP缓存可以完成类似APC和Zend的功能。
  • 启用和禁用缓存来衡量您的系统。我敢打赌,您的缓存比直接提供页面要重。
  • 如果需要很长时间才能从数据库中构建评论和文章数据,请将memcache集成到系统中。您可以缓存查询结果并将其存储在memcached实例中。重要的是要记住,从内存缓存中检索数据必须比从数据库中汇编数据要快得多,以了解任何好处。
  • 如果您的文章不是动态的,或者在生成文章后进行了简单的动态更改,请考虑将html或php写出到磁盘上。您可能有一个index.php页面,该页面在磁盘上查找该文章,如果有的话,它会将其流式传输到客户端。如果不是,它将生成文章,将其写入磁盘,然后将其发送给客户端。从磁盘上删除文件将导致页面被重写。如果在文章中添加了评论,请删除缓存的副本-它将重新生成。


 类似资料:
  • 通过 xorm.NewEngineGroup 创建 EngineGroup 时,第三个参数为 policies,我们可以通过该参数来指定 Slave 访问的负载策略。如创建EngineGroup 时未指定,则默认使用轮询的负载策略。 xorm 中内置五种负载策略,分别为随机访问负载策略,权重随机访问负载策略,轮询访问负载策略,权重轮询访问负载策略和最小连接数访问负载策略。开发者也可以通过实现 Gr

  • 我们目前正在AmazonEC2上运行nginx背后的PHP-FPM。站点将停止响应,并在每次高负载时向客户端输出502坏网关。 这是php fpm错误的日志。日志 [25-Feb-2014 10:29:50]警告:[pool www]服务器达到pm.max_children设置(14),考虑提高它 [25-Feb-2014 12:23:11]警告:[池www]child 2029在启动8736.0

  • 本文向大家介绍使用Nginx实现负载均衡的策略,包括了使用Nginx实现负载均衡的策略的使用技巧和注意事项,需要的朋友参考一下 一、nginx简介 nginx是一个高性能的HTTP服务器和反向代理服务器。它起初是俄罗斯人Igor Sysoev开发的,至今支撑者俄罗斯的很多大型的网站。 二、nginx支持的三种负载均衡策略 轮询:将请求依次轮询发给每个服务器。 最少链接:将请求发送给持有最少活动链接

  • 以下是hs_err_filepart中的错误(已附加完整文件): 内存不足,Java运行时环境无法继续。本机内存分配(mmap)无法映射1633681408字节以提交保留内存。 可能的原因: 系统在32位模式下没有物理RAM或交换空间,进程大小限制已达到 可能的解决方案: 减少系统上的内存负载 增加物理内存或交换空间 检查交换后备存储区是否已满 在64位OS上使用64位Java 减少Java堆大小

  • 问题内容: 我一直在使用一种提供下载服务的方法,但是由于它不安全,所以我决定对此进行更改。(该方法是到存储中原始文件的链接,但是风险是每个知道链接的人都可以下载该文件!)因此,我现在通过我的视图提供文件,这样,只有拥有权限的用户才能下载文件,但是我注意到服务器上的负载很高,同时有许多文件同时下载请求。这是我为用户处理下载的代码的一部分(考虑文件是图像) 在保持安全性并降低服务器端负载的情况下,有没

  • 我有一个节点应用程序,它为用户提供了一个提供在线考试的门户。现在我要在这个服务器上执行负载测试。为此,我使用apache JMeter。在后端,我创建了两个节点服务器实例(8GB ram,每个4个核),并使用Nginx的负载平衡器管理它们。因此,当我对500个用户执行负载测试时,我会得到网关超时(504)错误。另外,对于某些请求,我没有在JMeter中得到响应。同时,当我检查我的两个节点服务器时,