Профилиране на php. Профилиране и отстраняване на грешки в PHP приложения с xhprof & FirePHP


Понякога ViewProfile.swf и други SWF системни грешки могат да бъдат свързани с проблеми в системния регистър на Windows. Няколко програми могат да използват файла ViewProfile.swf, но когато тези програми се деинсталират или модифицират, понякога остават „осиротели“ (неправилни) SWF записи в системния регистър.

По принцип това означава, че докато действителният път на файла може да се е променил, неправилното му предишно местоположение все още се записва в системния регистър на Windows. Когато Windows се опитва да търси тези неправилни препратки към файлове (местоположения на файлове на вашия компютър), може да възникнат грешки в ViewProfile.swf. Освен това инфекция със злонамерен софтуер може да е повредила записите в регистъра, свързани с Bioshock 2. Следователно тези повредени SWF записи в регистъра трябва да бъдат коригирани, за да се реши проблемът в основата.

Ръчното редактиране на системния регистър на Windows за премахване на невалидни ключове на ViewProfile.swf не се препоръчва, освен ако не сте специалист по обслужване на компютри. Грешки, допуснати при редактиране на регистъра, могат да направят вашия компютър неработещ и да причинят непоправими щети на вашата операционна система. Всъщност дори една запетая, поставена на грешното място, може да попречи на компютъра ви да се зареди!

Поради този риск силно препоръчваме да използвате доверен инструмент за почистване на регистър като WinThruster (разработен от Microsoft Gold Certified Partner), за да сканирате и поправите всякакви проблеми в регистъра, свързани с ViewProfile.swf. С помощта на инструмент за почистване на регистъра можете да автоматизирате процеса на намиране на повредени записи в регистъра, препратки към липсващи файлове (като този, причиняващ грешката ViewProfile.swf) и повредени връзки в регистъра. Преди всяко сканиране автоматично се създава резервно копие, което ви позволява да отмените всички промени с едно щракване и ви предпазва от евентуална повреда на вашия компютър. Най-добрата част е, че елиминирането на грешки в регистъра може драстично да подобри скоростта и производителността на системата.


Внимание:Освен ако не сте опитен потребител на компютър, НЕ препоръчваме ръчно редактиране на системния регистър на Windows. Неправилното използване на редактора на системния регистър може да причини сериозни проблеми, които може да изискват преинсталиране на Windows. Ние не гарантираме, че проблемите, произтичащи от неправилно използване на редактора на регистъра, могат да бъдат коригирани. Вие използвате редактора на системния регистър на свой собствен риск.

Преди да поправите ръчно регистъра на Windows, трябва да създадете резервно копие, като експортирате част от регистъра, свързан с ViewProfile.swf (напр. Bioshock 2):

  1. Кликнете върху бутона Започнете.
  2. Въведете " команда" В лента за търсене... ОЩЕ НЕ КЛИКАЙТЕ ENTER!
  3. Докато държите натиснати клавишите CTRL-Shiftна клавиатурата натиснете ENTER.
  4. Ще се покаже диалогов прозорец за достъп.
  5. Кликнете да.
  6. Черната кутия се отваря с мигащ курсор.
  7. Въведете " regedit" и натиснете ENTER.
  8. В редактора на системния регистър изберете свързания с ViewProfile.swf ключ (напр. Bioshock 2), който искате да архивирате.
  9. В менюто Файлизберете Експортиране.
  10. В списъка Запази вИзберете папката, в която искате да запишете резервния ключ на Bioshock 2.
  11. В полето Име на файлВъведете име за архивния файл, например „Bioshock 2 backup“.
  12. Уверете се, че полето Експортна гамаизбрана стойност Избран клон.
  13. Кликнете Запазване.
  14. Файлът ще бъде записан с разширение .рег.
  15. Вече имате резервно копие на вашия запис в регистъра, свързан с ViewProfile.swf.

Следните стъпки за ръчно редактиране на системния регистър няма да бъдат описани в тази статия, тъй като има вероятност да повредят вашата система. Ако желаете повече информация относно ръчното редактиране на регистъра, моля, разгледайте връзките по-долу.

