在你回答这个问题之前,我从未开发过任何足够流行的东西来达到高服务器负载。把我当作(叹气)一个刚刚登陆地球的外星人,尽管我了解 PHP 和一些优化技术。
我正在开发一个工具PHP如果效果好的话,可以吸引相当多的用户。然而,虽然我完全有能力开发该程序,但在制作可以处理巨大流量的东西时,我几乎一无所知。所以这里有几个关于它的问题(也可以随意将这个问题变成资源线程)。
数据库
目前我计划在 PHP5 中使用 MySQLi 功能。但是,我应该如何设置与用户和内容相关的数据库?我真的吗need多个数据库?目前,所有内容都混杂在一个数据库中 - 尽管我一直在考虑将用户数据传播到一个数据库,将实际内容传播到另一个数据库,最后将核心网站内容(模板母版等)传播到另一个数据库。我的理由是,将查询发送到不同的数据库将减轻它们的负载,因为一个数据库 = 3 个负载源。如果它们都在同一服务器上,这仍然有效吗?
Caching
我有一个模板系统,用于构建页面和交换变量。主模板存储在数据库中,每次调用模板时,都会调用其缓存副本(html 文档)。目前,我在这些模板中有两种类型的变量 - 静态变量和动态变量。静态变量通常是页面名称、站点名称等不经常更改的内容;动态变量是在每次页面加载时发生变化的东西。
我对此的问题是:
假设我对不同的文章有评论。哪个是更好的解决方案:每次加载页面时存储简单的评论模板并呈现评论(来自数据库调用)或将评论页面的缓存副本存储为 html 页面 - 每次添加/编辑/删除评论时该页面被重新缓存。
Finally
有谁有关于在 PHP 上运行高负载网站的任何提示/指示吗?我非常确定这是一种可行的语言 - Facebook 和 Yahoo!给予它极大的优先权 - 但有什么我应该注意的经历吗?
没有两个网站是相同的。你真的需要一个像这样的工具jmeter http://jakarta.apache.org/jmeter/并进行基准测试,看看您的问题点在哪里。您可以花费大量时间猜测和改进,但只有在衡量和比较您的更改之前,您才会看到真正的结果。
例如,多年来,MySQL 查询缓存是我们所有性能问题的解决方案。如果您的网站速度很慢,MySQL 专家建议打开查询缓存。事实证明,如果写入负载很高,缓存实际上会严重损坏。如果你在没有测试的情况下打开它,你永远不会知道。
并且不要忘记,你永远不会完成扩展。处理 10req/s 的站点需要进行更改才能支持 1000req/s。如果您足够幸运,需要支持 10,000req/s,您的架构也可能看起来完全不同。
数据库
- 不要使用 MySQLi --PDO http://ca.php.net/pdo是“现代”OO 数据库访问层。要使用的最重要的功能是查询中的占位符。它足够智能,可以为您使用服务器端准备和其他优化。
- 此时您可能不想破坏数据库。如果您确实发现某个数据库无法缩减,可以采用多种技术进行扩展,具体取决于您的应用程序。如果读取次数多于写入次数,则复制到其他服务器通常效果很好。分片是一种将数据分割到多台机器上的技术。
Caching
- 您可能不想在数据库中缓存。数据库通常是您的瓶颈,因此向其中添加更多 IO 通常是一件坏事。有几个 PHP 缓存可以完成类似的事情,例如APC http://ca.php.net/apc和禅德。
- 通过打开和关闭缓存来衡量您的系统。我敢打赌你的缓存比直接提供页面要重。
- 如果从数据库构建评论和文章数据需要很长时间,请集成memcache http://www.danga.com/memcached/进入您的系统。您可以缓存查询结果并将其存储在 memcached 实例中。重要的是要记住,从内存缓存检索数据必须比从数据库组装数据更快,才能看到任何好处。
- 如果您的文章不是动态的,或者生成后有简单的动态更改,请考虑将 html 或 php 写入磁盘。您可以有一个在磁盘上查找文章的 index.php 页面,如果存在,则将其流式传输到客户端。如果不是,它会生成文章,将其写入磁盘并将其发送到客户端。从磁盘删除文件会导致页面被重写。如果将评论添加到文章中,请删除缓存的副本 - 它将重新生成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)