在你回答这个问题之前,我还没有开发出足够流行的东西来实现高服务器负载.把我当成(叹气)一个刚刚登陆地球的外星人,尽管他知道PHP和一些优化技术.


我正在开发一款PHP人版的工具,如果效果不错的话,它可以获得相当多的用户.然而,虽然我完全有能力开发这个程序,但在制作能够处理巨大流量的东西时,我几乎一无所知.所以这里有几个问题(也可以把这个问题变成一个资源线程).

数据库

目前,我计划在PHP5中使用MySQLi功能.但是,我应该如何设置与用户和内容相关的数据库?我真的有need多个数据库吗?目前,所有内容都混杂在一个数据库中——尽管我一直在考虑将用户数据分散到一个数据库中,将实际内容分散到另一个数据库中,并最终将核心网站内容(模板母版等)分散到另一个数据库中.我的推理是,将查询发送到不同的数据库将减轻它们的负载,因为一个数据库=3个负载源.如果它们都在同一台服务器上,这还会有效吗?

缓存

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

我的问题是:

假设我对不同的文章有 comments .哪个是更好的解决方案:每次加载页面时,存储简单的注释模板并呈现注释(来自DB调用),或者将注释页面的缓存副本存储为html页面——每次添加/编辑/删除注释时,页面都会被重新缓存.

终于到了

有没有人有任何关于在PHP上运行高负载站点的提示/提示.我非常肯定这是一种可以使用的语言-Facebook和Yahoo!给它很大的优先权-但是有什么我应该注意的经验吗?

推荐答案

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

例如,多年来,MySQL查询缓存一直是我们所有性能问题的解决方案.如果你的网站运行缓慢,MySQL专家建议打开查询缓存.事实证明,如果你有一个高写负载,缓存实际上是瘫痪.如果你没有测试就打开了它,你永远不会知道.

别忘了你永远不会完成zoom .一个处理10req/s的站点需要更改以支持1000req/s.如果你运气好,需要支持10000req/s,那么你的架构可能也会完全不同.

Databases

  • 不要使用MySQLi——PDO是"现代"OO数据库访问层.最重要的功能是在查询中使用占位符.它足够聪明,可以为您使用服务器端准备和其他优化.
  • 此时,您可能不想 destruct 数据库.如果你发现一个数据库没有被剪切,根据你的应用,有几种技术可以扩展.如果读操作多于写操作,则复制到其他服务器通常效果良好.切分是一种在多台机器上分割数据的技术.

Caching

  • 您可能不想在数据库中缓存.数据库通常是您的瓶颈,因此向其添加更多IO通常是一件坏事.有几个PHP缓存可以实现类似的功能,比如APC和Zend.
  • 在打开和关闭缓存的情况下测量系统.我打赌你的缓存比直接提供页面要重.
  • 如果从数据库中构建 comments 和文章数据需要很长时间,请将memcache集成到系统中.您可以缓存查询结果并将其存储在memcached实例中.重要的是要记住,从memcache中检索数据必须比从数据库中组装数据更快,才能看到任何好处.
  • 如果您的文章不是动态的,或者在生成之后有简单的动态变化,请考虑将HTML或PHP写入磁盘.你可以有一个索引.在磁盘上查找文章的php页面,如果有,则将其流式传输到客户端.如果不是,则生成文章,将其写入磁盘并发送到客户端.从磁盘删除文件会导致重新写入页面.如果在文章中添加了注释,请删除缓存的副本——它将被重新生成.

Php相关问答推荐

在Laravel中输出SON时如何将透视表列移动到集合?

带有打印和回声的PHP意外命令

Laravel 11发送邮箱时奇怪的未定义数组键名称

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

让所有具有相同名称的产品在WooCommerce中更改价格

创建一个新的可变产品及其属性以用于WooCommerce中的变体

WooCommerce数量减号和加号图标未显示

通过DO LAMP进行身份验证并从邮箱发送邮箱的最简单方式是什么

获取并判断WooCommerce用户订阅结束日期

使用php ZipArhive类将Zip压缩文件分成多个部分

即使在WooCommerce购物车中添加了两次产品,也要将所有项目设置为空白行

如何在codeigniter中将order_by RAND与下面的代码一起使用

如何在 apache Laragon - laravel 10 中允许方法 DELETE?

使用简码在 WooCommerce 我的帐户中显示一些用户数据

通过添加计数器修改文本区域表单中的重复值

用于更新 WooCommerce 管理产品列表中库存数量的自定义输入字段

使用 Composer 找不到 Google APIClient 类

注册命名空间后如何获取xml node 值?

来自 GoDaddy 的邮箱在 Gmail 中显示为via

为什么 AJAX 请求没有通过 is_ajax_request() codeigniter 的条件?