我使用ZendFramework2和Doctrine来启动我的项目。我的CPU显示httpd
请求的高使用率。我启用opcache
进行文件缓存,memcache
启用Doctrine。
知道为什么它的平均负载可能接近5.0?我将die('test1')
放在ZendFramework2的onBootstrap
内一次,另一次放在die('test')
之前。
die('test2')
Zend\Mvc\Application::init(require 'config/application.config.php')->run();
我的Apache工作台显示,当框架加载而没有任何数据库连接或转到任何控制器时,它的速度要慢5倍。为什么zf2表现得像这样,以及可能的解决方案来规范它的行为?
[问题更新]
我使用Xdebug和Webgrind进行了分析,发现像bootstrap这样的进程占用了很高的百分比
(Application \ Module-> onBootstrap)
on bootstrap我有这行代码
//...
$eventManager->attach(MvcEvent::EVENT_ROUTE, function($e) use ($blacklistForNormalUser, $auth) {
$match = $e->getRouteMatch();
// No route match, this is a 404
if (!$match instanceof RouteMatch) {
return;
}
// Route is whitelisted
$name = $match->getMatchedRouteName();
if (!in_array($name, $blacklistForNormalUser) ) {
return;
}
// User is authenticated
if ($auth->hasIdentity() ) {
return;
}
// Redirect to the user login page, as an example
$router = $e->getRouter();
if(in_array($name, $blacklistForNormalUser)){
$url = $router->assemble(array(), array(
'name' => 'user/login'
));
}
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
return $response;
}, -100);
//...
另一个要点是
学说\ ORM \映射\驱动\ AnnotationDriver-> loadMetadataForClass
答案 0 :(得分:3)
如果您的系统可以使用50个用户,但不能使用100个。那么您的系统可能存在瓶颈。当它超过50个用户的阈值时,它可能会耗尽一些资源,导致负载迅速上升。
在线之间读取,您正在使用LAMP堆栈。有用的命令是:
top
这可以非常快速地为您提供大量信息。查看顶行以在CPU(s)行中查看处理器花费时间的内容。非常高的%wa可能意味着从数据库等待磁盘IO。
查看Mem:和Swap:行,检查低负载和高负载时的交换。如果它已经显着上升,则可能意味着您的系统内存不足。调整您的应用程序或添加更多内存。
查看正在运行的任务,顶部显示的内容是什么? httpd,也许是mysql或其他一些工具,比如备份运行并造成破坏。
尝试学习阅读系统中的信息。还有许多其他命令,例如' free -m'或者' vmstat -n 5'这可能值得一看。
如果没有任何帮助那么可能有帮助的几个Apache工具mod_status这将显示Apache在任何给定时间处理的请求。在apache中将%msT添加到您的commonlog配置选项将使其记录为每个请求提供服务所花费的时间,然后您可以在日志中查找任何非常慢的脚本。
毕竟 - 如果它仍然没有意义或全部。回到另一个问题并添加有关您系统的更多细节。
....................
感谢您为webgrind添加额外的细节和良好的工作。有许多代码的排列可能导致速度变慢,但最好从一些基本的ZF2调优开始,这是一项有用的技能。
默认情况下,让ZF2为查看和类查找文件做很多工作非常容易。这会大大减慢ZF2的速度,因为它必须在每次请求时找到它们。出于同样的原因,当使用绝对路径名未加载文件时,Opcache的效果也较差。
ZF2有一个工具可以在vendor / bin中帮助它,它可以生成类和文件位置的列表。对于Application文件夹中的每个模块。
php classmap_generator.php -l "..\..\modules\MODULENAME"
e.g。
php classmap_generator.php -l ../../module/Application
Creating class file map for library in '/zend/module/Application'...
Wrote classmap file to '/zend/module/Application/autoload_classmap.php'
通过向Module.php文件中添加类似内容来确保使用类图:
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
这告诉Zend如何搜索要包含的文件并跳过猜测部分。它的基准测试应该明显加快。
答案 1 :(得分:2)
不会进入任何特定的框架细节,只是一般的PHP。所以一点一点地解决问题。
我的cpu显示httpd请求的高使用率。
是否有繁重的计算执行或重度查询?也许其他系统进程使用CPU太多(失控进程)?它可能会发生,现在是优化代码的适当时机。
debug_backtrace
是显示执行跟踪的好方法xcode
这样的debuger / profiler。有A LOT个功能和很好的工具可以使用kcachegrind等GUI工具分析结果。执行时间,内存消耗,逻辑树,图表等 - 所有这些都可供您探索。我为文件缓存启用了opcache,为doctrine启用了memcache
郊游php.net
OPcache通过将预编译的脚本字节码存储在共享内存中来提高PHP性能,从而无需PHP在每个请求上加载和解析脚本。
因此没有任何与文件缓存相关的内容。引用说它非常简洁明了 - 它加速了php部分。有一个simmilar question(也与zend相关)告诉你 memcache 和 memcache d 之间的差异;无论如何,如果您的数据库负载过重或查询缓慢/沉重,它可能是补救措施。
那么负载平均值接近5.0的原因是什么?
由于必须分析整个系统,因此这一点更为复杂。是的,可能会发生只需要重做部分代码,也可能发生整个应用程序存在严重问题,Web服务器,数据库,缓存层的配置。
我建议采取理智的方法并开始reverse engineer
。
nginx
,能够提供21倍以上的请求/秒,静态文件也在飞行,内存消耗低(不是真的与CPU有关,我知道)我的apache工作台显示当框架加载时没有任何连接到数据库或者去任何控制器它的速度慢了5倍
这很有趣,因为在与DB建立连接时始终存在开销,无论大小......
为什么zf2太重了,解决方案是什么?
我想这将是广泛的,你只需选择你喜欢的框架,考虑与之捆绑的优缺点。