252

在你回答这个问题之前,我从来没有开发出足够流行的东西来获得高服务器负载。把我当作(叹息)一个刚刚降落在地球上的外星人,尽管我知道 PHP 和一些优化技术。


我正在用PHP开发一个工具,如果效果好的话,它可以吸引很多用户。然而,虽然我完全有能力开发程序,但在制作可以处理巨大流量的东西时,我几乎一无所知。所以这里有几个问题(也可以随意把这个问题变成一个资源线程)。

数据库

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

缓存

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

我对此的问题:

假设我对不同的文章有评论。哪个是更好的解决方案:每次加载页面时存储简单的评论模板并呈现评论(来自数据库调用)或将评论页面的缓存副本存储为 html 页面 - 每次添加/编辑/删除评论页面被重新缓存。

最后

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

4

23 回答 23

93

没有两个网站是一样的。你真的需要一个像jmeter和 benchmark 这样的工具来看看你的问题点在哪里。您可以花费大量时间猜测和改进,但在您衡量和比较您的更改之前,您不会看到真正的结果。

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

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

数据库

  • 不要使用 MySQLi—— PDO是“现代”OO 数据库访问层。要使用的最重要的功能是查询中的占位符。它也很聪明,可以为您使用服务器端准备和其他优化。
  • 此时您可能不想破坏您的数据库。如果您确实发现一个数据库没有被削减,有几种技术可以扩大规模,具体取决于您的应用程序。如果您的读取次数多于写入次数,则复制到其他服务器通常效果很好。分片是一种将数据拆分到多台机器上的技术。

缓存

  • 您可能不想缓存在数据库中。数据库通常是您的瓶颈,因此向其添加更多 IO 通常是一件坏事。有几个 PHP 缓存可以完成类似的事情,比如APC和 Zend。
  • 在开启和关闭缓存的情况下衡量您的系统。我敢打赌,您的缓存比直接提供页面重。
  • 如果从数据库构建评论和文章数据需要很长时间,请将memcache集成到您的系统中。您可以缓存查询结果并将它们存储在 memcached 实例中。重要的是要记住,从 memcache 中检索数据必须比从数据库中组装数据更快才能看到任何好处。
  • 如果您的文章不是动态的,或者在生成后您有简单的动态更改,请考虑将 html 或 php 写入磁盘。您可以有一个 index.php 页面,该页面在磁盘上查找文章,如果存在,它会将其流式传输到客户端。如果不是,它会生成文章,将其写入磁盘并将其发送给客户端。从磁盘中删除文件会导致页面被重写。如果在文章中添加评论,请删除缓存的副本——它将重新生成。
于 2008-08-23T23:03:03.703 回答
65

我是一个拥有超过 1500 万用户的网站的首席开发人员。我们几乎没有遇到过扩展问题,因为我们很早就计划好了并且经过深思熟虑地扩展了。以下是我可以根据我的经验提出的一些策略。

SCHEMA 首先,非规范化你的模式。这意味着与其拥有多个关系表,不如选择拥有一个大表。一般来说,连接是对宝贵数据库资源的浪费,因为进行多次准备和整理会烧毁磁盘 I/O。尽可能避免它们。

这里的权衡是您将存储/提取冗余数据,但这是可以接受的,因为数据和笼内带宽非常便宜(更大的磁盘),而多个准备 I/O 的成本要高几个数量级(更多的服务器) .

索引 确保您的查询至少使用一个索引。但请注意,如果您频繁编写或更新,索引将花费您。有一些实验技巧可以避免这种情况。

您可以尝试添加未编入索引的其他列,这些列与已编入索引的列并行运行。然后,您可以有一个离线过程,将非索引列批量写入索引列。这样,您可以更好地控制 mySQL 何时需要重新计算索引。

避免像瘟疫一样的计算查询。如果您必须计算查询,请尝试在写入时执行一次。

缓存 我强烈推荐 Memcached。它已被 PHP 堆栈 (Facebook) 上的最大玩家证明并且非常灵活。有两种方法可以做到这一点,一种是在您的 DB 层中缓存,另一种是在您的业务逻辑层中缓存。

DB 层选项需要缓存从 DB 检索到的查询结果。您可以使用 md5() 散列您的 SQL 查询,并在进入数据库之前将其用作查找键。这样做的好处是它很容易实现。缺点(取决于实现)是您失去了灵活性,因为您在缓存过期方面将所有缓存都视为相同。