Профилирането на приложението е събирането на данни за скоростта на изпълнение на различни програмни секции (файлове и функции). Има много налични инструменти за профилиране на PHP, но не всички инструменти са подходящи за извършване на анализ директно на производствен сайт.

XHProf и неговият разклонител Tideways е удобен и прост профилиращ инструмент, който може ефективно да събира статистически данни за работата на приложение без почти никакво намаляване на скоростта на вашето приложение (или вашия уебсайт).

Защо код на профил?

Ако приложението започне да работи бавно (прочетете „сайтът започна да се забавя“), профилирането ще ви позволи да разберете коя част е най-бавна. Резултатът от профилирането обикновено е списък с изпълнени функции заедно с времето за тяхното изпълнение.

Профилирането на код трябва да е на първо място в процеса на оптимизиране на приложението. Всичко друго би било догадки и най-вероятно грешно. Трябва да знаете какво точно причинява проблеми и „спирачки“.

Профилирането е процедура за събиране и организиране на статистика за времето за изпълнение на кода. Това не е процес на оптимизация или модификация на програмата. Резултатът от този процес обикновено е разширен отчет за компонентите на програмата и статистически данни за ефективността на функциите.

Точно за това е разработено решението XHProf. Той е проектиран да работи на реални уебсайтове. Основната идея на този профайлър е да създаде минимално натоварване на приложението, като същевременно събира всички необходими данни за скоростта на работа. Решението е разработено от специалисти от Facebook.

Как да свържа автоматично php profiler?

Нашите специалисти се потрудиха и направиха този процес напълно автоматизиран.
Трябва само да влезете, да изберете желания домейн в раздела „Домейни“, да кликнете върху иконата „PHP.INI + PHP Profiler“ и да поставите отметка в квадратчето „Domain Profiler“.

Активирането на тази функция може да отнеме известно време, обикновено не повече от 10 минути.

За php версии 5.2, 5.3, 5.4, 5.5, 5.6, 7.0 използваме XHProf Profiler, за php версии 7.1 и по-нови използваме Tideways Profiler.

След като бъде разрешено, на всяка страница от вашия сайт, обработвана от PHP, в долната част ще бъде вграден специален блок с връзки към файла с отчета (връзката ще изглежда по следния начин:

Domain-name.com/xhprof-master/xhprof_html/index.php?run=XXXXXXXXXXXX&source=someapp)

И ето как ще изглежда отчетният файл:

Таблицата съдържа списък с функции, които са били изпълнени в рамките на една страница с допълнителна информация:

  • Обаждания - брой и процент извиквания на функции
  • вкл. Wall Time - време за изпълнение на функция с вложени функции
  • Изкл. Wall Time - време за изпълнение на функция без вложени функции
  • вкл. CPU - процесорно време с вложени функции
  • Изкл. CPU - процесорно време без вложени функции
  • вкл. MemUse - потребление на памет с вложени функции
  • Изкл. MemUse - консумация на памет без вложени функции
  • вкл. PeakMemUse - максимална консумация на памет с вложени функции
  • Изкл. PeakMemUse - максимална консумация на памет без вложени функции

Трябва да се отбележи, че отчетът, изграден с помощта на tideways, може да е малко визуално различен от този отчет, но същността не се променя.

Графични отчети


Ресурсно интензивните секции от кода са маркирани в жълто (средно) и червено (най-тежко). Това са онези части от кода, които използват много ресурси спрямо останалата част от програмата. Това може да е една бавна функция или много извиквания към бърза функция. В нашия пример виждаме, че функцията mysqli_multi_query() е маркирана в червено, защото работи най-бавно.

Обобщени отчети

Интерфейсът XHProf също ви позволява да преглеждате обобщена информация от множество отчети наведнъж. За да направите това, run_id се предава, разделени със запетаи:

Име-на-домейн.com/xhprof-master/xhprof_html/index.php?run=XXXXXXXXXXXX,YYYYYYYYYYY&source=someapp

