步骤29:管理性能

5.2版本
维护 没有维护的

管理绩效

过早的优化是万恶之源。

也许你已经读过这段引文了。但我想完整地引用一下:

大约97%的情况下,我们应该忘记小的效率:过早的优化是万恶之源。然而,我们不应该错过这关键的3%的机会。

donald Knuth

即使是很小的性能改进也会产生影响,特别是对于电子商务网站。现在,留言簿应用程序已经准备就绪,让我们看看如何检查它的性能。

找到性能优化的最佳方法是使用分析器.现在最流行的选择是黑焰完整的免责声明:我也是黑火项目的创始人)。

介绍黑焰

黑火由以下几个部分组成:

  • 一个客户端触发配置文件(Blackfire CLI工具或谷歌Chrome或Firefox的浏览器扩展);
  • 一个代理在将数据发送到blackfire之前进行准备和汇总。输入输出显示;
  • PHP扩展(探针)来测试PHP代码。

要和黑火合作,你首先需要报名

通过运行以下快速安装脚本在您的本地机器上安装Blackfire:

1
curl https://installer.blackfire.io/美元|bash

这个安装程序下载Blackfire CLI Tool,然后在所有可用的PHP版本上安装PHP探针(没有启用它)。

为我们的项目启用PHP探测:

patch_file
1 2 3 4 5 6 7 8 9 10
——/ php . ini+ + + b / php . ini@@ session.use_strict_mode=On . session.use_strict_mode=On . session.use_strict_mode=Onrealpath_cache_ttl = 3600 zend.detect_unicode = xdebug.file_link_format = vscode: / /文件/ % f: % l++(黑焰)+#在Windows上使用php_blackfire.dll+扩展= blackfire.so

重启web服务器,以便PHP可以加载Blackfire:

1 2
$ ob娱乐下载symfony server:stop

Blackfire CLI Tool需要配置您的个人客户端凭据(将您的项目配置文件存储在您的个人帐户下)。在顶部找到他们设置/凭证页面并通过替换占位符执行以下命令:

1
$ blackfire config——client-idxxx——client-tokenxxx

请注意

要获得完整的安装说明,请遵循官方详细安装指南.当在服务器上安装Blackfire时,它们非常有用。

把黑火特工安排在多克身上

最后一步是在Docker Compose栈中添加Blackfire代理服务:

patch_file
1 2 3 4 5 6 7 8 9 10 11
——/ docker-compose.yaml+ + + b / docker-compose.yaml@@ -12,3 +12,8Mailer: image: schickling/mailcatcher ports: [1025,1080]++黑焰:+图片:黑焰/黑焰+ env_file: .env.local+港口:[8707]

要与服务器通信,您需要获取您的个人信息服务器凭据(这些凭据确定您想要存储配置文件的位置-您可以为每个项目创建一个);它们可以在底部找到设置/凭证页面.把它们储存在本地.env.local文件:

1 2
BLACKFIRE_SERVER_ID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx BLACKFIRE_SERVER_TOKEN = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

现在可以启动新容器了:

1 2
$ docker-compose up $ docker-compose up

修理一个不工作的黑火装置

如果你在分析时得到一个错误,增加Blackfire日志级别,以获得更多的日志信息:

patch_file
1 2 3 4 5 6 7
——/ php . ini+ + + b / php . ini@@ -10,3 +10,4 @@ zend.detect_unicode=Off#在Windows上使用php_blackfire.dll扩展名=blackfire.so+ blackfire.log_level = 4

重启web服务器:

1 2
$ ob娱乐下载symfony server:stop

跟踪日志:

1
syob娱乐下载mfony美元服务器:日志

重新配置文件,查看日志输出。

在生产环境中配置Blackfire

所有SymfonyCloud项目默认都包含Blackfire。ob娱乐下载ob直播app

设置服务器作为环境变量的凭证:

1 2
syob娱乐下载mfony var:美元BLACKFIRE_SERVER_IDXxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx $ ob娱乐下载symfony var:setBLACKFIRE_SERVER_TOKENxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

像其他PHP扩展一样启用PHP探测:

patch_file
1 2 3 4 5 6 7 8 9 10
——/ .syob娱乐下载mfob直播appony.cloud.yaml+ + + bob娱乐下载 /ob直播app .symfony.cloud.yaml@@ -4,6 +4,7 @@ type: php:7.4运行时:扩展:+ -黑焰- XSL - pdo_pgsql - apcu . xml

为Blackfire配置Varnish

在部署开始分析之前,需要一种绕过Varnish HTTP缓存的方法。否则,Blackfire将永远不会击中PHP应用程序。您将只授权绕过Varnish来分析来自本地机器的请求。

查找您当前的IP地址:

1
curl https://ifconfig.me/美元

并使用它来配置Varnish:

patch_file
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
——/ .syob娱乐下载mfony / config.vcl+ + + bob娱乐下载 / .symfony / config.vcl@@ -1,3 +1,11 @@+ acl配置文件{+ #授权本地IP地址(用上面找到的IP替换)+“a.b.c.d”;授权黑火服务器+“46.51.168.2”;+“54.75.240.245”;+}+Sub vcl_recv{设置请求。backend_hint = application.backend ();设置req.http。Surrogate-Capability =“abc = ESI / 1.0”;@@ -8,6 +16,16 @@ sub vcl_recv {}返回(清洗);}+不要配置ESI请求+ if (req.esi_level > 0) {+未凝结req.http.X-Blackfire-Query;+}++ #绕过清漆时,配置文件请求来自一个已知的IP+如果(req.http。X-Blackfire-Query & &客户端。IP ~ profile) {+返回(通过);+}} sub vcl_backend_response {

现在可以部署了。

分析Web页面

你可以通过Firefox或谷歌Chrome来配置传统的网页专用的扩展

在您的本地机器上,不要忘记禁用HTTP缓存配置/包/ framework.yaml如果没有,你将分析Symfony HTTP缓存层而不是你自己的代码:ob娱乐下载

patch_file
1 2 3 4 5 6 7 8
——/ config /包/ framework.yaml+ + + b / config /包/ framework.yaml@@ -16,4 +16,4 @@框架:php_errors:日志:真的——http_cache:真+ # http_cache:真的

为了更好地了解应用程序在生产环境中的性能,还应该分析“生产”环境。默认情况下,您的本地环境使用“开发”环境,这增加了很大的开销(主要是为web调试工具栏和Symfony分析器收集数据)。ob娱乐下载

将本地计算机切换到生产环境可以通过更改APP_ENV的环境变量.env.local文件:

1
APP_ENV =刺激

或者你可以用服务器:刺激命令:

1
syob娱乐下载mfony服务器:美元刺激

不要忘记切换回开发时,你的分析会话结束:

1
$ ob娱乐下载symfony server:prod关闭

分析API的资源

通过您之前安装的Blackfire CLI工具,在CLI中分析API或SPA更好:

1
美元的黑焰旋度ob娱乐下载symfony var:出口SYMFONY_PROJECT_DEFAULT_ROUTE_URLapi

黑焰旋度命令接受完全相同的参数和选项旋度

比较性能

在关于“缓存”的步骤中,我们添加了一个缓存层来提高代码的性能,但是我们没有检查或度量更改对性能的影响。由于我们都不善于猜测什么是快,什么是慢,因此可能会出现这样一种情况,即进行一些优化实际上会使应用程序变慢。

您应该始终测量使用分析器进行的任何优化的影响。黑火使它在视觉上更容易,多亏了它比较功能

编写黑盒功能测试

我们已经了解了如何使用Symfony编写功能测试。ob娱乐下载Blackfire可以用来编写浏览场景,这些场景可以通过黑焰的球员.让我们编写一个场景,在开发中提交一个新的评论并通过电子邮件链接验证它,在生产中通过管理员验证它。

创建一个.blackfire.yaml文件包含以下内容:

.blackfire.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
场景:| # !黑焰-player group login visit url('/login') submit button("Sign in") param username "admin" param password "admin" expect status_code() == 302 scenario name "Submit a comment on the Amsterdam conference page" include login visit url('/fr/conference/amsterdam-2019') expect status_code() == 200 submit button("Submit") param comment_form[author] 'Fabien' param comment_form[email] '(电子邮件保护)param comment_form[text]“这么好的一个会议!”param comment_form[photo] file(fake('image', '/tmp', 400, 300, 'cats'),awesome-cat.jpg)预计status_code() = = 302年跟随期望status_code() = = 200年预计(身体()匹配“/ /”这么好的会议)#等待工作流验证提交等5000年env ! =“刺激”访问url (webmail_url ~ /消息)预计status_code() = = 200组message_ids json(“[*].id”)与message_id message_ids访问url (webmail_url ~ /信息/的~ message_id ~ . html)预计status_code() = = 200组accept_url css(表一)当代().attr(“href”)包括登录访问url (accept_url) #我们不检查状态代码#处理“旧”消息不存在了#在DB(将404然后)当env = =“刺激”访问url('/admin/?entity=Comment&action=list') expect status_code() == 200 set comment_ids css('table. txt ')。表tbody tr) .extract(数据id)和id comment_ids访问url (/ admin /评论/审查/的~ id) #我们不检查状态代码扫描所有评论,#已经包括了访问url (/ fr /)等5000年访问url (/ fr /会议/阿姆斯特丹- 2019的)期望身体()匹配“这么好的会议/”

下载Blackfire播放器可以在本地运行场景:

1 2
$ chmod +x blackfire player.phar . php

在开发中运行以下场景:

1
美元。/ blackfire-player。phar运行——端点ob娱乐下载symfony var:出口SYMFONY_PROJECT_DEFAULT_ROUTE_URL.blackfire.yaml——变量"webmail_url= ob娱乐下载' symfony var:export MAILER_WEB_URL 2>/dev/null ' "——变量“env = dev”

或在生产中:

1
美元。/ blackfire-player。phar运行——端点ob娱乐下载symfony env: url——第一.blackfire.yaml——变量“webmail_url =没有”——变量“env =刺激”

黑火场景还可以为每个请求触发概要文件,并通过添加——黑焰国旗。

自动化性能检查

管理性能不仅仅是改进现有代码的性能,还包括检查是否引入了性能倒退。

上一节中编写的场景可以在持续集成工作流中自动运行,也可以定期在生产中运行。

ob娱乐下载Sob直播appymfonyCloud也允许这样做运行场景每当您创建一个新的分支或部署到生产环境时,自动检查新代码的性能。


  • «前步骤28:本地化应用程序
  • 下一个”步骤30:发现Symfony内部组件ob娱乐下载

这个工作,包括代码示例,是根据知识共享BY-NC-SA 4.0许可证。