简单页面上的高负载平均zf2 +学说

bab*_*ian 10 php apache zend-framework doctrine-orm zend-framework2

我使用ZendFramework2和Doctrine来启动我的项目.我的CPU显示httpd请求的高使用率.我启用opcache了文件缓存和memcacheDoctrine.

知道为什么它的平均负载可能接近5.0吗?我把ZendFramework2 放在die('test1')里面onBootstrap一次,而另一次放在我die('test')之前.

die('test2')
Zend\Mvc\Application::init(require 'config/application.config.php')->run();
Run Code Online (Sandbox Code Playgroud)

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

[问题更新]

我用Xdebug和Webgrind进行了分析,发现像bootstrap这样的进程占很高的比例

(Application\Module-> onBootstrap)

在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);
    //...
Run Code Online (Sandbox Code Playgroud)

另一个要点是

教义\ ORM \映射\驱动\ AnnotationDriver-> loadMetadataForClass

Ste*_* E. 3

如果您的系统支持 50 个用户,而不是 100 个用户。那么您的系统可能存在瓶颈。当超过 50 个用户的阈值时,它可能会耗尽某些资源,从而导致负载迅速上升。

从字里行间看,您正在使用 LAMP 堆栈。有用的命令有:

top
Run Code Online (Sandbox Code Playgroud)

这可以非常快速地为您提供大量信息。查看最上面的行,了解 CPU 行中处理器将时间花在哪些事情上。%wa 非常高可能意味着等待数据库的磁盘 IO。

查看 Mem: 和 Swap: 行,检查低负载和高负载下的交换。如果它显着上升,则可能意味着您的系统内存不足。调整您的应用程序或添加更多 RAM。

查看正在运行的任务,顶部显示什么?httpd,也许是 mysql 或其他一些工具,例如备份运行并造成严重破坏。

尝试学习阅读系统中的信息。还有许多其他命令,例如“free -m”或“vmstat -n 5”,可能值得查找。

如果没有任何帮助,那么几个可能有帮助的 Apache 工具是mod_status这将显示 Apache 在任何给定时间正在处理的请求。另外,将%msT添加到 apache 中的 commonlog 配置选项将使其记录服务每个请求所需的时间,然后您可以在日志中查找任何非常慢的脚本。

毕竟这一切——如果仍然没有意义的话。返回另一个问题并添加有关您的系统的更多详细信息。

………………

感谢您添加额外的细节以及与 webgrind 的良好合作。有许多代码排列可能会导致速度变慢,但最好从一些基本的 ZF2 调整开始,这是一项有用的技能。

默认情况下,很容易让 ZF2 做大量查找视图和类文件的工作。这会大大减慢 ZF2 的速度,因为它必须根据每个请求找到它们。出于同样的原因,当不使用绝对路径名加载文件时,Opcache 的效率也会降低。

ZF2 在供应商/bin 中有一个工具可以帮助解决此问题,它可以生成类和文件位置的列表。对于应用程序文件夹中的每个模块。

php classmap_generator.php -l "..\..\modules\MODULENAME"
Run Code Online (Sandbox Code Playgroud)

例如

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'
Run Code Online (Sandbox Code Playgroud)

通过在 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__,
            ),
        ),
    );
}
Run Code Online (Sandbox Code Playgroud)

这告知 Zend 如何搜索要包含的文件并跳过猜测部分。在您的基准测试中它应该明显更快。