前端之家收集整理的这篇文章主要介绍了
php – 简单页面上的高负载平均zf2原则,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用ZendFramework2和Doctrine来启动我的项目.我的
cpu在httpd请求上
显示高使用率.我启用了用于
文件缓存的opcache,以及Doctrine的memcache.
任何想法为什么它的负载平均值接近5.0?我把die(‘test1’)放在ZendFramework2的onBootstrap里面一次,另一次我把它(‘test’)放在了之前.
die('test2')
Zend\Mvc\Application::init(require 'config/application.config.PHP')->run();
我的Apache工作台显示,当框架加载时没有任何连接到数据库或去任何控制器,它的速度要慢5倍.为什么zf2这样做,可能是一个可行的解决方案来规范它的行为?
[问题更新]
我用Xdebug和Webgrind进行了剖析,发现进程如bootstrap占比很高
( Application\Module->onBootstrap)
在引导我有这行代码
//...
$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);
//...
另一个高点就是
Doctrine\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass
@H_
404_26@
如果您的系统适用于50个
用户,但不是100个.那么您可能在您的系统中有瓶颈.当它通过50个
用户的阈值时,它可能会耗尽某些资源,导致
负载迅速上升.
在线之间读取,您正在使用LAMP堆栈.有用的命令是:
top
这给你很多信息很快.查看顶部行可以在cpu行中看到处理器花费的时间.非常高的%wa可能意味着从数据库等待磁盘IO.
看看Mem:和Swap:行,检查你的交换在低和高负载.如果它已经显着上升,那么这可能意味着你的系统内存不足.调整您的应用程序或添加更多的RAM.
看看运行的任务,顶部显示什么? httpd,也许MysqL或其他一些工具像备份一样运行并造成破坏.
尝试学习阅读系统中的信息.还有许多其他命令,如’free -m’或’vmstat -n 5′,可能值得一看.
如果没有任何帮助,那么可能有帮助的几个Apache工具是mod_status这将显示Apache在任何给定时间处理的请求.另外在apache中添加%msT到您的commonlog配置选项将使其记录为每个请求提供服务所需的时间,然后可以在日志中查找任何非常慢的脚本.
毕竟,如果它仍然没有意义或全部.回到另一个问题,并添加更多关于您的系统的细节.
………………..
感谢您添加额外的细节和良好的工作与webgrind.代码的排列有很多可能会导致速度减慢,但最好从一些基本的ZF2调整开始,这是一个有用的技巧.
默认情况下,让ZF2做很多工作查找和查看文件.这会使ZF2下降很多,因为它必须在每个请求上找到它们.由于相同的原因,使用绝对路径名的文件未加载时,Opcache的效果也不太好.
ZF2有一个工具来帮助在供应商/ bin中生成类和文件位置的列表.对于应用程序文件夹中的每个模块.
PHP classmap_generator.PHP -l "..\..\modules\MODULENAME"
例如
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如何搜索文件以包含和跳过猜测部分.在您的基准测试中应该明显更快.