Технически характеристики

    Автоматичното включване на профайлъра се реализира с помощта на директивите auto_append_file и auto_prepend_file, които свързват два изпълними php файла:

    — auto_append_file инициализира обекта за събиране на статистически данни и започва неговата работа;

    — auto_prepend_file завършва събирането на статистика и генерира отчетен файл със статистика (във формат JSON);

    Ако exit() или die() се извикат, докато вашият скрипт работи, auto_prepend_file няма да бъде изпълнен. статистически файл няма да бъде генерирани блок с връзки към файла с отчета няма да бъде включен в долната част на страницата.

  1. По този начин достъпът до която и да е страница, обработена от php, ще задейства създаването на нов файл с отчет, така че препоръчваме да деактивирате профилиращия след събиране на статистически данни (обикновено няколко часа), за да избегнете препълване на дисковата квота, която може да бъде изчерпана след генериране на голям брой доклади!
  2. Важно: Профайлърът ще работи само ако сайтът е прикачен към сървъра по стандартен път, чрез автоматични средства (тоест, използвайки контролния панел на хостинга), в противен случай трябва да се свържете с техническата поддръжка на Hostland, за да конфигурирате профайлъра.
  3. В автоматичен режим профилиращият се свързва само с името на основния домейн; профилиращият не се свързва автоматично с поддомейни.
  4. В автоматичен режим профилиращият събира статистика само за скриптове с разширение .php и .php5
  5. Не е възможно да се гарантира непрекъсната работа на сайта след свързване на PHP профайлъра, следователно, ако сайтът не работи правилно, докато профайлърът е активиран, той трябва да бъде деактивиран и профилирането да продължи по друг начин.

Нека обобщим

Надяваме се, че този инструмент ще ви помогне да направите сайтовете си още по-бързи на хостинг Hostland.

В статията са използвани частично материали от потребителя Den Golotyuk, публикувани на уебсайта

Балакат Обсеслав. суф. получен от балака“бърборещи(и)”, образувани от своя страна с помощта на суф. -ak(a)от “разговор, бърборене” (от същата основа, но със съф. -л-, като , см.). Думи , топки(мн.ч.) “разговор, бърборене” в диалектите и др.слав. език са известни и днес. См. .

Училищен етимологичен речник на руския език. Произход на думите. - М.: Дропла. Н. М. Шански, Т. А. Боброва. 2004 .

Вижте какво е „балакат“ в други речници:

    бърборене- говорене, чат, драскане (Dal) Вижте... Речник на синонимите

    СТЪБЛО- БАЛКАК, аз дрънкам, ти дрънкаш, недорасъл. (регион). Чат, говори. Обяснителен речник на Ушаков. Д.Н. Ушаков. 1935 1940 ... Обяснителен речник на Ушаков

    СТЪБЛО- юг бърборене Perm. говорене, чат, говорене, драскане. Балаканя ср. бърборене. Балакуша, балъка об., южен, баляка перм., балакар, бърборещ, бъбривец. Балакар, бъди шут, шегувай се като официални шутове. Балакир мъжки, долен, казахски,... ... Обяснителен речник на Дал

    бърборене- чат, говори глупости, украински. Балакати, бл. Балакат, полски baɫakac. Да бърборя или бърборя; виж Bernecker 1, 40; Ми. EW 5. Друго ниво на редуване на гласни: украински. опитайте се да мърморите, полски. beɫknąc – същ., чех. blknouti; ср Шахматов, ... ... Етимологичен речник на руския език от Макс Васмер

    Балакат- Несов. прев. и непрекъснато. разграждане Говорете, чатете. Обяснителен речник на Ефрем. Т. Ф. Ефремова. 2000... Съвременен тълковен речник на руския език от Ефремова

    бърборене- балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка, балъка,... , Форми на думите

Той показа как да инсталирате и конфигурирате xdebug и обхвана някои основни функции, като подобряване на изхода на функцията var_dump() или отпечатване на проследяване на стека на повикванията при получаване на съобщение за грешка. Във втората част разгледахме тази функция на xdebug като проследяване. Проследяването съдържа всички извиквания на функции и методи в програмата, време за стартиране, по избор размер на паметта, предадени и върнати параметри. Журналът за проследяване може да ви помогне да разберете пътя на изпълнение на сложна програма. Вместо да вмъквате код за отстраняване на грешки в програмата, вие включвате или изключвате проследяването, където е необходимо, и след това използвате помощни програми като grep или ваши собствени PHP приложения, за да анализирате лог файла.

