gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:49:57 24 4
gpt4 key购买 nike

我使用 ZendFramework2 和 Doctrine 启动我的项目。我的 CPU 在 httpd 请求上显示高使用率。我为文件缓存启用了 opcache,为 Doctrine 启用了 memcache

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

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

我的 Apache 工作台显示,当框架在没有任何数据库连接或转到任何 Controller 的情况下加载时,速度会慢 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);
//...

另一个高点是

Doctrine\ORM\Mapping\Driver\AnnotationDriver->loadMetadataForClass

最佳答案

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

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

top

这会很快为您提供大量信息。查看最上面的几行,在 CPU(s) 行中查看处理器将时间花在什么上面。非常高的 %wa 可能意味着等待来自数据库的磁盘 IO。

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

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

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

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

毕竟这一切 - 如果它仍然没有意义或全部。回来提出另一个问题并添加有关您的系统的更多详细信息。

......................

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

默认情况下,让 ZF2 为 View 和类查找文件非常容易。这会大大降低 ZF2 的速度,因为它必须在每次请求时都找到它们。出于同样的原因,当文件未使用绝对路径名加载时,Opcache 的效率也会降低。

ZF2 在 vendor/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 - 简单页面上的高平均负载 zf2 + 学说,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32692985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com