在我工作的商店中,我们使用业务层缓存,这意味着我们系统中的每个具体类都控制自己的缓存模式和缓存超时。这对我们来说效果很好,但请注意,从数据库中检索到的项目可能与从缓存中检索的项目不同,因此您必须同时更新缓存和数据库。

数据分片 复制只能让你到目前为止。比您预期的更快,您的写入将成为瓶颈。作为补偿,请确保尽早支持数据分片。如果你不这样做,你以后可能会想自己开枪。

实现起来非常简单。基本上,您希望将密钥权限与数据存储分开。使用全局数据库来存储主键和集群 ID 之间的映射。您查询此映射以获取集群,然后查询集群以获取数据。您可以从这个查找操作中缓存地狱,这将使其成为一个可以忽略不计的操作。

这样做的缺点是可能很难将来自多个分片的数据拼凑在一起。但是,您也可以设计自己的方式来解决这个问题。

离线处理 如果他们不需要,不要让用户等待你的后端。建立一个作业队列并移动您可以脱机的任何处理,将其与用户的请求分开。

于 2009-01-20T01:12:41.017 回答
43

我曾在几个由 PHP 和 MySQL 支持的网站上工作,这些网站每月获得数百万/点击次数。以下是一些基础知识:

  1. 缓存,缓存,缓存。缓存是减少网络服务器和数据库负载的最简单、最有效的方法之一。缓存页面内容、查询、昂贵的计算以及任何受 I/O 限制的内容。Memcache 非常简单有效。
  2. 用完后使用多台服务器。您可以拥有多个 Web 服务器和多个数据库服务器(具有复制功能)。
  3. 减少对您的网络服务器的总体请求数。这需要使用过期标头缓存 JS、CSS 和图像。您还可以将静态内容移动到 CDN,这将加快您的用户体验。
  4. 衡量和基准。在您的生产机器上运行 Nagios 并在您的 dev/qa 服务器上进行负载测试。你需要知道你的服务器什么时候会着火,这样你才能防止它。

我建议阅读Building Scalable Websites,它是由 Flickr 的一位工程师编写的,是一个很好的参考。

查看我关于可扩展性的博客文章,它有很多关于使用多种语言和平台进行扩展的演示链接: http ://www.ryandoherty.net/2008/07/13/unicorns-and-scalability/

于 2008-08-23T22:54:17.843 回答
40

回复:PDO / MySQLi / MySQLND

@加里

您不能只说“不要使用 MySQLi”,因为它们有不同的目标。PDO 几乎就像一个抽象层(尽管它实际上不是),旨在使使用多个数据库产品变得容易,而 MySQLi 则特定于 MySQL 连接。在将 PDO 与 MySQLi 进行比较的情况下,说 PDO 是现代访问层是错误的,因为您的陈述暗示进展是 mysql -> mysqli -> PDO,但事实并非如此。

MySQLi 和 PDO 之间的选择很简单——如果您需要支持多个数据库产品,那么您可以使用 PDO。如果您只是使用 MySQL,那么您可以在 PDO 和 MySQLi 之间进行选择。

那么为什么你会选择 MySQLi 而不是 PDO 呢?见下文...

@罗斯

您对 MySQLnd 是正确的,它是最新的 MySQL 核心语言级别库,但它不能替代 MySQLi。MySQLi(与 PDO 一样)仍然是您通过 PHP 代码与 MySQL 交互的方式。这两个都使用 libmysql 作为 PHP 代码背后的 C 客户端。问题是 libmysql 在核心 PHP 引擎之外,而这正是 mysqlnd 发挥作用的地方,即它是一个本机驱动程序,它利用核心 PHP 内部结构来最大限度地提高效率,特别是在内存使用方面。

MySQLnd 是由 MySQL 自己开发的,最近登陆了 PHP 5.3 分支,该分支正在进行 RC 测试,准备在今年晚些时候发布。然后,您将能够将 MySQLnd 与 MySQLi 一起使用……但不能与 PDO 一起使用。这将使 MySQLi在许多领域(不是全部)的性能得到提升,如果您不需要 PDO 的抽象功能,它将使其成为 MySQL 交互的最佳选择。