В тази статия ще разгледаме профилирането. На пръв поглед профилирането е подобно на трасирането. Профилиращият дневник не е предназначен за хора, не е предназначен да визуализира потока на програма, но ни предоставя данни за статистически анализ на работеща програма.

Създаване на профилиращ дневник

По-долу е даден кратък откъс от регистрационния файл за профилиране, генериран от xdebug:

fl=php:вътрешен
fn=php::define
106 3

Fl=C:\www\drupal\includes\bootstrap.inc
fn=require_once::C:\www\drupal\includes\bootstrap.inc
1 648
cfn=php::define
обаждания=1 0 0
13 6
cfn=php::define
обаждания=1 0 0
18 4
cfn=php::define
обаждания=1 0 0
23 2


Както можете да видите, регистрационният файл за профилиране не може да се чете директно. Ще използваме допълнителни инструменти за визуализиране и анализ на получените данни. И така, профилирането показва колко пъти е стартирана определена линия и колко време е отнело стартирането.
Създаването на регистрационен файл за профилиране значително влошава производителността, подобно на създаването на журнал за проследяване, тъй като трябва да опишете преминаването на всеки ред. Следователно, точно както в случая с проследяването, не стартирайте профилиране на производствени сървъри... Въпреки това, има случаи, когато профилирането трябва да се стартира на активна система. В този случай внимавайте да изпълнявате xdebug едновременно с други разширения на Zend, като зареждащи устройства, оптимизатори или кешове.
За да може xdebug да започне да записва регистрационни файлове за профилиране, добавете

Моля, обърнете внимание, че не можете да стартирате профилиране по време на стартиране чрез изпълнение на команда.
Тъй като регистрационният файл за профилиране е предназначен за четене от програми за анализатор, няма допълнителни настройки, които ви позволяват да показвате допълнителна информация, какъвто е случаят с регистрационния файл за проследяване. Има обаче някои настройки, които ви позволяват да конфигурирате профилиране, подобни на тези, които използвахме при настройването на проследяването.
Първо, xdebug записва журнала за профилиране в директорията /tmp по подразбиране. Ако използвате Windows, трябва да коригирате php.ini, както следва:
xdebug.profiler_output_dir="c:\traces"

По подразбиране xdebug презаписва съществуващия регистрационен файл за профилиране. Можете да го конфигурирате да допълва съществуващия, като добавите следната команда

в php.ini. Има случаи, в които не искате да създавате регистрационен файл за профилиране за всички файлове, но в същото време активирането на профилиране по време на изпълнение е проблематично. Вместо периодично да включвате и изключвате профилирането, добавете командата
xdebug.profiler_enable_trigger=Вкл

в php.ini. Сега можете да включвате и изключвате профилирането, като подадете специален GET или POST параметър XDEBUG_PROFILE към PHP скрипт. Това ще позволи профилиране само за този PHP скрипт. Не е необходимо да задавате стойността на този параметър, просто не забравяйте да добавите този параметър към адреса test.php?XDEBUG_PROFILE.

Име на регистрационния файл за профилиране

Името, което xdebug присвоява на регистрационния файл за профилиране по подразбиране, е „cachegrind.out“. плюс идентификатор на процеса. Точно както в случая с журнала за проследяване, можете да промените имената на журнала, като добавите съответните настройки към php.ini. Име на параметър xdebug.profiler_output_name. Аргументът е низ. които могат да съдържат различни модификатори. Най-важните са по-долу:

  • %p – идентификатор на процеса
  • %r – произволно число
  • %u - време
  • %H – стойност на $_SERVER["HTTP_HOST"]
  • %R – стойност на $_SERVER["REQUEST_URI"]
  • %s – име, включително пълен път, наклонените черти се преобразуват в долни черти
Моля, обърнете внимание, че модификаторът %s се използва само за xdebug.profiler_output_name. Ако искате да знаете името на регистрационния файл за профилиране, можете да извикате функцията xdebug_get_profiler_filename().

