Оптимизацияпроизводительности

Оптимизацияпроизводительности

Преждевременнаяоптимизация-кореньвсехзолвпрограммировании。

Возможновывстречалиэтуцитатуиранее,однакоялюблюцитироватьеёполностью:

Намследуетзабыватьонебольшойэффективности,например,97%вслучаев:преждевременнаяоптимизация-кореньвсехзол。Инапротив,мыдолжныуделитьвсёвниманиеоставшимся3%。

——唐纳德·克努特

Даженезначительноеувеличениепроизводительностиимеетважноезначение,особеннодляинтернет——магазинов。Теперь,когдаприложениегостевойкнигиготово,давайтепроверимегопроизводительность。

Лучшийспособопределитьпотенциальныеобластидляоптимизации——использоватьпрофилировщик.Однимизнаиболеепопулярныхнасегодняшнийденьявляется黑焰важноепримечание: также основател п оекта Blackfire)。

Знакомство с Blackfire

黑火состоит из нес скол ки и с сте т:

  • Клиент,запускающийпрофили(CLI -инструмент黑焰илирасширениедлябраузера谷歌ChromeилиFirefox);
  • Агент,которыйподготавливаетисобираетданныепередихотправкойнасайт黑焰。IO дл отображения;
  • PHP -модуль(зонд), котор инст т ментир е е php -код。

Зарегистрируйтесь, чтобы на а а ат т а аботу с黑火。

Установите黑焰навашулокальнуюмашину,запустивскриптбыстройустановки:

1
Curl https://installer.blackfire.io/installer.sh | bash

УстановщикзагрузитиустановитCLI -инструмент黑焰。

ПозавершенииустанавливаетPHP -зонднавседоступныеверсииPHP:

1
Sudo blackfire php:安装

И о кл о И И т т -зон нд дл на ое оекта:

1 2 3 4 5 6 7 8 9 10
——/ php . ini+ + + b / php . ini@@ -7,3 +7,7 @@会话use_strict_mode=On realpath_cache_ttl=3600 zend.detect_unicode=Off xdebug.file_link_format=vscode://file/%f:%l . use_strict_mode=On realpath_cache_ttl=3600 zend.detect_unicode=Off++(黑焰)在Windows上使用php_blackfire.dll+扩展= blackfire.so

Перезапуститевеб——сервер,чтобыPHP cмогзагрузить黑焰:

1 2
欧宝娱乐app下载地址symfony服务器:停止欧宝娱乐app下载地址Symfony服务器:start -d

Дляхраненияпрофилейприложенийввашейучётнойзаписи,необходимонастроитьинструмент黑焰CLI,используявашиперсональныеклиентскиеучётныеданные。Найдите и в верхустраницы设置/凭证ивыполнитеследующуюкоманду,предварительноподставивсвоиданныевсоответствующиеместа:

1
Blackfire客户端:config——client-id=xxx——client-token=xxx

Установка Blackfire-а а ента в Docker

Службаагента黑焰уженастроенавстеке码头工人组成:

docker-compose.override.yml
1 2 3 4 5 6 7 8 9
blackfireio/blackfire- symf欧宝娱乐app下载地址y -meta ###黑焰:图片:黑焰/黑焰:2# uncomment将Blackfire凭据存储在本地的.env中。本地文件# env_file: .env.local环境:BLACKFIRE_LOG_LEVEL:4港口:[8307]###< blackfireio/blackfire-欧宝娱乐app下载地址 symfy -meta ###

Длясоединенияссерверомвамнеобходимополучитьвашиперсональныесерверныеучётныеданные。Этиучётныеданныеуказывают,гдевыхотитехранитьпрофили,которыевыможетесоздатьдлякаждогопроекта。Их можно на а т ти и низ зстраницы设置/凭证.Сохраните данн е локал но в ф - ал е.env.local

1 2 3 4
欧宝娱乐app下载地址Symfony控制台的秘密:BLACKFIRE_SERVER_ID# xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx欧宝娱乐app下载地址Symfony控制台的秘密:BLACKFIRE_SERVER_TOKEN# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Теперь за ап о стит т о о о о т ко о те он:

1 2
docker-compose停止Docker-compose up -d

Исправление неработающей стано о ки黑火

Есливовремяпрофилированияпоявляетсяошибка-увеличьтеуровеньлогированияошибок黑焰,чтобысобиратьбольшеинформациивотчётахобошибках:

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

Перезапуститевеб——сервер:

1 2
欧宝娱乐app下载地址symfony服务器:停止欧宝娱乐app下载地址Symfony服务器:start -d

И след И т з за ло ам И:

1
欧宝娱乐app下载地址symfony服务器:日志

Запуститепрофилированиесноваипроверьтезаписилога。

Настройка黑火в п одак к ене

Поумолчанию黑焰добавленвовсепроектынаPlatform.sh。

Установите н е етн о анн ннсерверав ка а се стве секретов дл окружения生产

1 2 3 4
欧宝娱乐app下载地址Symfony控制台的秘密:BLACKFIRE_SERVER_ID - env =刺激# xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx欧宝娱乐app下载地址Symfony控制台的秘密:BLACKFIRE_SERVER_TOKEN - env =刺激# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

PHPЗондужевключён,какилюбойдругойнеобходимыймодульPHP:

.platform.app.yaml
1 2 3 4 5 6 7 8 9 10
运行时:扩展:-apcu-黑焰-ctype-iconv-mbstring-pdo_pgsql--xsl

Настройка清漆дл работы с黑火

Передразвёртыванием,чтобыприступитькпрофилированию,вамнеобходимообойтиHTTP -кеш清漆。Еслиэтогонесделать——黑焰никогданесможетполучитьдоступквашемPHP -пуриложению。ДостаточноразрешитьHTTP -запросыпрофилирования,приходящиетолькосвашеголокальногокомпьютера。

Узнайте а а а а а а а а а а а а с:

1
curl https://ifconfig.me/

