Покажа како да се инсталира и конфигурира 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 е исклучително лесно. Стартувајте го инсталаторот, кликнете на копчето за да ја прифатите лиценцата и инсталацијата е завршена. Сега можете да ја извршите програмата и да отворите еден од дневниците за профилирање на кечегринд создаден од xdebug.

Со кликнување на часовникот или на иконата сигма, можете да се префрлате помеѓу прикажување информации во апсолутни вредности и проценти. Процентуалниот приказ покажува колку време, како процент од вкупното време, е потребно за да се повика функција во даден блок.
Две корисни поставки се Profiler -> Hide Fast Functions и Profiler -> Hide Library Functions. Првиот прекинувач ги крие функциите чиј временски придонес во целокупното време на извршување на програмата е незначителен.
Втората поставка, Profiler -> Hide Library Functions, ги крие функциите вградени во PHP од општата анализа. Кога двете од овие поставки се овозможени, гледате помалку податоци, што ви овозможува да се фокусирате на областите од вашиот код на кои им е потребна оптимизација.
Главниот прозорец содржи две јазичиња: линија по линија и Генерално. Двете јазичиња ги прикажуваат истите информации, но табулаторот „Општо земено“ ги собира информациите за подобра презентација. Self 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:

Овој блок од код работи два бара_онце, што е половина од времето потребно за извршување на 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, можете да го дебагирате вашиот код без да го менувате, да поставувате точки на прекин, да прескокнувате низ делови од кодот и да видите како и каде променливите ги менуваат вредностите.

Профилирањето на апликацијата е собирање податоци за брзината на извршување на различни програмски секции (датотеки и функции). Достапни се многу алатки за профилирање на PHP, но не сите алатки се погодни за вршење анализа директно на производствена локација.

XHProf и неговата вилушка Tideways е удобен и едноставен профилатор кој може ефективно да собира статистика за работата на апликацијата без речиси никакво намалување на брзината на вашата апликација (или вашата веб-локација).

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

Ако апликацијата почне да работи бавно (читајте „страницата почна да се забавува“), профилирањето ќе ви овозможи да откриете кој дел е најбавен. Резултатот од профилирањето е обично листа на извршени функции заедно со нивното време на извршување.

Профилирањето на кодот треба да биде на прво место во процесот на оптимизација на апликациите. Сè друго би било нагаѓање и најверојатно погрешно. Треба да знаете што точно предизвикува проблеми и „кочници“.

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

Токму за ова е развиено решението XHProf. Тој е дизајниран да работи на вистински веб-страници. Главната идеја на овој профилатор е да создаде минимално оптоварување на апликацијата, притоа собирајќи ги сите потребни податоци за брзината на работа. Решението е развиено од специјалисти од Facebook.

Како автоматски да го поврзете php профилерот?

Нашите специјалисти работеа напорно и го направија овој процес целосно автоматизиран.
Потребно е само да се најавите, да го изберете саканиот домен во табулаторот „Домени“, да кликнете на иконата „PHP.INI + PHP Profiler“ и да го овозможите полето за избор „Профил на домен“.

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

За php верзии 5.2, 5.3, 5.4, 5.5, 5.6, 7.0 го користиме профилерот XHProf, за php верзии 7.1 и повисоки го користиме профилерот Tideways.