Профилиране на лог анализ
Както бе споменато по-горе, за анализ на дневника за профилиране са необходими допълнителни програми за визуализация на данни. Всички регистрационни файлове за профилиране, които xdebug създава, са във формат, подобен на формата Cachegrind. Cachegrind е програма за профилиране, която е част от по-мощна програма, наречена Valgrind, софтуерна програма за отстраняване на грешки и профилиране за Linux. Cachegrind е проектиран да анализира статистиката на кеш паметта, използването на паметта и програмните команди. Друг инструмент на Valgrind, Callgrind, рисува графики на обажданията. Що се отнася до PHP, можем да използваме това приложение, за да визуализираме и анализираме регистрационния файл за профилиране.
Инструментът, който обикновено се използва за анализ на регистрационния файл за профилиране, генериран от xdebug, се нарича. KCachegrind е безплатен софтуер, лицензиран под GPL (работи само на Unix системи). Има обаче проста програма за Windows, която също е безплатна. Нека първо да разгледаме версията на Windows.

WinCacheGrind: анализ на регистрационни файлове за профилиране в Windows

Текущата версия (към момента на писане от автора на тази статия) на WinCachegrind е 1.0.0.12. Тази версия датира от 2005 г., което означава, че WinCachegrind не е разработван от дълго време. Ако погледнете бележките към изданието, авторите пишат, че програмата има грешки, които понякога я карат да се държи странно.
Затова препоръчвам да използвате KCachegrind, стартиран на базата на виртуална машина на най-новата дистрибуция на Linux, например Ubuntu (бележка на преводача, най-общо казано, странна препоръка; в този случай бих препоръчал просто да инсталирате Linux, а не да се ограничавате градината на виртуалните машини). Има огромен брой виртуални машини, налични под Windows. Ако не е възможно да използвате Unix или виртуална машина по някаква причина, можете да продължите да използвате WinCachegrind за прост анализ на регистрационни файлове за профилиране. WinCachegrind не рисува графики на повикванията, за разлика от KCachegrind.
Инсталирането на Wincachegrind е изключително лесно. Стартирайте инсталатора, щракнете върху бутона за приемане на лиценза и инсталацията е завършена. Сега можете да стартирате програмата и да отворите един от регистрационните файлове за профилиране на cachegrind, създаден от xdebug.

Като щракнете върху часовника или иконата на сигма, можете да превключвате между показване на информация в абсолютни стойности и проценти. Процентният дисплей показва колко време, като процент от общото време, е необходимо за извикване на функция в даден блок.
Две полезни настройки са Profiler -> Hide Fast Functions и Profiler -> Hide Library Functions. Първият ключ крие функции, чийто времеви принос към общото време за изпълнение на програмата е незначителен.
Втората настройка, Profiler -> Hide Library Functions, скрива функциите, вградени в PHP, от общия анализ. Когато и двете настройки са активирани, виждате по-малко данни, което ви позволява да се съсредоточите върху области от вашия код, които се нуждаят от оптимизация.
Основният прозорец съдържа два раздела: Ред по ред и Общо. И двата раздела показват една и съща информация, но разделът Общо обобщава информацията за по-добро представяне. Self time показва времето на изпълнение на кода в текущия блок, докато Cumulative time (Cum.) показва общото време на изпълнение на функциите в дадения блок.

KCacheGrind: анализ на регистрационни файлове за профилиране в Unix

Unix версията на KCachegrind предоставя повече функционалност от WinCachegrind. KCachegrind визуализира данните и изгражда графика на повикванията.
За да започнете да го използвате, трябва да инсталирате KCachegrind. Сегашна версия . Налична е по-нова версия (0.10.1), но тя е част от пакета Valgrind.
Ако е възможно, използвайте мениджър на пакети, за да инсталирате пакета KCachegrind. KCachegrind използва GraphViz за изчертаване на графики на повикванията, така че вие ​​също трябва да инсталирате пакета GraphViz, ако вашият мениджър на пакети не инсталира автоматично зависими пакети.
Ако не намерите двоичния пакет KCachegrind, ще трябва сами да компилирате KCachegrind. След като изтеглите източниците, стартирайте

./configure --prefix=/opt/kde3
направи
направете инсталиране

Както можете да забележите, трябва да посочите пътя до текущата инсталация на библиотеката на KDE. Ако не знаете къде се намират KDE библиотеките във вашата система, използвайте