也就是说,MySQLnd现在可用于 PDO 的 PHP 5.3,因此您可以从 ND 到 PDO 中获得性能增强的优势,但是,PDO 仍然是一个通用数据库层,因此不太可能从中受益ND 中的增强功能与 MySQLi 一样

尽管它们来自 2006 年,但可以在此处找到一些有用的基准测试。您还需要了解类似此选项的内容。

在决定 MySQLi 和 PDO 时,需要考虑很多因素。事实上,在您获得高得离谱的请求数量之前,这并不重要,在这种情况下,使用专门为 MySQL 设计的扩展而不是抽象事物并恰好提供 MySQL 驱动程序的扩展更有意义.

这不是一个简单的问题,因为每个都有优点和缺点。您需要阅读我提供的链接并做出自己的决定,然后对其进行测试并找出答案。我在过去的项目中使用过 PDO,它是一个很好的扩展,但我对纯性能的选择是 MySQLi,它编译了新的 MySQLND 选项(当 PHP 5.3 发布时)。

于 2008-08-24T14:17:01.977 回答
23

一般的

  • 在开始看到实际负载之前不要尝试优化。你可能猜对了,但如果你没有猜对,那你就是在浪费时间。
  • 使用jmeterxdebug或其他工具对站点进行基准测试。
  • 如果负载开始成为问题,则可能涉及对象或数据缓存,因此通常阅读缓存选项(memcached,MySQL 缓存选项)

代码

  • 分析您的代码,以便您知道瓶颈在哪里,以及它是在代码中还是在数据库中

数据库

  • 如果对其他数据库的可移植性不重要,则使用MYSQLi ,否则使用PDO
  • 如果基准测试显示数据库是问题所在,请在开始缓存之前检查查询。使用EXPLAIN查看查询速度变慢的地方。
  • 在优化查询并以某种方式缓存数据库之后,您可能希望使用多个数据库。根据数据、查询和读/写行为的类型,复制到多个服务器或分片(将数据拆分到多个数据库/服务器上)可能是合适的。

缓存

  • 在缓存代码、对象和数据方面已经完成了大量的写作。查找有关APCZend OptimizermemcachedQuickCacheJPCache的文章。在你真正需要之前做一些这样的事情,你就不会担心在未优化的情况下开始。
  • APC 和 Zend Optimizer 是操作码缓存,它们通过避免重新解析和重新编译代码来加速 PHP 代码。一般安装简单,值得早做。
  • Memcached 是一种通用缓存,可用于缓存查询、PHP 函数或对象或整个页面。必须专门编写代码才能使用它,如果没有中心点来处理缓存对象的创建、更新和删除,这可能是一个涉及的过程。
  • QuickCache 和 JPCache 是文件缓存,其他方面类似于 Memcached。基本概念很简单,但也需要代码,并且通过创建、更新和删除的中心点更容易。

各种各样的

  • 考虑用于高负载的替代 Web 服务器。如果您可以牺牲 Apache 的功能和灵活性(或者如果您只是不需要这些东西,通常情况下,您不需要),那么像lighthttpnginx这样的服务器可以在比Apache少得多的内存中处理大量流量。
  • 请记住,这些天硬件非常便宜,因此请务必花费精力优化大量代码而不是“让我们购买一个怪物服务器”。
  • 考虑在这个问题中添加“MySQL”和“scaling”标签
于 2008-09-29T10:24:20.780 回答
9

APC是绝对必须的。它不仅是一个出色的缓存系统,而且自动缓存的 PHP 文件的好处是天赐之物。至于多数据库的想法,我认为在同一台服务器上拥有不同的数据库不会有什么好处。它可能会在查询期间使您的速度有所提高,但我怀疑在确保它们同步的同时为所有三个部署和维护代码所付出的努力是值得的。

我还强烈建议运行Xdebug来查找程序中的瓶颈。它使优化对我来说变得轻而易举。

于 2008-08-23T22:45:58.067 回答
9

首先,正如我认为 Knuth 所说,“过早的优化是万恶之源”。如果您现在不必处理这些问题,那就不要,先专注于交付可以正常工作的东西。话虽如此,如果优化不能等待。

尝试分析您的数据库查询,找出什么是缓慢的以及经常发生什么,并从中提出优化策略。