Откако ќе биде овозможено, на секоја страница од вашата страница обработена од PHP, ќе биде вграден специјален блок со линкови до датотеката со извештај на дното од неа (врската ќе изгледа вака:

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

И еве како ќе изгледа датотеката со извештај:

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

  • Повици - број и процент на функциски повици
  • Вкл. Wall Time - време на извршување на функција со вгнездени функции
  • исклучено. Wall Time - време на извршување на функцијата без вгнездени функции
  • Вкл. Процесор - време на процесор со вгнездени функции
  • исклучено. Процесор - време на процесор без вгнездени функции
  • Вкл. MemUse - потрошувачка на меморија со вгнездени функции
  • исклучено. MemUse - потрошувачка на меморија без вгнездени функции
  • Вкл. PeakMemUse - максимална потрошувачка на меморија со вгнездени функции
  • исклучено. PeakMemUse - максимална потрошувачка на меморија без вгнездени функции

Треба да се напомене дека извештајот изграден со користење на плимата и осеката може да биде малку визуелно различен од овој извештај, но суштината не се менува.

Графички извештаи


Деловите од кодот кои бараат ресурси се означени со жолта (средна) и црвена (најтешка). Ова се оние делови од кодот што користат многу ресурси во однос на остатокот од програмата. Ова може да биде една бавна функција или многу повици до брза функција. Во нашиот пример, гледаме дека функцијата mysqli_multi_query() е означена со црвено бидејќи работи најбавно.

Збирни извештаи

Интерфејсот XHProf исто така ви овозможува да гледате збирни информации од повеќе извештаи одеднаш. За да го направите ова, run_id се пренесува одвоено со запирки:

Domain-name.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.

Написот делумно користеше материјали од корисникот Ден Голотиук објавени на веб-страницата

FirePHP е екстензија за firebug, која, заедно со својата мала php класа, ви овозможува да емитувате податоци од php, на пример, сите видови var_dump и други информации за дебагирање, на конзолата firebug. Главната предност на оваа екстензија е тоа што сите информации за дебагирање се емитуваат преку заглавија и не ги расфрлаат страниците и на ниту еден начин не ја нарушуваат логиката на апликацијата Официјална веб-страница: http://firephp.org/.

Главна идеа.

Општиот алгоритам за профилирање е како што следува:
  1. На почетокот на страницата овозможуваме профилирање со помош на xhprof_enable()
  2. На крајот на страницата, исклучете го профилирањето користејќи xhprof_disable() и зачувајте ги собраните податоци користејќи save_run()
  3. Следно, користејќи ја класата firephp php, пренесуваме врска до податоците за профилирање на клиентскиот дел
  4. Во конзолата firebug ги отвораме информациите што ни се потребни
  5. Се радуваме :)
Исто така, би сакал да кажам дека, се разбира, рачно додавање на овие функции на вашите PHP скрипти е одлично. Но, сакам овие информации секогаш да бидат при рака за време на развојот, а не да завршуваат на серверите за производство. Овој проблем го решаваме на следниов начин:

Во нашите проекти, во скоро сите скрипти, на почетокот е поврзана работна датотека со натоварувач на класа, функции за поврзување и други потребни работи. Затоа, вклучивме и профилирање во оваа датотека. И за да можеме да го вклучиме/исклучуваме режимот за дебагирање по желба, додадовме проверка за конфигурациската константа, плус ги завиткавме овие проверки во некои мета-ознаки кои автоматски се отстрануваат кога ќе се изгради проектот. Истото важи и за исклучување на профилирање и пишување информации на заглавија со помош на firephp - овие задачи се решаваат со една функција, која се повикува на крајот од секоја PHP скрипта и исто така е обвиткана во мета-тагови. Изгледа нешто вака:

// Следниве константи се запишани во конфигурациската датотека на апликацијата

/** Начин на работа на околината * */
define("APPLICATION_ENV" , "dev" ); // dev - дебагирање | про - производство
/** Патека до профилаторот */
define("XHPROF_ROOT" , __DIR__. „/ExtProcs/debug/xhprof-0.9.2“);

/***************************************************************************************
* Следно, во датотеката што е вчитана на почетокот на секоја скрипта, започнуваме профилирање
* DEV_START и DEV_END се нашите мета-ознаки, сè меѓу нив се отсекува за време на склопувањето
***************************************************************************************/

//-- DEV_START
//-- во режимот за отстранување грешки поврзуваме библиотеки за отстранување грешки

