我与Kohana一起建立的网站昨天遭到了大流量的抨击,这使我退后一步并评估了一些设计。我很好奇什么是优化基于Kohana的应用程序的一些标准技术?

我也对基准测试感兴趣。我是否需要为每个控制器方法设置Benchmark::start()Benchmark::stop()以便查看所有页面的执行时间,还是可以在全球范围内快速应用基准测试?

我将在未来更多时间使用Cache库,但是我愿意接受更多建议,因为我敢肯定,目前我还不知道有很多事情可以做。

最佳答案

我将在此答案中说的并不是Kohana特有的,并且可能适用于许多PHP项目。

在谈论性能,可伸缩性,PHP等时,我想到了以下几点:
在进行多个项目时,我已经使用了许多这样的想法-他们提供了帮助;这样他们也可以在这里提供帮助。


首先,在表演方面,要考虑许多方面/问题:


服务器的配置(Apache,PHP,MySQL,其他可能的守护程序和系统);我想,您可能会在ServerFault上获得更多帮助。
PHP代码,
数据库查询
是否使用您的网络服务器?
您可以使用任何一种缓存机制吗?还是您总是需要网站上更多的最新数据?




使用反向代理

可能真正有用的第一件事是在Web服务器前使用反向代理,例如varnish:让它缓存尽可能多的东西,因此只有真正需要PHP / MySQL计算的请求(当然,其他一些请求(当它们不在代理的缓存中时)将其发送到Apache / PHP / MySQL。


首先,您的CSS / Javascript / Images(当然,所有静态的东西)可能不一定总是由Apache服务


因此,您可以让反向代理缓存所有这些。
对Apache来说,提供这些静态文件并不重要,但是对于这些文件而言,工作量越少,它将能够使用PHP进行的处理就越多。
请记住:Apache一次只能处理有限的有限数量的请求。

然后,让反向代理从缓存中尽可能多地服务于PHP页面:可能有些页面的更改不那么频繁,并且可以从缓存中得到服务。为什么不使用其他基于PHP的缓存,而不是让另一个更轻便的服务器为它们服务(并不时从PHP服务器获取它们,因此它们始终是最新的)?


例如,如果您有一些经常需要的RSS提要(在尝试优化性能时,我们通常会忘记这些提要),那么将它们在缓存中保留几分钟,可以将成百上千的请求保存到Apache + PHP + MySQL!
如果您的网站上访问量最大的页面在至少几分钟内没有变化(例如:首页?),则无需更改,因此,无需浪费CPU每次用户请求时重新生成它们的时间。

匿名用户服务的页面(所有匿名用户的页面都相同)和识别用户的页面(例如“ X先生您好,您有新消息”)之间是否可能有所不同?


如果是这样,您可能可以配置反向代理以缓存为匿名用户提供的页面(通常基于cookie,例如会话cookie)
这意味着Apache + PHP的工作量更少:只有确定的用户-这可能只是您用户的一小部分。



关于使用反向代理作为缓存,对于PHP应用程序,您可以例如查看Benchmark Results Show 400%-700% Increase In Server Capabilities with APC and Squid Cache
(是的,他们正在使用Squid,而我在谈论的是清漆-这只是另一种可能性^^清漆是较新的,但更致力于缓存)

如果您做得足够好,并且设法一次又一次地停止重新生成太多页面,也许您甚至不必优化任何代码;-)
至少,也许不急于...当您没有太多压力时,执行优化总是更好的选择...


旁注:您在OP中说:


我与Kohana建立的网站遭到了猛烈抨击
昨天流量很大,


如果您的网站无法及时更新,这是一种突然的情况,反向代理实际上可以节省一天的时间:


安装,配置,让它始终(每天正常运行):


配置它以不将PHP页面保留在缓存中;或仅持续很短的时间;这样,您总是可以显示最新数据

而且,在您进行斜线或digg效果的那一天:


配置反向代理以将PHP页面保留在缓存中;或更长的时间;也许您的页面不会在第二秒之前更新,但是它将使您的网站能够幸免于难!



关于这一点,How can I detect and survive being “Slashdotted”?可能是一个有趣的读物。