за показване на пътя до библиотеките на KDE.
Веднъж инсталиран, можете да стартирате KCacheGrind от командния ред

Табличното показване на данни в KCachegrind е много подобно на WinCachegrind. Можете също да превключвате между абсолютни и процентни стойности. Някои функции на KCachegrind не са проектирани за PHP. Картината по-долу показва графиката на повикванията на програмата phpMyAdmin:


Както можете да видите, по-голямата част от времето за стартиране беше прекарано в common.inc.php. Следната екранна снимка показва визуализация на извиквания на функции в common.inc.php:

Този блок от код изпълнява две require_onces, което е половината от времето, необходимо за изпълнение на common.inc.php. Двойното щракване върху произволен правоъгълник ще ви отведе по-дълбоко в анализа на данните.

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

Винаги профилирайте вашите приложения преди оптимизиране. Можете сами да започнете оптимизация, на мястото, където ви се струва, че тази оптимизация ще доведе до ефект, но това не винаги е вярно. Оптимизацията има ефект главно само в онези части, които отнемат най-много време в процеса на изпълнение.
Ако изпълнявате много копия на програма едновременно, все пак може да се наложи да оптимизирате частта от програмата, която заема по-голямата част от времето за изпълнение. В този случай оптимизацията няма да направи обслужването на една отделна заявка по-бързо, но ще позволи на вашия сървър да се справи с големи натоварвания, като същевременно изразходва по-малко ресурси за обслужване на тези заявки.
Когато разглеждате продължителността на изпълнение на профайлъра, имайте предвид, че абсолютните стойности са по-малко важни от относителните стойности. Измерени на различни системи, абсолютните стойности могат да варират. Въпреки това, преди да започнете да оптимизирате кода си, помислете за следните неща.
Важно правило при оптимизацията е да се намали броят на I/O операциите. Някои I/O операции отнемат много време в сравнение с изчисленията. Намаляването на такива операции може да бъде много ефективен начин за ускоряване на вашата програма. Премахването на едно I/O повикване може да осигури по-ефективно подобрение, отколкото прекарването на много часове в оптимизиране на кода. Следователно, трябва първо да се съсредоточите върху I/O операциите, преди да започнете да кодирате.
Можете също да увеличите броя на вашите сървъри, преди да оптимизирате. Можете да закупите огромен, който ще ви даде малко увеличение на производителността. Времето за разработка е по-скъпо от цената на нов сървър. И ако увеличите количеството хардуер, можете да сте сигурни, че ще получите увеличението незабавно, без никакво въздействие върху PHP кода. Когато един разработчик прекара един или два дни в оптимизиране на кода, никога не можете да кажете колко ще се увеличи продуктивността. И в крайна сметка вече не можете да сте сигурни, че оптимизацията няма да доведе до грешки.
Преобразуването на някои страници в статични е един от начините за постигане на по-добра производителност. Да приемем, че има сайт с много трафик, където PHP скрипт създава първата страница за всяка заявка, като избира информация от база данни или XML файл. Ако данните на дадена страница се променят достатъчно често, можете да създадете отново нейно статично копие. Ако преобразуването в статичен изглед не е възможно за дадена страница (някаква лична информация се показва на страницата), можете да конвертирате някои блокове в статичен изглед.
Друго ниво на оптимизация не изисква промяна на PHP кода. Както знаем PHP е интерпретиран език. Това означава, че неговите команди се превеждат по време на изпълнение в междинен код. Излъчването се повтаря при всяко изпълнение на скрипта. Това прави PHP по-бавен в сравнение с езици като C или Java, които не изискват парсване на кода всеки път, когато го стартирате. За PHP можете да използвате кешове за междинно представяне (вижте моя превод....), за да запазите и използвате повторно междинния код, това прави стартирането и изпълнението по-бързо.
Всичко това не означава, че не е моментът или мястото за оптимизиране на PHP кода. Някои оптимизации на кода могат значително да подобрят производителността. Все пак винаги помнете, че промяната на кода винаги носи риск от въвеждане на допълнителни грешки и проблеми със сигурността. Също така не забравяйте, че оптимизирането на вашия код го прави по-малко четлив.