// Вчитај firephp
бара_еднаш(__DIR__ . "/includes/ExtProcs/debug/firephp/FirePHP.class.php");
//-- вчитај го профилот
"/xhprof_lib/utils/xhprof_lib.php");
бара_еднаш (XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// Иницијализирајте го профилирањето со потребните знаменца. Детален опис на знамињата
// може да се најде на php.net/manual/ru/xhprof.constants.php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
//-- DEV_END

// Па, оваа функција се повикува на крајот од секоја скрипта
// Неговиот повик е исто така завиткан во DEV_START и DEV_END

/**
* Направете линк до резултатот од профилирањето и прикажете го во конзолата
*/
функција dev_boot_Down() (
ако (APPLICATION_ENV === "dev") (
// Иницијализирајте ја инстанцата firephp
$firephp = FirePHP::getInstance(true);
// Исклучете го профилирањето и зачувајте податоци
$xhprof_data = xhprof_disable();
$xhprof_runs = нов XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testing" );
// Направете врска до податоците за профилирање и напишете ја во конзолата
$link = "http://" . $_SERVER[„HTTP_HOST“ ] . "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run=($run_id)&source=xhprof_testing\n";
$firephp->info($link, "податоци за профилирање" );
}
}


* Овој изворен код беше означен со Истакнувачот на изворниот код.

Нема да навлегувам во детали за инсталирање на овие екстензии, бидејќи сè е едноставно овде. Ќе кажам само за некои аспекти од поставувањето. xhproof има само една конфигурациска променлива - xhprof.output_dir, која укажува на папката каде што ќе се зачуваат податоците за профилирање. Затоа, проверете дали корисникот под кој се извршуваат PHP скриптите има права за запишување на наведениот директориум. Така напишете вакво нешто во вашиот php.ini:


продолжување=xhпроф.така
xhprof.output_dir="/var/tmp/xhprof"

Исто така, добра идеја е да инсталирате нешто како точка или Graphviz за да цртате графикони за повици. Имам Graphviz на MacOS X.

Откако ги завршивме постапките опишани погоре, во секое време можевме да отвориме и погледнеме во профилирањето на која било од нашите скрипти директно во прелистувачот.

Со текот на времето, секој PHP програмер се соочува со проблемот на слабите перформанси на неговата апликација. Може да биде дека одредена страница бавно се вчитува или одговорот од API трае премногу долго. И понекогаш е доста тешко да се разбере која е причината за сопирачките? Понекогаш се случуваат посложени ситуации: на серверот за производство, api-то е многу бавно, но на клупата каде што се развива развојот сè е во ред. И оди дознај што не е во ред. Дебагирањето на производствениот сервер е екстремен степен на безнадежност, до кој, се разбира, подобро е да не се води.

Токму за такви ситуации беа измислени специјални алатки наречени профили на апликации. Во светот на PHP, оваа улога ја игра xDebug, како и xhprof. xhprof е полесна, поедноставна и пофлексибилна алатка, па се претпочита неговата употреба. Интересно, xhprof беше развиен од Фејсбук уште во 2009 година, но сè уште нема официјална поддршка за php7 од нив и нема да има повеќе бидејќи Фејсбук се префрли на HHVM. Сепак, благодарение на широката заедница на развивачи на PHP, се појави вилушка која поддржува PHP7, чија инсталација не предизвикува никакви тешкотии.

Инсталација

Прво треба да инсталирате xhprof:

Git клон https://github.com/longxinH/xhprof xhprof cd xhprof/extension phpize ./configure --with-php-config=/usr/bin/php-config sudo make && sudo make install mkdir /var/tmp/ џпроф

Extension=xhprof.so xhprof.output_dir="/var/tmp/xhprof"

Папката /var/tmp/xhprof мора да има пристап за пишување, бидејќи резултатите од профилирањето ќе бидат зачувани таму.

Можете повторно да вчитате PHP-FPM и да проверите дали наставката е инсталирана. Тоа е банално, ова може да се направи со користење на излезот од функцијата phpinfo();

xhprof е инсталиран, можете да го користите. Пакетот xhprof вклучува многу лесен интерфејс за анализа на извештаи за профилирање. xhprof ви овозможува да креирате извештаи, и во текст и во графичка форма. Папката за инсталација xhprof содржи xhprof_html и xhprof_lib, кои ќе ни требаат. Папка xhprof_html - обезбедува пристап до GUI. xhprof_lib - библиотека за прикажување и анализа на код. Препорачливо е да ја преместите целата папка xhprof во /var/www/xhprof и да конфигурирате виртуелен хост за неа, на пример xhprof.loc. Пример за nginx:

Сервер ( слушај 80; име_сервер xhprof.loc; множество знаци utf-8; корен /var/www/xhprof/xhprof_html; индекс index.php; локација / ( try_files $uri $uri/ /index.php?q=$uri&$args .

Исто така, треба да запомните да ја ажурирате датотеката на домаќините. Сега, кога ќе ја внесеме URL-то xhprof.loc во прелистувачот, ќе бидеме однесени до веб-интерфејсот на профилот, каде што ќе бидат достапни датотеките генерирани од него.

Сега можете да продолжите директно со профилирање на кодот.

За да го овозможите профилерот, користете ја функцијата xhprof_enable(), која ги прифаќа следните знаменца како влез:

  • XHPROF_FLAGS_CPU - за снимање статистика на процесорот;
  • XHPROF_FLAGS_MEMORY - за меморија;
  • XHPROF_FLAGS_NO_BUILTINS - за игнорирање на вградените функции.

За да го исклучите профилот, користете ја функцијата xhprof_disable(). За погодност, ќе напишеме две скрипти header.php и footer.php кои ги извршуваат овие функции. header.php е вклучен на почетокот на профилираната скрипта, а footer.php - на крајот. footer.php е исто така одговорен за складирање на податоци за профилирање.

header.php: if (extension_loaded ("xhprof")) ( include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_runs.php"; xhprof_enable (XHPROF_FLAGS_CPU); ) footer.php: if (extension_loaded ("xhprof")) ( $profilerNamespace = "ИМЕ НА PROFILED_SCRIPT ТУКА"; $xhprofData = xhprof_disable(); fRuns->save_run ($xhprofData, $profilerNamespace);
Употреба

Откако ќе ги поврзете header.php и footer.php со профилираната скрипта, можете да започнете: при извршување на профилираната скрипта, ќе се генерира датотека што ќе биде зачувана во директориумот /var/tmp/xhprof, која содржи информации за работата на скрипта. Кога ќе го отворите веб-интерфејсот xhprof.loc, оваа генерирана датотека ќе биде достапна:


Кога отворате датотека за профилирање, се појавуваат детални информации за работата на апликацијата, целиот куп повици:


Што значат колоните:

  • Повици- број и процент на повици на функции;
  • Вкл. Ѕид време- време на извршување на функција со вгнездени функции;
  • исклучено. Ѕид време- време на извршување на функција без вгнездени функции;
  • Вкл. Процесорот- Време на процесорот со вгнездени функции;
  • исклучено. Процесорот- Време на процесорот без вгнездени функции;
  • Вкл. MemUse- потрошувачка на меморија со вгнездени функции;
  • исклучено. MemUse- потрошувачка на меморија без вгнездени функции;
  • Вкл. PeakMemUse- максимална потрошувачка на меморија со вгнездени функции;
  • исклучено. PeakMemUse- максимална потрошувачка на меморија без вгнездени функции.

Ако ја следите врската, ќе се прикаже прекрасно дрво за повици со визуелна индикација за најбавниот код. Ако ова не се случи, тогаш најверојатно треба да ја инсталирате библиотеката graphviz:

Apt-get инсталирај graphviz

Пример за конструиран график:

Во мојот случај, тесно грло е интеракцијата со базата на податоци.


Користење на xhprof на производствен сервер

Првично, xhprof беше развиен специјално за целите на профилирање на код во борба, на производствени сервери. Едноставно нема друга бесплатна и ефикасна алатка за профилирање на PHP7 код во борба, така што xhprof нема конкуренти. Поточно, имам искуство со користење на xhprof на продукциски сервер кој обработува милион барања дневно. Користи php7 и досега не се најдени никакви проблеми. Сепак, xhprof не се извршува за секое барање - тоа би генерирало премногу датотеки за профилирање. За мене, профилот започнува само ако барањето има заглавие „XHPROF_ENABLE“ и е поставено на точно. Можете исто така да користите друга стратегија, на пример, да го активирате профилерот по случаен избор со веројатност од, да речеме, 1/1000. Тогаш ќе има и прилично јасна слика.


Заклучок

Иако xhprof не е официјално поддржан за php7, тој сепак е неопходна алатка за развивач на php.

Профилирањето на апликацијата е собирање податоци за брзината на извршување на различни програмски секции (датотеки и функции). Достапни се многу алатки за профилирање на PHP, но не сите алатки се погодни за извршување на анализа директно во производството.

XHПроф- мега едноставен профилатор кој собира статистика директно додека апликацијата работи без речиси никакви трошоци.

Зошто профил?

Ако апликацијата почне да работи бавно, профилирањето може да ви помогне да откриете кој дел е бавен. Резултатот од профилирањето е обично листа на извршени функции и време на нивното извршување.

Профилирањето треба да се направи пред каква било оптимизација на апликацијата. Во спротивно, ќе бидете водени од претпоставки. Најверојатно неточно.

Проблем со Xdebug

Xdebug е моќно решение за PHP. Но, самата платформа Xdebug е толку тешка што ја не може да се користи на сајтови во живо. XDebug создава значително оптоварување на ресурсите на серверот и ја успорува апликацијата.

Од друга страна, проблемите на страницата во живо може да бидат сосема различни од оние во развојната средина. Профилирањето само на програмерските компјутери ќе покаже само дел од проблемите.

Затоа е развиено решението XHпроф. Наменет е за употреба при извршување на апликации. Главната идеја на овој профилатор е да создаде минимално оптоварување на апликацијата додека ги собира сите потребни податоци за брзината на работа. Решението е развиено од момците од Facebook и е поддржано од нови верзии на PHP.

XHПроф

Инсталација

На Debian XHprof е во sid пакети, така што: apt-get инсталирај xhprof

Можете исто така сами да изградите XHprof.

Овозможи профилирање

Да речеме дека имаме скрипта со следниов код:

изврши ();

Ајде да извршиме профилирање користејќи XHprof. За да го направите ова на оваа страница ви треба:

  1. Овозможете го профилот на самиот почеток.
  2. На самиот крај на програмата, запрете го профилот и зачувајте ги примените податоци.

Ќе изгледа вака:

# Иницијализирајте го профилаторотxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Извршете ја програмата откако ќе го вклучите профилеротизврши (); # Запрете го профилаторот по извршувањето на програмата$xhprof_data = xhprof_disable();

# Зачувајте го резултатот од профилирањето во променливата $xhprof_data

  • Функција xhprof_enable()ги зема знамињата како аргументи. XHPROF_FLAGS_CPU за снимање статистика на процесорот, XHPROF_FLAGS_MEMORY за меморија, XHPROF_FLAGS_NO_BUILTINS за игнорирање на вградените функции.
  • xhprof_disable()ќе го исклучи профилот и ќе ја врати собраната статистика.

Извештаи

Генерација

Собраните податоци може да се анализираат во интерфејсот XHprof за да се генерираат извештаи. За да го направите ова, треба да ги преземете изворите на XHprof: cd /var/www; wget http://pecl.php.net/get/xhprof-0.9.4.tgz gzip -d xhprof-0.9.4.tgz tar -xvf xhprof-0.9.4.tar

После ова, треба да направите промени во сценариото:

include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = нов XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "тест");

# Новиот код го зачувува извештајот за употреба во GUI

Интерфејс за извештаи

За да го видите извештајот, треба да го конфигурирате виртуелниот домаќин во папката /var/www/xhprof-0.9.4/xhprof_html. На пример, во Nginx:

Сервер (име на серверот xh..9.4/xhprof_html; индекс index.php; локација ~* \.(php)$ ( fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; вклучете fastcgi_params; fastcgi_param SCRIPTcu_mentcroot)script $in -с повторно вчитај

После ова, ќе се појави список со извештаи:

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

  • Повици — број и процент на функциски повици.
  • Вкл. Wall Time — време на извршување на функција со вгнездени функции.
  • исклучено. Wall Time е време на извршување на функција без вгнездени функции.
  • Вкл. Процесор - време на процесор со вгнездени функции.
  • исклучено. Процесор - време на процесор без вгнездени функции.
  • Вкл. MemUse - потрошувачка на меморија со вгнездени функции.
  • исклучено. MemUse - потрошувачка на меморија без вгнездени функции.
  • Вкл. PeakMemUse - максимална потрошувачка на меморија со вгнездени функции.
  • исклучено. PeakMemUse - максимална потрошувачка на меморија без вгнездени функции.

Графички извештаи

За да изградите графички извештај, проверете дали имате инсталирано graphviz: apt-get install graphviz

Деловите од кодот кои бараат ресурси се означени со жолта (средна) и црвена (најтешка). Ова се оние делови од кодот што користат многу ресурси во однос на остатокот од програмата. Ова може да биде една бавна функција или многу повици до брза функција. Во нашиот пример, функцијата str_replace()означен со црвено поради 262 повици.

Збирни извештаи

Интерфејсот XHprof исто така ви овозможува да гледате збирни информации од неколку извештаи одеднаш. За да го направите ова, run_id се пренесува одвоено со запирки: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&извор=тест

ТЛ; ДР

Користете XHprof за профилирање на PHP директно во производството.