在PHP方面:

首先:您是否正在使用最新版本的PHP?定期改进速度,使用新版本;-)
例如,查看Benchmark of PHP Branches 3.0 through 5.3-CVS

请注意,性能是使用PHP 5.3(I've made some benchmarks (in French),效果很好)的一个很好的理由...
当然,另一个很好的理由是PHP 5.2已经到了使用寿命,并且不再维护!

您是否正在使用任何操作码缓存?


我在考虑APC-替代PHP缓存,例如(peclmanual),这是我见过的使用最多的解决方案-并且在我使用过的所有服务器上都使用过。


另请参阅:Slides APC Facebook
Benchmark Results Show 400%-700% Increase In Server Capabilities with APC and Squid Cache

在某些情况下,它确实可以大大降低服务器的CPU负载(我已经看到有些服务器上的CPU负载从80%降至40%,只需安装APC并激活其操作码缓存功能!)
基本上,PHP脚本的执行分两个步骤:


将PHP源代码编译为操作码(相当于JAVA的字节码)
这些操作码的执行
APC将这些代码保存在内存中,因此每次执行PHP脚本/文件时都不需要做很多工作:仅从RAM中提取操作码,然后执行它们。

您可能需要看一下APC的configuration options


其中有很多,对您的速度/ CPU负载/易用性都有很大影响
例如,禁用[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)可能有助于系统负载。但这意味着除非刷新整个操作码缓存,否则不会考虑对PHP文件所做的修改;关于此,有关更多详细信息,请参见例如To stat() Or Not To stat()?





使用数据缓存

尽可能避免重复做同一件事。

我要考虑的主要内容当然是SQL查询:您的许多页面可能执行相同的查询,而其中某些结果几乎总是相同的……这意味着很多“无用的”查询对数据库的访问,必须花时间一次又一次地为相同的数据提供服务。
当然,这对于其他内容也是如此,例如Web服务调用,从其他网站获取信息,大量计算,...

您可能会很感兴趣地找出:


哪些查询运行了很多次,总是返回相同的数据
哪些其他(繁重的)计算需要花费很多时间,并且总是返回相同的结果


并将这些数据/结果存储在某种类型的缓存中,因此它们更容易获得-更快-并且您不必为了任何事情而去SQL服务器。

出色的缓存机制例如:


APC:除了我之前提到的操作码缓存外,它还允许您将数据存储在内存中,
和/或memcachedsee also),如果您确实有大量数据和/或正在使用多个服务器(因为它们是分布式的),则这很有用。
当然,您可以考虑文件;还有很多其他想法。


我很确定您的框架中包含一些与缓存有关的内容;您可能已经知道这一点,正如您在OP中所说的:“我将在更多时间使用Cache-library” ;-)



剖析

现在,要做的一件好事是使用Xdebug扩展名来分析您的应用程序:它通常可以很容易地找到几个弱点-至少在某些功能需要花费很多时间的情况下。

Configured properly,它将生成可通过某些图形工具进行分析的配置文件,例如:


KCachegrind:我的最爱,但仅适用于Linux / KDE
Wincachegrind用于Windows;不幸的是,它比KCacheGrind少了一些东西-通常它不显示调用图。
Webgrind在PHP网络服务器上运行,因此可以在任何地方使用-但可能功能较少。


例如,这是KCacheGrind的几个屏幕截图:

php - 优化基于Kohana的网站以提高速度和可扩展性-LMLPHP
(来源:pascal-martin.fr
php - 优化基于Kohana的网站以提高速度和可扩展性-LMLPHP
(来源:pascal-martin.fr

(顺便说一句,如果我没记错的话,第二个屏幕截图中显示的调用图通常是WinCacheGrind或Webgrind都不能做的事情)


(感谢@Mikushi的评论)我没有使用太多的另一种可能性是xhprof扩展名:它也有助于分析,可以生成调用图-但比Xdebug轻,这意味着您应该能够安装它在生产服务器上。

您应该能够在alonside XHGui上使用它,这将有助于数据的可视化。



在SQL方面:

现在我们已经讨论了一些关于PHP的知识,请注意,您的瓶颈很有可能不是PHP方面的东西,而是数据库方面的东西。

至少有两三件事:


您应该确定:


您的应用程序正在执行的最常见查询是什么
如果使用MySQL,是否使用EXPLAIN指令对它们进行了优化(主要是使用正确的索引?)


另请参阅:Optimizing SELECT and Other Statements
例如,您可以激活log_slow_queries以获得需要“太多”时间的请求列表,然后根据这些请求开始优化。

是否可以缓存其中一些查询(请参阅我之前所说的内容)

您的MySQL是否配置正确?我对此了解不多,但是有些配置选项可能会产生一些影响。


Optimizing the MySQL Server可能会给您一些有趣的信息。



尽管如此,两个最重要的事情是:


如果不需要,请不要进入数据库:尽可能多地缓存!
当您必须去数据库时,使用高效的查询:使用索引;使用索引。和个人资料!




现在怎么办?

如果您仍在阅读,还有什么可以优化的?

嗯,还有改进的余地...一些面向架构的想法可能是:


切换到n层架构:


将MySQL放在另一台服务器上(2层:一个用于PHP;另一个用于MySQL)
使用多个PHP服务器(并在这些服务器之间平衡用户负载)
将另一台机器用于静态文件,并使用较轻的网络服务器,例如:


lighttpd
nginx-这个越来越流行了,顺便说一句。

为MySQL使用多个服务器,为PHP使用多个服务器,并在它们前面使用多个反向代理
当然:在任何具有任何可用RAM的服务器上安装memcached守护程序,并使用它们尽可能多地缓存/有意义。

使用Apache的“更有效”的工具?


我越来越经常听到有关nginx的信息,当涉及到PHP和高流量网站时,它应该很棒。我自己从未使用过它,但是您可能会在网上找到一些有趣的文章。


例如PHP performance III -- Running nginx
另请参阅:PHP-FPM - FastCGI Process Manager,它与PHP> = 5.3.3捆绑在一起,并与nginx结合在一起。




好吧,在您的情况下,其中一些想法可能有些过分了^^
但是,还是...为什么不研究一下,以防万一? ;-)



那Kohana呢?

您最初的问题是关于优化使用Kohana的应用程序...好吧,我已经发布了一些适用于任何PHP应用程序的想法...这意味着它们也适用于Kohana ;-)
(即使不是特定的^^)

我说:使用缓存; Kohana似乎支持某些caching stuff(您自己说过,所以这里没有新内容……)
如果有什么可以快速完成的操作,请尝试;-)

我还说过,您不应做任何不必要的事情;默认情况下,Kohana是否有不需要的功能?
浏览网络,似乎至少与XSS过滤有关;你需要那个吗?

不过,这里有一些可能有用的链接:


Kohana General Discussion: Caching?
Community Support: Web Site Optimization: Maximum Website Performance using Kohana




结论?

最后,有一个简单的想法:


您的公司向您支付5天的费用是多少? -考虑到进行一些重大优化是合理的时间
您的公司购买(购买?)第二台服务器及其维护需要花费多少钱?
如果必须扩大规模怎么办?


花10天会花多少钱?更多?优化您的应用程序的每一个可能?
还有几台服务器要多少钱?



我并不是说您不应该优化:您绝对应该!
但是请进行“快速”的优化,这将首先为您带来丰厚的回报:使用某些操作码缓存可能会帮助您节省服务器CPU负载的10%到50%...而且设置仅需要几分钟;- )另一方面,花3天的时间赚2%...

哦,顺便说一句:在做任何事情之前:先放置一些监视内容,以便您知道已进行了哪些改进以及如何进行改进!
如果没有监控,您将不会知道所做工作的效果……即使这不是真正的优化,也不会!

例如,您可以使用RRDtool + cacti之类的东西。
向您的老板展示一些不错的图形,CPU负载下降40%总是很棒的;-)


无论如何,要真正得出结论:玩得开心!
(是的,优化很有趣!)
(Ergh,我认为我不会写那么多...希望其中至少有一部分是有用的...而且我应该记住这个答案:在其他时候可能有用...)

10-07 19:37
查看更多