php – 简单页面上的高负载平均zf2原则

前端之家收集整理的这篇文章主要介绍了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

如果您的系统适用于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如何搜索文件以包含和跳过猜测部分.在您的基准测试中应该明显更快.

猜你在找的PHP相关文章