加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:30:18 所属栏目:PHP教程 来源:网络整理
导读:我使用ZendFramework2和Doctrine来启动我的项目.我的CPU在httpd请求上显示高使用率.我启用了用于文件缓存的opcache,以及Doctrine的memcache. 任何想法为什么它的负载平均值接近5.0?我把die(‘test1’)放在ZendFramework2的onBootstrap里面一次,另一次我把它
我使用ZendFramework2和Doctrine来启动我的项目.我的CPU在httpd请求上显示高使用率.我启用了用于文件缓存的opcache,以及Doctrine的memcache.

任何想法为什么它的负载平均值接近5.0?我把die(‘test1’)放在ZendFramework2的onBootstrap里面一次,另一次我把它(‘test’)放在了之前.

die('test2')
ZendMvcApplication::init(require 'config/application.config.php')->run();

我的Apache工作台显示,当框架加载时没有任何连接到数据库或去任何控制器,它的速度要慢5倍.为什么zf2这样做,可能是一个可行的解决方案来规范它的行为?

[问题更新]

我用Xdebug和Webgrind进行了剖析,发现进程如bootstrap占比很高

( ApplicationModule->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);
    //...

另一个高点就是

DoctrineORMMappingDriverAnnotationDriver->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 "....modulesMODULENAME"

例如

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(
        'ZendLoaderClassMapAutoloader' => array(
            __DIR__ . '/autoload_classmap.php',),'ZendLoaderStandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,);
}

这通知Zend如何搜索文件以包含和跳过猜测部分.在您的基准测试中应该明显更快.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读