Заключение

Създаването и визуализирането на профилиращ лог е едно от важните условия за оптимизиране на PHP кода. Трябва да знаете кои места в програмата отнемат най-много време и оттам трябва да започнете да оптимизирате.
В следващата статия ще разгледаме отстраняването на грешки с помощта на xdebug. xdebug може да ви предостави възможност за отдалечено отстраняване на грешки. Използвайки клиент, който има тази възможност, като Eclipse PDT, можете да дебъгвате вашия код, без да го променяте, да задавате точки на прекъсване, да прескачате през секции от код и да видите как и къде променливите променят стойностите.

Последна актуализация: 12.01.2019 г

Публикуване: 01/09/2016


Използвайки PhpStorm, можете да анализирате ефективността на вашия PHP код, като го профилирате. Профилирането ще ви позволи да събирате статистически данни за изпълнението на програмата: имената на изпълнените функции, колко пъти е била изпълнена всяка функция, времето за изпълнение на всяка функция, какви други функции са били извикани във всяка функция и т.н.

Тази информация може да ви подскаже къде вашият код може да бъде подобрен.

Нека да видим как работи.

1. Предпоставки

PhpStorm IDE може да използва информация за профилиране, събрана с помощта на инструмента Xdebug. Това разширение трябва да бъде инсталирано и конфигурирано във вашата система. За повече информация вижте Ръководството за инсталиране на Xdebug.

Ако сте потребител на прекрасната преносима сървърна платформа и софтуерна среда Open Server, тогава не е необходимо да правите нищо - разширението Xdebug вече е инсталирано и свързано.

внимание

Xdebug не е съвместим с IonCube. IonCube е инструмент (помощни програми) за защита на софтуер, написан на езика за програмиране PHP. Деактивирайте напълно разширението IonCube или докато използвате Xdebug. Друг възможен проблем може да бъде, че Xdebug е конфигуриран по подразбиране на порт 9000, който е същият порт, използван от Open Server. За да разрешите този проблем, в един от случаите трябва да промените номера на порта.

Всички действия, описани тук, бяха възпроизведени с правилните очаквани резултати при следната технологична среда:

2. Активиране на Xdebug Profiler

Профилирането добавя малко допълнителни разходи към работата на приложението и генерира огромно количество дискова информация. Ето защо е най-добре да активирате Xdebug Profiler само когато е необходимо и да го деактивирате при нормални обстоятелства.

Xdebug се конфигурира чрез директиви в активния файл php.ini. Всеки път, когато активирате профайлъра, трябва да конфигурирате следната директива:

xdebug.profiler_output_dir = /path/to/store/snapshots

Стойността на директивата трябва да указва пътя, който ще се използва за запазване на файловете за профилиране.

2.1. В световен мащаб

За да активирате Xdebug Profiler глобално, трябва да използвате следната директива:

xdebug.profiler_enable = 1

По този начин профилирането ще се извършва всеки път, когато се изпълнява скрипт. Удобно е да използвате тази опция за активиране на профайлъра само в редки случаи.

2.2. Използване на допълнителни опции за преводач

Можете да активирате профилиращия, като използвате допълнителни параметри на интерпретатора в прозореца Run/Debug Configurations. За да го отворите, използвайте следните елементи в главното меню на IDE:

Опцията (маркирана с червен контур на екранната снимка по-горе) Опции на интерпретатора (опции на интерпретатора) Раздел Команден ред (команден ред) трябва да съдържа следния ред:

D xdebug.profiler_enable = 1

Тази опция ще ви позволи да използвате профилиращия за конкретна конфигурация, а не в глобален мащаб.

2.3. Използване на специални GET/POST параметри или cookie файл

За по-контролирано профилиране трябва да се използва следната директива:

xdebug.profiler_enable_trigger = 1

Ако стойността на директивата е зададена на 1, тогава при изпълнение на скрипт с параметър GET/POST или бисквитка с име XDEBUG_PROFILE, профилирането ще се извърши независимо от настройката xdebug.profiler_enable.

Тази опция за активиране на профайлъра е най-популярната.

3. Събиране на трупи за профилиране

За да можете да анализирате регистрационните файлове за профилиране, те първо трябва да бъдат събрани.

