我与Kohana一起建立的网站昨天遭到了巨大的点击量,这使我退后一步并评估了一些设计。我很好奇什么是优化基于Kohana的应用程序的一些标准技术?
我也对基准测试感兴趣。是否需要设置Benchmark::start()
和设置Benchmark::stop()
每个控制器方法才能查看所有页面的执行时间,还是能够在全球范围内快速应用基准测试?
我将在更多时间使用Cache库,但是我愿意接受更多建议,因为我敢肯定,目前我还不知道有很多事情可以做。
Answers:
我将在此答案中说的并不是Kohana特有的,并且可能适用于许多PHP项目。
在谈论性能,可伸缩性,PHP时,我想到了以下几点:...在进行多个项目时,
我已经使用了许多想法-并且它们有所帮助;这样他们也可以在这里提供帮助。
首先,在表演方面,要考虑许多方面/问题:
真正有用的第一件事是在Web服务器前使用反向代理(例如varnish):让它缓存尽可能多的东西,因此只有真正需要PHP / MySQL计算的请求(当然还有其他一些请求)请求(当它们不在代理的缓存中时)将其发送到Apache / PHP / MySQL。
例如,关于使用反向代理作为缓存,对于PHP应用程序,您可以看一下Benchmark结果,结果显示APC和Squid Cache的服务器功能增加了400%-700%。
(是的,他们正在使用Squid,而我在讲的是清漆,这是另一种可能性^^清漆是较新的,但更致力于缓存)
如果您做得足够好,并且设法停止一次又一次地重新生成太多页面,也许您甚至不必优化任何代码;-)
至少,也许不急于...当您没有太多压力时执行优化总是更好的选择...
旁注:您在OP中说:
我与Kohana一起建立的网站昨天遭到了巨大的点击量,
这是什么样的突发情况,其中一个反向代理可以从字面上保存一天,如果你的网站可以处理不是最多为第二个日期:
关于这一点,我该如何发现被“斜线点缀”并使之幸存?可能是一个有趣的阅读。
首先:您是否正在使用最新版本的PHP?新版本通常会定期提高速度;-)
例如,看一下PHP Branches 3.0到5.3-CVS的Benchmark。
请注意,性能是使用PHP 5.3的一个很好的理由(我已经做了一些基准测试(法语),并且结果很棒) ……
另一个相当好的理由是,当然,PHP 5.2已经寿终正寝了。 ,并且不再维护!
[apc.stat](https://php.net/manual/en/apc.configuration.php#ini.apc.stat)
可能有助于提高系统负载;但是这意味着除非刷新整个操作码缓存,否则不会考虑对PHP文件所做的修改;对此,有关更多详细信息,请参见例如To stat()或Not To stat()?尽可能避免一遍又一遍地做同一件事。
我要考虑的主要内容当然是SQL查询:您的许多页面可能执行相同的查询,而其中某些结果几乎总是相同的……这意味着很多“无用的”查询对数据库的访问,必须花费时间一次又一次地为相同的数据提供服务。
当然,这对于其他内容也是如此,例如Web服务调用,从其他网站获取信息,大量计算,...
您可能会很感兴趣地找出:
并将这些数据/结果存储在某种缓存中,因此它们更容易获得-更快-并且您不必为了任何事情而去SQL服务器。
出色的缓存机制例如:
我很确定您的框架中包含一些与缓存相关的内容;您可能已经知道这一点,正如您在OP中所说的:“我将在更多时间使用Cache-library”;-)
现在,要做的一件好事是使用Xdebug扩展来分析您的应用程序:它通常可以很容易地找到几个弱点-至少,如果有任何函数需要花费很多时间。
正确配置后,它将生成性能分析文件,可以使用某些图形工具进行分析,例如:
例如,这是KCacheGrind的几个屏幕截图:
(来源:pascal-martin.fr)(来源:pascal-martin.fr)
(顺便说一句,如果我没记错的话,第二个屏幕截图中显示的调用图通常是WinCacheGrind或Webgrind都不能做的事情)
(感谢@Mikushi的评论)我没有使用太多的另一种可能性是xhprof扩展名:它也可以进行概要分析,可以生成调用图-但比Xdebug轻,这意味着您应该可以在其上安装生产服务器。
您应该能够使用它alonside XHGui,这将有助于数据的可视化。
现在我们已经讨论了一些关于PHP的知识,请注意,您的瓶颈很可能不是PHP方面的东西,而是数据库方面的东西。
至少有两三件事:
EXPLAIN
如果使用MySQL,是否根据指令
进行了(主要是使用正确的索引?)log_slow_queries
以获取需要“太多”时间的请求列表,然后根据这些请求开始优化。尽管如此,两个最重要的事情是:
如果您仍在阅读,还有什么可以优化的?
嗯,还有改进的余地...一些面向体系结构的想法可能是:
好吧,也许其中的一些想法在您的情况下有点过分了^^
但是,还是...为什么不研究一下,以防万一?;-)
您最初的问题是关于优化使用Kohana的应用程序...好吧,我已经发布了一些适用于任何PHP应用程序的想法...这意味着它们也适用于Kohana ;-) (即使不是特定于此的)
^^)
我说:使用缓存;Kohana似乎支持某些缓存内容 (您自己说过,所以这里没有新内容...。)
如果可以快速完成任何操作,请尝试;-)
我还说过,您不应做任何不必要的事情;默认情况下,Kohana是否有不需要的功能?
浏览网络,似乎至少与XSS过滤有关;你需要那个吗?
不过,这里有一些可能有用的链接:
最后,有一个简单的想法:
我并不是说您不应该优化:您绝对应该!
但是请进行“快速”优化,这将为您带来丰厚的回报首先为:使用某些操作码缓存可能会帮助您节省服务器CPU负载的10%到50%...而且设置仅需几分钟;- )另一方面,花3天的时间赚2%...
哦,顺便说一句:在做任何事情之前:放置一些监视内容,以便您知道已进行了哪些改进以及如何进行改进!
如果没有监控,您将不会知道自己所做的工作的效果……即使这不是真正的优化,也是如此!
例如,您可以使用RRDtool + cacti之类的东西。
向您的老板展示一些不错的图形,CPU负载下降40%总是很棒的;-)
无论如何,要真正得出结论:玩得开心!
(是的,优化很有趣!)
(嗯,我认为我不会写那么多...希望至少其中的某些部分有用...而且我应该记住这个答案:在其他时候可能有用。 ..)
使用XDebug和WinCacheGrind或WebCacheGrind可以分析和分析缓慢的代码执行。
(来源:jokke.dk)
Kohana开箱即用非常快,除了使用数据库对象外。引用Zombor:“可以通过确保使用数据库结果对象而不是结果数组来减少内存使用。” 这使被猛击的站点上的HUGEE性能有所不同。它不仅使用更多的内存,而且减慢了脚本的执行速度。
另外-您必须使用缓存。我更喜欢内存缓存,并在我的模型中使用它,如下所示:
public function get($e_id)
{
$event_data = $this->cache->get('event_get_'.$e_id.Kohana::config('config.site_domain'));
if ($event_data === NULL)
{
$this->db_slave
->select('e_id,e_name')
->from('Events')
->where('e_id', $e_id);
$result = $this->db_slave->get();
$event_data = ($result->count() ==1)? $result->current() : FALSE;
$this->cache->set('event_get_'.$e_id.Kohana::config('config.site_domain'), $event_data, NULL, 300); // 5 minutes
}
return $event_data;
}
这也将大大提高性能。以上两种技术使站点性能提高了80%。
如果您提供了有关瓶颈所在的更多信息,我相信我们可以提供一些更好的想法。
另外,请查看yslow(google it)了解其他一些性能提示。