我会研究Memcached,因为它是许多负载较高的站点用于有效缓存所有类型内容的方法,而且它的 PHP 对象接口非常好。

在服务器之间拆分数据库并使用某种负载平衡技术(例如,在 1 到 # 冗余数据库之间生成一个随机数以及必要的数据 - 并使用该数字来确定要连接到哪个数据库服务器)也可以是增加效率。

在过去,对于一些负载相当高的站点,这些都非常有效。希望这有助于您入门:-)

于 2008-08-23T22:50:17.120 回答
6

使用 Xdebug(推荐 tj9991)之类的东西来分析你的应用程序肯定是必须的。盲目地优化事物并没有多大意义。Xdebug 将帮助您找到代码中真正的瓶颈,以便您可以明智地花费优化时间并修复实际上导致速度下降的代码块。

如果您使用的是 Apache,另一个可以帮助测试的实用程序是Siege。它将帮助您预测您的服务器和应用程序将如何通过实际运行来应对高负载。

任何类型的 PHP 操作码缓存(如 APC 或许多其他缓存之一)也会有很大帮助。

于 2008-08-23T22:54:21.697 回答
6

我运营的网站每月浏览量为 7-8 百万。不是很多,但足以让我们的服务器感受到负载。我们选择的解决方案很简单:数据库级别的 Memcache。如果数据库负载是您的主要问题,此解决方案效果很好。

我们开始使用 Memcache 来缓存整个对象和最常用的数据库结果。它确实有效,但它也引入了错误(如果我们更加小心,我们可能会避免其中一些错误)。

所以我们改变了我们的方法。我们构建了一个数据库包装器(使用与旧数据库完全相同的方法,因此很容易切换),然后我们将其子类化以提供 memcached 数据库访问方法。

现在您所要做的就是决定一个查询是否可以使用缓存的(并且可能是过时的)结果。用户运行的大多数查询现在都直接从 Memcache 中获取。例外是更新和插入,对于主网站来说,这只是因为日志记录而发生的。这个相当简单的措施将我们的服务器负载减少了大约 80%。

于 2008-08-26T09:38:41.600 回答
6

对于它的价值,即使没有像 memcached 这样的扩展/帮助程序包,缓存在 PHP 中也很简单。

您需要做的就是使用ob_start().

创建全局缓存函数。Call ob_start,将函数作为回调传递。在函数中,查找页面的缓存版本。如果存在,则服务并结束。

如果它不存在,脚本将继续处理。当它到达匹配的 ob_end() 时,它将调用您指定的函数。那时,您只需获取输出缓冲区的内容,将它们放入文件中,保存文件,然后结束。

添加一些过期/垃圾收集。

而且很多人没有意识到你可以嵌套ob_start()/ob_end()调用。因此,如果您已经在使用输出缓冲区来解析广告或进行语法突出显示等,您可以嵌套另一个ob_start/ob_end调用。

于 2008-08-27T20:32:06.683 回答
5

感谢您对 PHP 的缓存扩展的建议——您能解释一下使用一个而不是另一个的原因吗?我通过 IRC 听说过有关 memcached 的好消息,但从未听说过 APC - 你对它们有什么看法?我认为使用多个缓存系统会适得其反。

实际上,许多人确实将 APC 和 memcached 一起使用......

于 2008-08-24T14:26:31.720 回答
4

看来我错了。MySQLi 仍在开发中。但根据文章,PDO_MySQL 现在由 MySQL 团队贡献。来自文章:

MySQL 改进扩展 - mysqli - 是旗舰。它支持 MySQL 服务器的所有功能,包括字符集、准备好的语句和存储过程。该驱动程序提供混合 API:您可以根据自己的喜好使用过程式或面向对象的编程风格。mysqli 带有 PHP 5 及更高版本。请注意,PHP 4 的生命周期结束于 2008 年 8 月 8 日。

PHP 数据对象 (PDO) 是一个数据库访问抽象层。PDO 允许您对各种数据库使用相同的 API 调用。PDO 不提供任何程度的 SQL 抽象。PDO_MYSQL 是 PDO 的 MySQL 驱动程序。PDO_MYSQL 随 PHP 5 一起提供。从 PHP 5.3 开始,MySQL 开发人员积极为它做出贡献。统一 API 的 PDO 优势是以 MySQL 特定功能(例如多语句)为代价的,但不能通过统一 API 完全支持。