3.1. Колекция от регистрационни файлове за профилиране за уеб приложения

За да профилирате уеб приложения, използвайте Xdebug профильора глобално или го стартирайте и спирайте при поискване. След като включите профайлъра, отворете приложението в браузъра, за да започнете да събирате данни - профилиращи регистрационни файлове.

Когато анализирате проблеми с производителността, използването на отметки или разширения на браузъра за отстраняване на грешки е много добър подход, тъй като ви позволява да навигирате в приложението и да стартирате профилиращия само когато бъде открит проблем с производителността. Това ви позволява да събирате целеви регистрационни файлове за профилиране.

3.2. Колекция от регистрационни файлове за профилиране за CLI приложения и модулни тестове

За да профилирате CLI приложения и модулни тестове, използвайте Xdebug профильора глобално или създайте отделна конфигурация за изпълнение, за да активирате профилиращия с помощта на прозореца Run/Debug Configurations. След това изпълнете CLI приложението или модулните тестове, за да съберете данни за профилиране.

Когато анализирате проблеми с производителността в модулни тестове, добър подход е да създадете отделна конфигурация, която да изпълнява само онези модулни тестове, за които се подозира, че имат проблеми с производителността. Това ви позволява да събирате целеви регистрационни файлове за профилиране.

4. Анализ на описанието на профилиращия дневник

Нека разгледаме по-отблизо дневника за профилиране.

4.1. Отваряне на дневника за профилиране

За да отворите регистрационния файл за профилиране, използвайте следните елементи в главното меню на IDE: .

Ако сте потребител на прекрасната преносима сървърна платформа Open Server, тогава можете също да използвате инструмента за различни платформи Webgrind, за да видите дневника за профилиране. Може да бъде намерен чрез следните елементи от главното меню на Open Server [Разширени → PHP профилиране].

Профилиращите регистрационни файлове се записват в папка според конфигурираната директива xdebug.profiler_output_dir. Името на генерирания файл винаги започва с cachegrind.out. и завършва или с PHP или идентификатора на процес на уеб сървър, или с crc32 хеша на директорията, в която се намира профилираният скрипт.


4.2. Раздел Статистика на изпълнението

В раздела Статистика на изпълнението можете да разгледате обобщена информация за показателите за изпълнение на всяка извикана функция. Можете да видите всички файлове, извиквания на функции, колко пъти са били извикани и времето за изпълнение (абсолютно и относително) на всяка функция.

Горната мрежа показва различни показатели:

  • Собствено време - количеството време, което една функция изразходва за изпълнение на своя код (без да се вземат предвид извикванията към други функции).

Долната мрежа показва два раздела: Callees - функциите, които скриптът извиква тук и Callers - откъдето е извикан скриптът. Тук можете да видите различни показатели:

  • Време - общо време за изпълнение.
  • Обаждания - брой обаждания.

Функциите с дълго време за изпълнение или голям брой извиквания със сигурност изискват тестване.

4.3. Раздел "Дърво на повикванията".

Разделът Дърво на повикванията показва пътищата за изпълнение на вашия код. Тук можете да видите по-подробна информация за времето за изпълнение на всяка функция и т.н.

Горната мрежа показва дървета на повикванията (кои функции се извикват в други функции) и други показатели:

  • Callable (наричан файл) - файлът, който е бил изпълнен.
  • Време - общо време за изпълнение.
  • Обаждания - брой обаждания.

Долната мрежа показва два раздела: Callees - функции, които се извикват тук и Callers - откъде се извиква функцията. Тук можете да видите различни показатели:

  • Извикваема (извикана функция) - функция, която е била изпълнена.
  • Време - общо време за изпълнение.
  • Обаждания - брой обаждания.

Контролни въпроси

  1. Защо PHP приложенията са профилирани?
  2. Колко основни начина има за активиране на Xdebug Profiler?
  3. Кой е най-добрият начин да продължите, когато профилирате CLI приложения и тестове на единици?
  4. Какви инструменти могат да се използват за анализиране на регистрационни файлове за профилиране?
  5. Когато анализирате дневник за профилиране, на кои показатели трябва да обърнете внимание първо?

Публикации по темата