Оптимизацияпроизводительности
Оптимизацияпроизводительности
Преждевременнаяоптимизация-кореньвсехзолвпрограммировании。
Возможновывстречалиэтуцитатуиранее,однакоялюблюцитироватьеёполностью:
Намследуетзабыватьонебольшойэффективности,например,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
$ob娱乐下载symfony服务器:停止$ob娱乐下载Symfony服务器:start -d
Дляхраненияпрофилейприложенийввашейучётнойзаписи,необходимонастроитьинструмент黑焰CLI,используявашиперсональныеклиентскиеучётныеданные。Найдите и в верхустраницы设置/凭证
ивыполнитеследующуюкоманду,предварительноподставивсвоиданныевсоответствующиеместа:
1
$Blackfire客户端:config——client-id=xxx——client-token=xxx
Установка Blackfire-а а ента в Docker
Службаагента黑焰уженастроенавстеке码头工人组成:
Длясоединенияссерверомвамнеобходимополучитьвашиперсональныесерверныеучётныеданные。Этиучётныеданныеуказывают,гдевыхотитехранитьпрофили,которыевыможетесоздатьдлякаждогопроекта。Их можно на а т ти и низ зстраницы设置/凭证
.Сохраните данн е локал но в ф - ал е.env.local
:
1 2 3 4
$ob娱乐下载Symfony控制台的秘密:集BLACKFIRE_SERVER_ID# xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx$ob娱乐下载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
$ob娱乐下载symfony服务器:停止$ob娱乐下载Symfony服务器:start -d
И след И т з за ло ам И:
1
$ob娱乐下载symfony服务器:日志
Запуститепрофилированиесноваипроверьтезаписилога。
Настройка黑火в п одак к ене
Поумолчанию黑焰добавленвовсепроектынаPlatform.sh。
Установите н е етн о анн ннсерверав ка а се стве секретов дл окружения生产:
1 2 3 4
$ob娱乐下载Symfony控制台的秘密:集BLACKFIRE_SERVER_ID - env =刺激# xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx$ob娱乐下载Symfony控制台的秘密:集BLACKFIRE_SERVER_TOKEN - env =刺激# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
PHPЗондужевключён,какилюбойдругойнеобходимыймодульPHP:
Настройка清漆дл работы с黑火
Передразвёртыванием,чтобыприступитькпрофилированию,вамнеобходимообойти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。ob娱乐下载
Дляполучениянаиболееполногопредставленияопроизводительностиприложениявпродакшен,евамтакженеобходимопрофилироватьокружениепродакшена(“产品”)。Поумолчаниювашелокальноеокружениеиспользуетсредуразработки(“发展”),чтовлечётзасобойсущественныенакладныерасходы(этопроисходитвосновномиз——засбораданныхдляотладочнойпанелииSymfony——профилировщика)。ob娱乐下载
请注意
Посколькумыбудемпрофилироватьокружение“生产”,вконфигурацииничегоменятьненужно,таккаквпредыдущейглавемывключилислойHTTP -кешаSymfonyтолькодлясреды“发展”。ob娱乐下载
ПереключитеокружениевашейлокальноймашинынаработувпродакшенепутёмизменениязначенияпеременнойокруженияAPP_ENV
вфайле.env.local
:
1
APP_ENV =刺激
Также вы можете испол зоват команд服务器:刺激
:
1
$ob娱乐下载symfony服务器:刺激
Незабудьтепереключитьсяобратнонаокружениеразработкипослезавершениясеансапрофилирования:
1
$ob娱乐下载Symfony服务器:prod -off
ПрофилированиеAPI——ресурсов
ПрофилированиеAPIилиSPAлучшевыполнятьвкоманднойстрокеспомощьюустановленногоранееинструмента黑焰CLI:
1
$Blackfire curl的sob娱乐下载ymfony var:出口ob娱乐下载SYMFONY_PROJECT_DEFAULT_ROUTE_URL被
Команда黑焰旋度
п о инимает т же аргументы и оп ии, т то и旋度.
Сравнениепроизводительности
Вшагепрокешированиедляповышенияпроизводительностимыдобавилислойкеширования,однакомынепроверили,каквнесённыеизмененияповлиялинапроизводительность。Таккакдовольносложноугадать,чтобудетработатьбыстрее,ачтомедленне,етоможнооказатьсявситуаци,икогдаиз——заоптимизациичего——либовашеприложениенасамомделестанеттолькомедленнее。
Спомощьюпрофилировщикавсегданеобходимоизмерятьвлияниекаждойсделаннойоптимизации。黑焰позволяетупроститьвизуальнуюоценкупроизводительностиблагодарявозможностисравнения.
Написаниефункциональныхтестовпопринципучёрногоящика
Мыужезнакомыстем,какписатьфункциональныетестыспомощьюSymfony。ob娱乐下载黑焰,всвоюочередь,можетбытьиспользовандлянаписаниябраузерныхсценариев,которыеможнозапускатьпожеланиюспомощьюприложения黑焰的球员.Давайтенапишемсценарий,которыйотправитновыйкомментарийипроверитегопоссылкевэлектроннойпочтевокружениидляразработки,атакжевадминистративнойпанеливпродакшене。
Создайтефайл.blackfire.yaml
со о следующим содержимым:
Загрузите黑焰球员длявыполнениясценарияналокальноймашине:
1 2 3
$curl -OLsS https://get.blackfire.io/blackfire-player.phar$Chmod +x blackfire-player.phar$cp /home/fabien/Code/github/blackfireio / blackfire.io /播放器/ blackfire-player。phar blackfire-player.phar
Запустите у тот с с с с и на а ии т в окружении а аз а аб ботки:
1
$/ blackfire-player。运行——端点= ' symfony varob娱乐下载:出口ob娱乐下载SYMFONY_PROJECT_DEFAULT_ROUTE_URL .blackfire。yaml——变量"webmail_url= ob娱乐下载' symfony var:export MAILER_WEB_URL 2>/dev/null ' "——变量=“env = dev”vv
1
$rm blackfire-player.phar
Или в п одак к ен н:
1
$/ blackfire-player。Phar run——endpoint= 'ob娱乐下载 sob直播appymfony cloud:env:url——pipe——primary ' .blackfire。yaml——变量“webmail_url =没有”——变量=“env =刺激”vv
Сценарии黑焰,такжемогутиспользоватьпрофилидлякаждогозапросаизапускатьтестыпроизводительности,еслидобавитьсоответствующийфлаг——黑焰
.
Автоматизация проверок п оиз з о одител ност
Отслеживаниепроизводительностипозволяетпонятьнетолькокакулучшитьпроизводительностьсуществующегокода,нотакжеиконтролироватьеёпадени,евызванноеновымиизменениями。
Написанныйвпредыдущемразделесценарийможетзапускатьсяавтоматическичерезнепрерывнуюинтеграциюилинарегулярнойосновевпродакшене。
На Platform.sh также возможнозапускатьсценарииприсозданииновойветкиилиразвёртываниивпродакшене,чтобыавтоматическипроверятьпроизводительностьновогокода。