请停止使用有史以来第一个用于 PHP 的 MySQL 驱动程序:ext/mysql。自 2004 年 PHP 5 引入 MySQL 改进扩展 - mysqli - 以来,没有理由仍然使用最古老的驱动程序。ext/mysql 不支持字符集、预处理语句和存储过程。它仅限于 MySQL 4.0 的功能集。请注意,对 MySQL 4.0 的扩展支持在 2008 年 12 月 31 日结束。不要将自己局限于此类旧软件的功能集!升级到 mysqli,另见 Converting_to_MySQLi。从我们的角度来看,mysql 处于仅维护模式。

对我来说,这篇文章似乎偏向 MySQLi。我想我偏向于 PDO。我真的很喜欢 PDO 而不是 MySQLi。这对我来说是直截了当的。API 更接近于我编写的其他语言。OO 数据库接口似乎工作得更好。

我没有遇到任何不能通过 PDO 获得的特定 MySQL 功能。如果我曾经这样做过,我会感到惊讶。

于 2008-08-24T14:14:48.567 回答
3

PDO 也很慢,它的 API 也很复杂。如果便携性不是问题,那么头脑清醒的人都不应该使用它。让我们面对现实吧,在 99% 的所有 web 应用程序中都不是这样。您只需坚持使用 MySQL 或 PostrgreSQL,或者您正在使用的任何工具。

至于 PHP 问题以及要考虑的问题。我认为过早的优化是万恶之源。;) 首先完成您的应用程序,在编程时尽量保持干净,编写一些文档并编写单元测试。有了以上所有内容,您在时机成熟时重构代码将毫无问题。但首先你要完成并推出它,看看人们对它的反应。

于 2008-08-25T16:32:58.010 回答
2

当然 pdo 很好,但是关于它与 mysql 和 mysqli 的性能存在一些争议,尽管它现在似乎已修复

如果您设想可移植性,您应该使用 pdo,但如果不是,mysqli 应该是方式。它有一个 OO 接口、准备好的语句和 pdo 提供的大部分功能(除了可移植性)。

另外,如果确实需要性能,请为 PHP 5.3 中的(本机 mysql)MyqLnd驱动程序做好准备,该驱动程序将与 php 更紧密地集成,具有更好的性能和改进的内存使用(以及用于性能调整的统计数据)。

如果你有集群服务器(和类似 YouTube 的负载),Memcache 很好,但我也会先尝试APC

于 2008-08-24T13:55:00.033 回答
2

已经给出了很多好的答案,但我想向您指出一个名为XCache的替代操作码缓存。它是由一个轻量级的贡献者创建的。

此外,如果您将来可能需要对数据库服务器进行负载平衡,MySQL Proxy可以很好地帮助您实现这一目标。

这两种工具都应该很容易地插入到现有的应用程序中,因此可以在需要时进行这种优化,而不会带来太多麻烦。

于 2008-11-16T19:07:47.963 回答
2

第一个问题是你真的期望它有多大?以及您计划对基础设施进行多少投资。由于您觉得有必要在这里提出问题,我猜您希望在有限的预算下从小处着手。

如果站点不可用,则性能无关紧要。对于可用性,您需要水平扩展。您可以明智地摆脱的最低限度是 2 台服务器,都运行 apache、php 和 mysql。将一个 DBMS 设置为另一个 DBMS 的从属。在主数据库上执行所有写入操作,并在本地数据库上执行所有读取操作(无论是什么)——除非出于某种原因您需要回读刚刚读取的数据(使用主数据库)。确保你已经准备好机器来自动提升奴隶并围住主人。对网络服务器地址使用循环 DNS,以提供对从节点的更多亲和性。

在这个阶段将数据分区到不同的数据库节点是一个非常糟糕的主意 - 但是您可能需要考虑将其拆分到同一服务器上的不同数据库中(当您超过 facebook 时,这将有助于跨节点分区)。

请确保您已准备好监控和数据分析工具来衡量您的站点性能并确定瓶颈。大多数性能问题可以通过编写更好的 SQL / 修复数据库模式来解决。

将模板缓存保存在数据库中是一个愚蠢的想法——数据库应该是结构化数据的中央公共存储库。将模板缓存保存在网络服务器的本地文件系统上——它可以更快地使用,并且不会减慢您的数据库访问速度。