И И спол зу у те е т ол настро к И清漆:

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
——/ .platform / config.vcl+ + + b / .platform / config.vcl@@ -1,3 +1,11 @@+acl配置{+ #授权本地IP地址(替换为上面找到的IP)+“192.168.0.1”;授权Blackfire服务器+“46.51.168.2”;+“54.75.240.245”;+}+Sub vcl_recv {set req。Backend_hint = application.backend();设置req.http。代理能力= "abc=ESI/1.0";@@ -8,6 +16,16 @@ sub vcl_recv {} return(清除);}++ #不要分析ESI请求+ if (req.esi_level > 0) {+取消req.http.X-Blackfire-Query;+}++ #绕过清漆时,配置文件请求来自一个已知IP+ if (req.http。x - blackfire -查询&&客户端。IP ~配置文件){+ return (pass);+}} sub vcl_backend_response {

Теперь можно а а а а о о о а а а ат。

Профилированиевеб——страниц

Дляпрофилированияобычныхвеб——страницвFirefoxили谷歌Chromeиспользуйтесоответствующиерасширения

ВовремяпрофилированиянезабудьтеотключитьHTTP -кешнавашейлокальноймашиневфайле配置/包/ framework.yaml.Еслиэтогоневыполнить,товместосвоегокода,выбудетепрофилироватьслойHTTP -кешаSymfony。欧宝娱乐app下载地址

Дляполучениянаиболееполногопредставленияопроизводительностиприложениявпродакшен,евамтакженеобходимопрофилироватьокружениепродакшена(“产品”)。Поумолчаниювашелокальноеокружениеиспользуетсредуразработки(“发展”),чтовлечётзасобойсущественныенакладныерасходы(этопроисходитвосновномиз——засбораданныхдляотладочнойпанелииSymfony——профилировщика)。欧宝娱乐app下载地址

请注意

Посколькумыбудемпрофилироватьокружение“生产”,вконфигурацииничегоменятьненужно,таккаквпредыдущейглавемывключилислойHTTP -кешаSymfonyтолькодлясреды“发展”。欧宝娱乐app下载地址

ПереключитеокружениевашейлокальноймашинынаработувпродакшенепутёмизменениязначенияпеременнойокруженияAPP_ENVвфайле.env.local

1
APP_ENV =刺激

Также вы можете испол зоват команд服务器:刺激

1
欧宝娱乐app下载地址symfony服务器:刺激

Незабудьтепереключитьсяобратнонаокружениеразработкипослезавершениясеансапрофилирования:

1
欧宝娱乐app下载地址Symfony服务器:prod -off

ПрофилированиеAPI——ресурсов

ПрофилированиеAPIилиSPAлучшевыполнятьвкоманднойстрокеспомощьюустановленногоранееинструмента黑焰CLI:

1
Blackfire curl的s欧宝娱乐app下载地址ymfony var:出口欧宝娱乐app下载地址SYMFONY_PROJECT_DEFAULT_ROUTE_URL被

Команда黑焰旋度п о инимает т же аргументы и оп ии, т то и旋度

Сравнениепроизводительности

Вшагепрокешированиедляповышенияпроизводительностимыдобавилислойкеширования,однакомынепроверили,каквнесённыеизмененияповлиялинапроизводительность。Таккакдовольносложноугадать,чтобудетработатьбыстрее,ачтомедленне,етоможнооказатьсявситуаци,икогдаиз——заоптимизациичего——либовашеприложениенасамомделестанеттолькомедленнее。

Спомощьюпрофилировщикавсегданеобходимоизмерятьвлияниекаждойсделаннойоптимизации。黑焰позволяетупроститьвизуальнуюоценкупроизводительностиблагодарявозможностисравнения

Написаниефункциональныхтестовпопринципучёрногоящика

Мыужезнакомыстем,какписатьфункциональныетестыспомощьюSymfony。欧宝娱乐app下载地址黑焰,всвоюочередь,можетбытьиспользовандлянаписаниябраузерныхсценариев,которыеможнозапускатьпожеланиюспомощьюприложения黑焰的球员.Давайтенапишемсценарий,которыйотправитновыйкомментарийипроверитегопоссылкевэлектроннойпочтевокружениидляразработки,атакжевадминистративнойпанеливпродакшене。

Создайтефайл.blackfire.yamlсо о следующим содержимым:

.blackfire.yaml
12 34 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 52 53 54
场景:| #!黑焰-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] 'me@example.com' param comment_form[text] 'Such a good conference!' param comment_form[photo] file(fake('simple_image', '/tmp', 400, 300, 'png', true, true), 'placeholder-image.jpg') expect status_code() == 302 follow expect status_code() == 200 expect not(body() matches "/Such a good conference/") # Wait for the workflow to validate the submissions wait 5000 when env != "prod" visit url(webmail_url ~ '/messages') expect status_code() == 200 set message_ids json("[*].id") with message_id in message_ids visit url(webmail_url ~ '/messages/' ~ message_id ~ '.html') expect status_code() == 200 set accept_url css("table a").first().attr("href") include login visit url(accept_url) # we don't check the status code as we can deal # with "old" messages which do not exist anymore # in the DB (would be a 404 then) when env == "prod" visit url('/admin') expect status_code() == 302 follow click link("Comments") expect status_code() == 200 set comment_ids css('table.table tbody tr').extract('data-id') with id in comment_ids visit url('/admin/comment/review/' ~ id) # we don't check the status code as we scan all comments, # including the ones already reviewed visit url('/fr/') wait 5000 visit url('/fr/conference/amsterdam-2019') expect body() matches "/Such a good conference/"

Загрузите黑焰球员длявыполнениясценарияналокальноймашине:

1 2 3
curl -OLsS https://get.blackfire.io/blackfire-player.pharChmod +x blackfire-player.pharcp /home/fabien/Code/github/blackfireio / blackfire.io /播放器/ blackfire-player。phar blackfire-player.phar

Запустите у тот с с с с и на а ии т в окружении а аз а аб ботки:

1
/ blackfire-player。运行——端点= ' symfony var欧宝娱乐app下载地址:出口欧宝娱乐app下载地址SYMFONY_PROJECT_DEFAULT_ROUTE_URL .blackfire。yaml——变量"webmail_url= 欧宝娱乐app下载地址' symfony var:export MAILER_WEB_URL 2>/dev/null ' "——变量=“env = dev”vv
1
rm blackfire-player.phar

Или в п одак к ен н:

1
/ blackfire-player。Phar run——endpoint= '欧宝娱乐app下欧宝体育应用最新版app下载载地址 symfony cloud:env:url——pipe——primary ' .blackfire。yaml——变量“webmail_url =没有”——变量=“env =刺激”vv

Сценарии黑焰,такжемогутиспользоватьпрофилидлякаждогозапросаизапускатьтестыпроизводительности,еслидобавитьсоответствующийфлаг——黑焰

Автоматизация проверок п оиз з о одител ност

Отслеживаниепроизводительностипозволяетпонятьнетолькокакулучшитьпроизводительностьсуществующегокода,нотакжеиконтролироватьеёпадени,евызванноеновымиизменениями。

Написанныйвпредыдущемразделесценарийможетзапускатьсяавтоматическичерезнепрерывнуюинтеграциюилинарегулярнойосновевпродакшене。

На Platform.sh также возможнозапускатьсценарииприсозданииновойветкиилиразвёртываниивпродакшене,чтобыавтоматическипроверятьпроизводительностьновогокода。

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