一定要使用操作码缓存。

花大量时间研究您的网站及其日志,以了解其运行速度如此缓慢的原因。

将尽可能多的缓存推送到客户端。

使用 mod_gzip 压缩所有可以压缩的东西。

C。

于 2010-03-26T16:19:52.470 回答
2

我的第一条建议是考虑这个问题并在设计网站时牢记这一点,但不要过火。通常很难预测一个新网站的成功,我最好把你的时间花在早点完成并稍后优化它上。

一般来说,Simple 很快。模板会减慢您的速度。数据库会减慢您的速度。复杂的库会减慢您的速度。将模板相互分层,从数据库中检索它们并在复杂的库中对其进行解析——>时间延迟彼此相乘。

一旦您启动并运行了基本站点,请进行测试以向您展示在哪里花费您的精力。很难看出目标在哪里。通常为了加快速度,您将不得不解开代码的复杂性,这使得代码变得更大且更难维护,因此您只想在必要时进行。

根据我的经验,建立数据库连接的成本相对较高。如果您可以侥幸成功,请不要在访问量最大的页面(例如网站的首页)上连接到一般访问者的数据库。创建多个数据库连接是疯狂的,几乎没有什么好处。

于 2010-06-29T01:31:19.227 回答
1

@加里

不要使用 MySQLi——PDO 是“现代”OO 数据库访问层。要使用的最重要的功能是查询中的占位符。它也很聪明,可以为您使用服务器端准备和其他优化。

我现在正在关注 PDO,看起来你是对的 - 但是我知道 MySQL 正在为 PHP 开发 MySQLd 扩展 - 我认为要成功 MySQL 或 MySQLi - 你对此有何看法?


@瑞恩埃里克tj9991

感谢您对 PHP 的缓存扩展的建议——您能解释一下使用一个而不是另一个的原因吗?我通过 IRC 听说过有关 memcached 的好消息,但从未听说过 APC - 你对它们有什么看法?我认为使用多个缓存系统会适得其反。

我肯定会整理出一些分析测试人员 - 非常感谢您对这些的建议。

于 2008-08-24T12:38:56.927 回答
1

我看不到自己很快就会从 MySQL 切换——所以我想我不需要 PDO 的抽象功能。感谢 DavidM 的这些文章,它们对我帮助很大。

于 2008-08-24T14:25:56.247 回答
1

查看mod_cache,Apache Web 服务器的输出缓存,类似于 ASP.NET 中的输出缓存。

是的,我可以看到它仍然是实验性的,但总有一天它会是最终的。

于 2008-08-31T01:50:13.497 回答
1

我不敢相信没有人已经提到过这个:模块化和抽象。如果您认为您的网站将不得不增长到大量机器,那么您必须设计它以便它可以!这意味着愚蠢的事情,比如不要假设数据库在本地主机上。这也意味着一开始会很麻烦的事情,比如编写一个数据库抽象层(比如 PDO,但要轻得多,因为它只做你需要它做的事情)。

这意味着诸如使用框架之类的事情。您将需要代码层,以便以后可以通过重构数据抽象层来获得性能,例如,通过告诉它某些对象位于不同的数据库中 -并且代码不必知道或关心

最后,注意内存密集型操作,例如不必要的字符串复制。如果您可以降低 PHP 的内存使用率,那么您将从您的网络服务器中获得更高的性能,并且当您使用负载平衡解决方案时,这将是可扩展的。

于 2008-10-29T23:43:58.420 回答
1

如果您正在处理大量数据,并且缓存并没有减少它,请查看 Sphinx。我们使用 SphinxSearch 取得了很好的成果,不仅可以更好地进行文本搜索,还可以在处理更大的表时作为 MySQL 的数据检索替代品。如果您使用 SphinxSE(MySQL 插件),它会超过我们从缓存中获得的性能提升数倍,而且应用程序实现也很简单。

于 2009-04-15T16:49:55.653 回答
1

关于缓存的观点是正确的;它是构建高效应用程序中最简单和最重要的部分。我想补充一点,虽然 memcached 很棒,但如果您的应用程序位于单个服务器上,APC 的速度会快五倍。

MySQL 性能博客上的“缓存性能比较”帖子有一些关于该主题的有趣基准 - http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/

于 2010-02-02T00:11:25.490 回答