Xhprof va FirePHP yordamida PHP ilovalarini profillash va disk raskadrovka qilish. PHP ilovalarini PhpStorm va Xdebug Profiling php bilan profillash

10.08.2022

PHP kodini profillash

Ertami-kechmi, har birimiz eski kod va uni optimallashtirish bilan duch kelamiz. Bunday vaziyatda tuzatuvchi va profil yaratuvchi dasturchining eng yaxshi yordamchilari hisoblanadi. PHP bilan ishlaydiganlar, Derik Retansga rahmat yaxshi vosita- xDebug. Hatto RuNet-da xDebug haqida juda ko'p ma'lumotlar mavjud, shuning uchun bu maqola bu haqda bo'lmaydi.

PHP uchun profillovchi haqida gap ketganda, men darhol xDebug haqida o'yladim (men Zendning xususiy vositalarini allaqachon unutgan edim), lekin bu safar men xato qildim - biz XHProf haqida gaplashamiz.
XHProf

Bu profiler Facebook uchun maxsus ishlab chiqilgan, va manba kodi 2009 yil mart oyida ochilgan.

O'rnatish juda tez va muammosiz o'tdi.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/kengaytma/
phpize
./configure && make && make install
cd /usr/local/etc/php.d/
vim xhprof.ini
cd /usr/local/
vim header.php
vimfooter.php
vim etc/php.ini
/etc/init.d/php-fpm qayta ishga tushiring
cp vhost.conf.template prof.my.conf
sed -i s/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx-ni qayta ishga tushiring

Keling, aytib o'tilgan konfiguratsiyalarni tahlil qilaylik

Xhprof.ini
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so
xhprof.output_dir="/home/max/www/profile/"

Prof.my.conf - Nginx konfiguratsiyasi - eng standarti.

Server (
tinglash 80;
server_name prof.my;
charset utf8;

Ildiz /usr/local/src/xhprof-0.9.2/xhprof_html ;
Manzil/(
indeks index.php;
}

Manzil ~ \.php$ (
fastcgi_pass 127.0.0.1:12000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
fastcgi_params o'z ichiga oladi;

/usr/local/src/xhprof-0.9.2/xhprof_html da profil yaratuvchi uchun yaxshi WEBGUI yaratadigan PHP manbalari mavjud.

Shunday qilib, ikkita asosiy fayl haqida:

Header.php


include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php";
include_once "/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php";
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
}

Footer.php
if(isset($_COOKIE["xhprof"]))(
agar (extension_loaded("xhprof")) (
$profiler_namespace = "mening ilovam"; // ilovangiz uchun nom maydoni
$xhprof_data = xhprof_disable();
$xhprof_runs = yangi XHProfRuns_Default();
$run_id = $xhprof_runs->save_run ($xhprof_data, $profiler_namespace);

// XHProf UI kutubxonalariga url (xost nomi va yo'lini o'zgartiring)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
aks-sado<<Profiler chiqishi
OUT;
}
}

Endi biz har qanday PHP skriptini veb orqali ishga tushiramiz va yuqori chap burchakda profiler chiqishiga havolani ko'ramiz - prof.my xost aynan shu uchun yaratilgan.

E'tibor bering - men COOKIE tekshiruvidan foydalanaman! Bunday tekshirish bilan siz profilerni ishlab chiqarish serverida - haqiqiy ma'lumotlarda va haqiqiy yukda xavfsiz ishlatishingiz mumkin.

Profiler veb-interfeysi har bir funktsiya haqida ma'lumotga ega belgilarni ko'rsatadi va quyidagi ma'lumotlarni xabar qiladi:

  • Har bir funktsiyaga qo'ng'iroqlar soni
  • Devor vaqti, funktsiyalarni bajarish uchun sarflangan vaqt (shu jumladan rozetkalardan, fayl tizimidan va hokazolardan javob kutish).
  • CPU vaqti, funktsiyalarni bajarish uchun sarflangan vaqt (rozetkalardan, fayl tizimidan va hokazolardan javoblarni kutish bundan mustasno).
  • Xotiradan foydalanish
  • Maksimal xotiradan foydalanish

Jadvalni istalgan parametr bo'yicha saralash mumkin

Har bir funktsiya bo'yicha ma'lumotlar yana ikkita turga bo'linadi: Inklyuziv va Eksklyuziv. Inklyuzivga bolalar qo'ng'iroqlari tomonidan ishlatiladigan raqamlar kiradi, Exclusive esa ularni o'z ichiga olmaydi. Bundan tashqari, funksiya nomini bosish orqali faqat undagi ma’lumotlarni va u qaysi funksiyalardan chaqirilgan va qaysi funksiyalar chaqirilganligini ko‘rish mumkin.

Agar tizimda GraphViz o'rnatilgan bo'lsa, profiler siz uchun qo'ng'iroqlar grafigini chizadi.

P.S. An'analarni buzmasdan: bu mening Habré-dagi birinchi postim.

UPD: PHP da qayta nashr etilgan.

U xdebug-ni qanday o'rnatish va sozlashni ko'rsatdi va var_dump() funktsiyasining chiqishini yaxshilash yoki xato xabari qabul qilinganda qo'ng'iroqlar stekini chop etish kabi ba'zi asosiy xususiyatlarni qamrab oldi. Ikkinchi qismda biz ushbu xdebug xususiyatini kuzatish sifatida ko'rib chiqdik. Izda dasturdagi funksiyalar va usullarga barcha qo'ng'iroqlar, ishga tushirish vaqti, ixtiyoriy ravishda xotira hajmi, o'tgan va qaytarilgan parametrlar mavjud. Kuzatuv jurnali murakkab dasturning bajarilish yo'lini tushunishga yordam beradi. Dastur ichiga disk raskadrovka kodini kiritish o'rniga, kerak bo'lganda kuzatishni yoqasiz yoki o'chirasiz, so'ngra jurnal faylini tahlil qilish uchun grep yoki shaxsiy PHP ilovalari kabi yordamchi dasturlardan foydalanasiz.

Ushbu maqolada biz profilni ko'rib chiqamiz. Bir qarashda, profil yaratish tracingga o'xshaydi. Profillash jurnali odamlar uchun mo'ljallanmagan, u dastur oqimini tasavvur qilish uchun mo'ljallanmagan, lekin u bizga ishlaydigan dasturning statistik tahlili uchun ma'lumotlarni taqdim etadi.

Profil yaratish jurnalini yaratish

Quyida xdebug tomonidan yaratilgan profil jurnalidan qisqacha parcha keltirilgan:

fl = php: ichki
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
qo'ng'iroqlar = 1 0 0
13 6
cfn=php::define
qo'ng'iroqlar = 1 0 0
18 4
cfn=php::define
qo'ng'iroqlar = 1 0 0
23 2


Ko'rib turganingizdek, profil jurnalini to'g'ridan-to'g'ri o'qib bo'lmaydi. Olingan ma'lumotlarni vizualizatsiya qilish va tahlil qilish uchun qo'shimcha vositalardan foydalanamiz. Shunday qilib, profillash ma'lum bir qator necha marta ishga tushirilganligini va ishga tushirish qancha davom etganligini ko'rsatadi.
Profil jurnalini yaratish, kuzatuv jurnalini yaratishga o'xshash ish faoliyatini sezilarli darajada pasaytiradi, chunki siz har bir satrning o'tishini tasvirlashingiz kerak. Shuning uchun, xuddi kuzatuv holatida bo'lgani kabi, ishlab chiqarish serverlarida profillashni ishga tushirmang... Biroq, profil yaratishni jonli tizimda ishga tushirish kerak bo'lgan holatlar mavjud. Bunday holda, xdebug-ni boshqa Zend kengaytmalari, masalan, yuklagichlar, optimallashtiruvchilar yoki keshlar bilan bir vaqtda ishga tushirishda ehtiyot bo'ling.
Xdebug profil jurnallarini yozishni boshlashi uchun qo'shing

Iltimos, buyruqni ishga tushirish orqali profilni ishga tushirish vaqtida ishga tushira olmasligingizni unutmang.
Profillash jurnali analizator dasturlari tomonidan o'qish uchun mo'ljallanganligi sababli, kuzatuv jurnalida bo'lgani kabi qo'shimcha ma'lumotlarni ko'rsatishga imkon beruvchi qo'shimcha sozlamalar mavjud emas. Biroq, biz kuzatuvni o'rnatishda foydalanganlarga o'xshash profilni sozlash imkonini beruvchi ba'zi sozlamalar mavjud.
Birinchidan, xdebug sukut bo'yicha profil jurnalini /tmp katalogiga yozadi. Agar siz Windows-dan foydalanayotgan bo'lsangiz, php.ini-ni quyidagicha tuzatishingiz kerak:
xdebug.profiler_output_dir="c:\traces"

Odatiy bo'lib, xdebug mavjud profil jurnalining ustiga yozadi. Quyidagi buyruqni qo'shish orqali uni mavjudni to'ldirish uchun sozlashingiz mumkin

php.ini da. Barcha fayllar uchun profil jurnalini yaratmoqchi bo'lmagan holatlar mavjud, lekin ayni paytda ish vaqtida profilni faollashtirish muammoli. Profillashni vaqti-vaqti bilan yoqish va o'chirish o'rniga buyruqni qo'shing
xdebug.profiler_enable_trigger=Yoiq

php.ini da. Endi siz XDEBUG_PROFILE maxsus GET yoki POST parametrini PHP skriptiga o‘tkazish orqali profil yaratishni yoqishingiz va o‘chirishingiz mumkin. Bu faqat ushbu PHP skripti uchun profil yaratish imkonini beradi. Ushbu parametr qiymatini belgilash shart emas, faqat test.php?XDEBUG_PROFILE manziliga ushbu parametrni qo'shishni unutmang.

Profillash jurnali nomi

Xdebug sukut bo'yicha profil jurnaliga tayinlaydigan nom "cachegrind.out" dir. plus jarayon identifikatori. Xuddi kuzatuv jurnalida bo'lgani kabi, php.ini ga tegishli sozlamalarni qo'shish orqali jurnal nomlarini o'zgartirishingiz mumkin. Parametr nomi xdebug.profiler_output_name. Argument qatordir. turli modifikatorlarni o'z ichiga olishi mumkin. Eng muhimlari quyida keltirilgan:

  • %p – jarayon identifikatori
  • %r – tasodifiy son
  • %u - vaqt
  • %H – $_SERVER qiymati["HTTP_HOST"]
  • %R – $_SERVER qiymati["REQUEST_URI"]
  • %s – toʻliq yoʻlni oʻz ichiga olgan nom, slashlar pastki chiziqqa aylantiriladi
%s modifikatori faqat xdebug.profiler_output_name uchun ishlatilishini unutmang. Agar siz profil yaratish jurnalining nomini bilmoqchi bo'lsangiz, xdebug_get_profiler_filename() funksiyasiga qo'ng'iroq qilishingiz mumkin.

Profillash jurnalini tahlil qilish
Yuqorida aytib o'tilganidek, profil yaratish jurnalini tahlil qilish uchun ma'lumotlarni vizualizatsiya qilish uchun qo'shimcha dasturlar talab qilinadi. Xdebug yaratadigan barcha profil jurnallari Cachegrind formatiga o'xshash formatda. Cachegrind - bu Valgrind deb nomlangan yanada kuchli dasturning bir qismi bo'lgan profil yaratuvchisi, Linux uchun dasturiy ta'minotni tuzatish va profillash dasturi. Cachegrind keshlar, xotiradan foydalanish va dastur buyruqlari statistikasini tahlil qilish uchun mo'ljallangan. Boshqa Valgrind vositasi Callgrind, qo'ng'iroqlar grafiklarini chizadi. PHP-ga kelsak, biz ushbu ilovadan profil jurnalini vizualizatsiya qilish va tahlil qilish uchun foydalanishimiz mumkin.
Xdebug tomonidan yaratilgan profil jurnalini tahlil qilish uchun keng tarqalgan vosita deyiladi. KCachgrind GPL bo'yicha litsenziyalangan bepul dasturiy ta'minot (faqat Unix tizimlarida ishlaydi). Biroq, Windows uchun oddiy dastur mavjud, u ham bepul. Avval Windows versiyasini ko'rib chiqaylik.

WinCacheGrind: Windows-da profillash jurnallarini tahlil qilish

WinCachgrind-ning joriy versiyasi (ushbu maqola muallifi tomonidan yozilgan paytda) 1.0.0.12. Ushbu versiya 2005 yilga borib taqaladi, ya'ni WinCachgrind uzoq vaqt davomida ishlab chiqilmagan. Chiqarish eslatmalariga qarasangiz, mualliflar dasturda ba'zida g'alati xatti-harakatlarga olib keladigan xatolar borligini yozishadi.
Shuning uchun men Linuxning so'nggi distribyutsiyasida virtual mashina asosida ishga tushirilgan KCachegrind dan foydalanishni tavsiya qilaman, masalan Ubuntu (tarjimonning eslatmasi, umuman olganda, g'alati tavsiya; bu holda men Linuxni o'rnatishni maslahat beraman, bu erda to'siq emas. virtual mashinalar bog'i). Windows ostida juda ko'p virtual mashinalar mavjud. Agar biron sababga ko'ra Unix yoki virtual mashinadan foydalanish imkoni bo'lmasa, oddiy profil jurnalini tahlil qilish uchun WinCachegrinddan foydalanishni davom ettirishingiz mumkin. WinCachegrind, KCachgrinddan farqli o'laroq, qo'ng'iroqlar grafiklarini chizmaydi.
Wincachegrind-ni o'rnatish juda oson. O'rnatuvchini ishga tushiring, litsenziyani qabul qilish uchun tugmani bosing va o'rnatish tugallandi. Endi siz dasturni ishga tushirishingiz va xdebug tomonidan yaratilgan keshgrind profillash jurnallaridan birini ochishingiz mumkin.

Soat yoki sigma belgisini bosish orqali siz ma'lumotni mutlaq qiymatlar va foizlarda ko'rsatish o'rtasida o'tishingiz mumkin. Foiz ko'rsatkichi ma'lum blokdagi funktsiyani chaqirish uchun umumiy vaqtning foizi sifatida qancha vaqt kerakligini ko'rsatadi.
Ikkita foydali sozlamalar: Profiler -> Tez funksiyalarni yashirish va Profiler -> Kutubxona funksiyalarini yashirish. Birinchi kalit dasturning umumiy bajarilish vaqtiga vaqt hissasi ahamiyatsiz bo'lgan funktsiyalarni yashiradi.
Ikkinchi sozlama, Profiler -> Hide Library Functions, PHP ichiga oʻrnatilgan funksiyalarni umumiy tahlildan yashiradi. Ushbu ikkala sozlamalar ham yoqilganda, siz kamroq maʼlumot koʻrasiz, bu sizga kodingizning optimallashtirishga muhtoj boʻlgan joylariga eʼtibor qaratish imkonini beradi.
Asosiy oynada ikkita yorliq mavjud: Satr satr va Umumiy. Ikkala yorliq ham bir xil ma'lumotlarni ko'rsatadi, ammo "Umumiy" yorlig'i yaxshiroq taqdimot uchun ma'lumotlarni jamlaydi. O'z-o'zidan vaqt joriy blokdagi kodning ishlash vaqtini ko'rsatadi, yig'ilgan vaqt (Cum.) esa berilgan blokdagi funktsiyalarning umumiy ishlash vaqtini ko'rsatadi.

KCacheGrind: Unix-da profillash jurnallarini tahlil qilish

KCachegrindning Unix versiyasi WinCachgrindga qaraganda ko'proq funksionallikni ta'minlaydi. KCachgrind ma'lumotlarni vizualizatsiya qiladi va qo'ng'iroqlar grafigini yaratadi.
Uni ishlatishni boshlash uchun siz KCachgrind-ni o'rnatishingiz kerak. Joriy versiya. Yangi versiya (0.10.1) mavjud, ammo u Valgrind paketining bir qismidir.
Iloji bo'lsa, KCachgrind paketini o'rnatish uchun paket menejeridan foydalaning. KCachegrind qo'ng'iroq grafiklarini chizish uchun GraphViz'dan foydalanadi, shuning uchun paket menejeringiz avtomatik ravishda bog'liq paketlarni o'rnatmasa, GraphViz paketini ham o'rnatishingiz kerak.
Agar siz KCachgrind ikkilik paketini topmasangiz, KCachgrindni o'zingiz kompilyatsiya qilishingiz kerak bo'ladi. Manbalarni yuklab olgandan so'ng, ishga tushiring

./configure --prefix=/opt/kde3
qilish
o'rnatish

Siz ta'kidlaganingizdek, KDE kutubxonasining joriy o'rnatilishiga yo'lni belgilashingiz kerak. Agar KDE kutubxonalari tizimingizda qayerda joylashganligini bilmasangiz, foydalaning

KDE kutubxonalariga yo'lni ko'rsatish uchun.
O'rnatilgandan so'ng, siz KCacheGrind-ni buyruq satridan ishga tushirishingiz mumkin

KCachgrind-dagi ma'lumotlarning jadvalli ko'rinishi WinCachgrind-ga juda o'xshaydi. Bundan tashqari, mutlaq va foiz qiymatlari o'rtasida almashishingiz mumkin. Ba'zi KCachgrind xususiyatlari PHP uchun mo'ljallanmagan. Quyidagi rasmda phpMyAdmin dasturining qo'ng'iroqlar grafigi ko'rsatilgan:


Ko'rib turganingizdek, ishga tushirish vaqtining ko'p qismi common.inc.php ichida o'tkazildi. Quyidagi skrinshotda common.inc.php ichidagi funksiya chaqiruvlarining vizualizatsiyasi ko‘rsatilgan:

Ushbu kod bloki ikkita require_oncesni ishga tushiradi, bu common.inc.php dasturini ishga tushirish vaqtining yarmini tashkil qiladi. Har qanday to'rtburchakni ikki marta bosish sizni ma'lumotlarni tahlil qilishga chuqurroq kirishadi.

Profil ma'lumotlariga asoslangan kodni optimallashtirish

Optimallashtirishdan oldin har doim ilovalaringizni profillang. Siz optimallashtirishni o'zingiz boshlashingiz mumkin, bu optimallashtirish sizga ta'sir ko'rsatadigan joyda, lekin bu har doim ham to'g'ri emas. Optimallashtirish asosan bajarish jarayonida eng ko'p vaqt talab qiladigan qismlarga ta'sir qiladi.
Agar siz bir vaqtning o'zida dasturning ko'plab nusxalarini ishlatayotgan bo'lsangiz, dasturning ko'p vaqtni oladigan qismini optimallashtirishingiz kerak bo'lishi mumkin. Bunday holda, optimallashtirish bitta so'rovga tezroq xizmat ko'rsatishni ta'minlamaydi, lekin bu sizning serveringizga ushbu so'rovlarga xizmat ko'rsatish uchun kamroq resurslarni sarflagan holda yuqori yuklarni boshqarish imkonini beradi.
Profilerning ishlash muddatini ko'rib chiqayotganda, mutlaq qiymatlar nisbiy qiymatlardan kamroq ahamiyatga ega ekanligini yodda tuting. Turli xil tizimlarda o'lchangan mutlaq qiymatlar farq qilishi mumkin. Biroq, kodingizni optimallashtirishni boshlashdan oldin, quyidagi narsalarni ko'rib chiqing.
Optimallashtirishning muhim qoidasi kiritish-chiqarish operatsiyalari sonini kamaytirishdir. Ba'zi kiritish-chiqarish operatsiyalari hisob-kitoblarga nisbatan juda ko'p vaqt talab etadi. Bunday operatsiyalarni kamaytirish dasturni tezlashtirishning juda samarali usuli bo'lishi mumkin. Bitta kiritish/chiqarish chaqiruvini olib tashlash kodni optimallashtirish uchun ko'p soat sarflashdan ko'ra samaraliroq yaxshilanishni ta'minlaydi. Shuning uchun, kodlashni boshlashdan oldin siz birinchi navbatda kirish/chiqarish operatsiyalariga e'tibor qaratishingiz kerak.
Bundan tashqari, optimallashtirishdan oldin serverlaringiz sonini ko'paytirishingiz mumkin. Siz ulkan sotib olishingiz mumkin, bu sizga unumdorlikni biroz oshiradi. Ishlab chiqish vaqti yangi server narxidan qimmatroq. Va agar siz apparat miqdorini oshirsangiz, PHP kodiga hech qanday ta'sir qilmasdan darhol o'sishni olishingizga ishonchingiz komil bo'lishi mumkin. Ishlab chiquvchi kodni optimallashtirish uchun bir yoki ikki kun sarflaganida, unumdorlik qanchalik oshishini hech qachon ayta olmaysiz. Va oxir-oqibat, optimallashtirish hech qanday xatolikka olib kelmasligiga endi ishonchingiz komil emas.
Ba'zi sahifalarni statik sahifalarga aylantirish yaxshi ishlashga erishish usullaridan biridir. Aytaylik, trafik ko'p bo'lgan sayt mavjud bo'lib, u erda PHP skripti ma'lumotlar bazasi yoki XML faylidan ma'lumotlarni tanlab, har bir so'rov uchun birinchi sahifani yaratadi. Agar sahifadagi ma'lumotlar tez-tez o'zgarib tursa, uning statik nusxasini qayta yaratishingiz mumkin. Agar sahifa uchun statik ko'rinishga o'tkazish imkoni bo'lmasa (ba'zi shaxsiy ma'lumotlar sahifada ko'rsatiladi), siz ba'zi bloklarni statik ko'rinishga o'tkazishingiz mumkin.
Optimallashtirishning boshqa darajasi PHP kodini o'zgartirishni talab qilmaydi. Ma'lumki, PHP tarjima qilingan tildir. Bu shuni anglatadiki, uning buyruqlari ish vaqtida oraliq kodga tarjima qilinadi. Translyatsiya har safar skript ishga tushirilganda takrorlanadi. Bu PHPni C yoki Java kabi tillarga nisbatan sekinroq qiladi, bu har safar ishga tushirilganda kodni tahlil qilishni talab qilmaydi. PHP uchun oraliq kodni saqlash va qayta ishlatish uchun oraliq vakillik keshlaridan (mening tarjimamga qarang....) foydalanishingiz mumkin, bu ishga tushirish va bajarishni tezlashtiradi.
Bularning barchasi PHP kodini optimallashtirish uchun vaqt yoki joy yo'q degani emas. Ba'zi kod optimallashtirishlari ish faoliyatini sezilarli darajada yaxshilashi mumkin. Biroq, kodni o'zgartirish har doim qo'shimcha xatolar va xavfsizlik muammolarini kiritish xavfi borligini unutmang. Shuni ham yodda tutingki, kodingizni optimallashtirish uni kamroq o'qilishi mumkin.

Xulosa

Profillash jurnalini yaratish va vizualizatsiya qilish PHP kodini optimallashtirishning muhim shartlaridan biridir. Dasturning qaysi joylari ko'proq vaqt olishini bilishingiz kerak va shu erdan optimallashtirishni boshlashingiz kerak.
Keyingi maqolada xdebug yordamida nosozliklarni tuzatishni ko'rib chiqamiz. xdebug sizga masofadan disk raskadrovka qilish imkoniyatini berishi mumkin. Eclipse PDT kabi bunday imkoniyatga ega bo'lgan mijozdan foydalanib, siz kodingizni o'zgartirmasdan disk raskadrovka qilishingiz, to'xtash nuqtalarini belgilashingiz, kod bo'limlari bo'ylab o'tishingiz va o'zgaruvchilar qiymatlarni qanday va qayerda o'zgartirishini ko'rishingiz mumkin.

Ilovalarni profillash - bu dasturning turli bo'limlari (fayllar va funktsiyalar) bajarilishi tezligi to'g'risidagi ma'lumotlar to'plami. PHP-da ko'plab profil yaratish vositalari mavjud, ammo barcha vositalar to'g'ridan-to'g'ri ishlab chiqarishda tahlil qilish uchun mos emas.

XHProf- deyarli hech qanday ortiqcha xarajatlarsiz dastur ishlayotgan vaqtda to'g'ridan-to'g'ri statistikani to'playdigan mega oddiy profiler.

Nega profil?

Agar ilova sekin ishlay boshlasa, profil yaratish qaysi qism sekin ekanligini aniqlashga yordam beradi. Profilni yaratish natijasi odatda bajarilgan funktsiyalar ro'yxati va ularni bajarish vaqtidir.

Profillash har qanday dasturni optimallashtirishdan oldin amalga oshirilishi kerak. Aks holda, siz taxminlar bilan boshqarilasiz. Katta ehtimol bilan noto'g'ri.

Xdebug muammosi

Xdebug PHP uchun kuchli yechimdir. Ammo Xdebug platformasining o'zi shunchalik og'irki, u jonli saytlarda foydalanish mumkin emas. XDebug server resurslariga sezilarli yuk yaratadi va dasturni sekinlashtiradi.

Boshqa tomondan, jonli saytdagi muammolar rivojlanish muhitidagi muammolardan butunlay farq qilishi mumkin. Faqat ishlab chiquvchi kompyuterlarida profil yaratish muammolarning faqat bir qismini ko'rsatadi.

Shuning uchun yechim ishlab chiqildi XHprof. U ishlaydigan ilovalarda foydalanish uchun mo'ljallangan. Ushbu profilerning asosiy g'oyasi ishlash tezligi bo'yicha barcha kerakli ma'lumotlarni to'plashda ilovaga minimal yukni yaratishdir. Yechim Facebook yigitlari tomonidan ishlab chiqilgan va PHP ning yangi versiyalari tomonidan quvvatlanadi.

XHProf

O'rnatish

Debian-da XHprof sid paketlarida, shuning uchun: apt-get install xhprof

XHprof-ni o'zingiz ham qurishingiz mumkin.

Profil yaratishni yoqish

Aytaylik, bizda quyidagi kodli skript bor:

bajarish ();

XHprof yordamida profil yaratishni amalga oshiramiz. Ushbu sahifada buni amalga oshirish uchun sizga kerak bo'ladi:

  1. Eng boshida profilerni yoqing.
  2. Dasturning eng oxirida profilerni to'xtating va olingan ma'lumotlarni saqlang.

Bu shunday ko'rinadi:

# Profilerni ishga tushiringxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Profilerni yoqgandan so'ng dasturni bajaring bajarish (); # Dasturni bajargandan so'ng profilerni to'xtating$xhprof_data = xhprof_disable();

# Profillash natijasini $xhprof_data o'zgaruvchisiga saqlang

  • Funktsiya xhprof_enable() argument sifatida bayroqlarni oladi. Protsessor statistikasini yozish uchun XHPROF_FLAGS_CPU, xotira uchun XHPROF_FLAGS_MEMORY, o'rnatilgan funksiyalarni e'tiborsiz qoldirish uchun XHPROF_FLAGS_NO_BUILTINS.
  • xhprof_disable() profilerni o'chiradi va to'plangan statistikani qaytaradi.

Hisobotlar

Avlod

Hisobotlarni yaratish uchun to'plangan ma'lumotlar XHprof interfeysida tahlil qilinishi mumkin. Buning uchun XHprof manbalarini yuklab olishingiz kerak: 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

Shundan so'ng siz skriptga o'zgartirishlar kiritishingiz kerak:

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 = yangi XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");

# Yangi kod hisobotni GUI-da foydalanish uchun saqlaydi

Hisobotlar uchun interfeys

Hisobotni ko'rish uchun virtual xostni /var/www/xhprof-0.9.4/xhprof_html jildiga sozlashingiz kerak. Masalan, Nginx-da:

Server (Server_name Xh...4 / xhprof_html; index indexit.php; Fastcgi_index $ (Fastcgi_index $ (Fastcgi_indEPame $ Castcien_script_Filename $ Fastcgi_Sith_name;) Nigxx -s qayta yuklash

Shundan so'ng, hisobotlar ro'yxati paydo bo'ladi:

Jadvalda qo'shimcha ma'lumotlar bilan bir sahifada bajarilgan funktsiyalar ro'yxati mavjud:

  • Qo'ng'iroqlar - funktsional qo'ng'iroqlar soni va foizi.
  • Shu jumladan Wall Time — ichki funksiyalar bilan funksiyaning bajarilish vaqti.
  • Bundan tashqari Wall Time - ichki funksiyalarsiz funktsiyani bajarish vaqti.
  • Shu jumladan CPU - ichki funktsiyalarga ega protsessor vaqti.
  • Bundan tashqari CPU - ichki funktsiyalarsiz protsessor vaqti.
  • Shu jumladan MemUse - ichki o'rnatilgan funktsiyalar bilan xotira iste'moli.
  • Bundan tashqari MemUse - ichki funktsiyalarsiz xotira iste'moli.
  • Shu jumladan PeakMemUse - ichki o'rnatilgan funktsiyalar bilan maksimal xotira iste'moli.
  • Bundan tashqari PeakMemUse - ichki funktsiyalarsiz maksimal xotira iste'moli.

Grafik hisobotlar

Grafik hisobot yaratish uchun graphviz o'rnatilganligiga ishonch hosil qiling: apt-get install graphviz

Kodning resurs talab qiladigan bo'limlari sariq (o'rta) va qizil (eng og'ir) ranglarda ta'kidlangan. Bu dasturning qolgan qismiga nisbatan juda ko'p resurslardan foydalanadigan kod bo'limlari. Bu bitta sekin funksiya yoki tez funksiyaga ko'p chaqiruv bo'lishi mumkin. Bizning misolimizda, funktsiya str_replace() 262 ta qo'ng'iroq tufayli qizil rang bilan belgilangan.

Umumiy hisobotlar

XHprof interfeysi, shuningdek, bir vaqtning o'zida bir nechta hisobotlardan jamlangan ma'lumotlarni ko'rish imkonini beradi. Buning uchun run_id vergul bilan ajratiladi: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&source=test

TL; DR

PHP-ni to'g'ridan-to'g'ri ishlab chiqarishda profillash uchun XHprof-dan foydalaning.

Profillash tizimlaridan foydalanib, siz PHP kodidagi qaysi funktsiyalar protsessor vaqtini va operativ xotirani ko'proq iste'mol qilishi haqida ma'lumot to'plashingiz mumkin, ya'ni PHP dasturining eng sekin va eng ko'p xotira talab qiladigan joylarini aniqlashingiz mumkin.

xhprof

XHProf - Facebook tomonidan ishlab chiqilgan PHP profili.

O'rnatish:

Aptitude install php-pear pecl install xhprof-0.9.4 echo "extension=xhprof.so" > /etc/php5/mods-available/xhprof.ini ln -s /etc/php5/mods-available/xhprof.ini /etc /php5/conf.d/xhprof.ini apachectl qayta ishga tushiring

Ish uchun zarur bo'lgan fayllar katalogda joylashgan /usr/share/php. Biroq, hamma narsa emas, balki faqat PHP kodi bilan. Hisobotlarni normal ko'rsatish uchun jQuery va CSS talab qilinadi. Ularni github omboridan olish mumkin:

Git klon https://github.com/facebook/xhprof.git

Shundan so'ng, ma'lumotlarni yig'ish boshlanishi kerak bo'lgan joyda PHP skript kodiga qatorni qo'shing:

Xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Ma'lumotlarni yig'ish parametrlari qavslar ichida ko'rsatilgan. Bunday holda, ma'lumotlar protsessor yuki va RAMdan foydalanish to'g'risida to'planadi. Yana bitta variant mumkin XHPROF_FLAGS_NO_BUILTINS foydalanilganda, o'rnatilgan funktsiyalar bo'yicha ma'lumotlar yig'ilmaydi.

$xhprof_data = xhprof_disable(); include_once "xhprof_lib/utils/xhprof_lib.php"; include_once "xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = yangi XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Hisobot: http://domain.tld/xhprof_html/index.php?run=$run_id&source=xhprof_test"; echo "\n";

Mos ravishda $run_id Tirnoqlar o'zboshimchalik bilan o'rnatilishi mumkin bo'lgan profil nomini ko'rsatadi.

Qayta ishlangan natija quyidagicha ko'rinadi:

Agar siz parametrni belgilasangiz XHPROF_FLAGS_NO_BUILTINS, funktsiya chaqiruvlari soni sezilarli darajada kamayganligi aniq:

Jadvalda quyidagi ma'lumotlar keltirilgan:

Qo'ng'iroqlar- funksiya chaqiruvlari soni,
Devor vaqti- funktsiyaning umumiy ish vaqti, shu jumladan tashqi resurslardan javob kutish uchun sarflangan vaqt;
Markaziy protsessor- funktsiyalarni qayta ishlashga qancha vaqt sarflangan;
MemUse- qancha RAM ishlatilgan,
PeakMemUse- maksimal xotira iste'moli.

Modifikatorlar quyidagilardir:

Shu jumladan- inklyuziv - ushbu funktsiyadan boshqa funktsiyalarga qo'ng'iroqlarni hisobga olgan holda,
Bundan tashqari- eksklyuziv - funktsiya chaqiruvlari bundan mustasno.

Bundan tashqari, jadvalning yuqorisida umumiy ishlov berish vaqti, ishlatilgan xotira va funktsiya chaqiruvlari soni haqida ma'lumot mavjud.

Shuningdek XHProf qizil va yashil ranglar bilan ko'rsatilgan ikkita yugurish o'rtasidagi farq hisobotlarini yaratishga imkon beradi. Ushbu hisobotlar yordamida siz har bir kod o'zgarishidan so'ng yaxshilanishlar haqida aniq tasavvurga ega bo'lishingiz mumkin.

Bunday hisobotni olish uchun siz quyidagi havoladan foydalanishingiz kerak:

http://domain.tld/xhprof_html/index.php?run1=run_id1&run2=run_id2&source=xhprof_test

Qayerda run_id1 Va run_id2- ishga tushirish identifikatorlari.

Agar o'rnatsangiz Graphviz:

Grafikni o'rnatish qobiliyati

Ma'lumotlar bazalaridan foydalanadigan php profiler xhprof uchun uchinchi tomon veb-interfeyslari ham mavjud:

xDebug

xDebug- Derik Retans tomonidan yozilgan profil yaratish qobiliyatiga ega PHP kodini tuzatuvchi.

O'rnatish:

Yum o'rnating php5-xdebug

Keyin konfiguratsiyani tahrirlaymiz:

Nano /etc/php5/mods-available/xdebug.ini

unga qatorlarni qo'shish:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = On xdebug.profiler_output_dir = /tmp

Bu yerda biz PHP profilerini yoqamiz va profillar saqlanadigan katalogni belgilaymiz. Profillar kabi nomlar bilan yaratilgan cachegrind.out.*

Webgrind veb mijozi mavjud: https://github.com/jokkedk/webgrind. Bu juda tez ishlamaydi, lekin u kichik profillarni tezda ko'rish imkonini beradi. Aslida, bu github'dan klonlanishi kerak bo'lgan PHP kodi:

Git klon https://github.com/jokkedk/webgrind.git

katalog yaratiladi to'rni maydalash, uni istalgan veb-sayt katalogiga nusxalashingiz va brauzerdan kirishingiz kerak. Keyinchalik, konfiguratsiya faylidagi chizmalarni Debian'da ishlashi uchun config.php bajariladigan faylga yo'lni to'g'rilashingiz kerak grafik. Bu shunday ko'rinishi kerak:

Statik $dotExecutable = "/usr/bin/dot";

Bundan tashqari, siz vaqt zonasini sozlashingiz mumkin:

Statik $defaultTimezone = "Yevropa/Moskva";

Sarlavhada siz profilni tanlashingiz va o'rnatilgan funktsiyalarni hisobga olish uchun katakchani belgilashingiz mumkin. Jadvalning o'zida funktsiyalar, qo'ng'iroqlar soni, funktsiyaning o'zi ishlash vaqti va kutish vaqti ko'rsatilgan. Funktsiyalarga chuqurroq kirish uchun uchburchak o'qni bosing. Mening holatimda, juda katta profillar bilan (bir necha megabaytdan), natijani kutish keraksiz darajada yuqori edi. Katta profillar uchun mahalliy ko'rish dasturlarini ishlatish yaxshiroqdir.

Grafik quyidagicha ko'rinishi mumkin:

shu esta tutilsinki to'rni maydalash ishlab chiqarish serverlarida ishlatilmasligi kerak, chunki avtorizatsiya berilmagan, lekin PHP fayl kodiga kirish imkoni mavjud. Agar kerak bo'lsa, kamida Apache avtorizatsiyasidan foydalaning.

Linux uchun profillarni tahlil qilish uchun dasturlar ham mavjud:

Profil yaratish haqida

Profil ma'lumotlari ilovangizni yaxshilashga yordam beradi, ya'ni ma'lum maqsadlarga erishish, masalan, xotira sarfini kamaytirish, sahifa yaratish vaqtini qisqartirish va hokazo.

Profildagi ma'lumotlar optimallashtirishning boshlang'ich nuqtasidir: natijani yaratish uchun qancha vaqt kerakligini, qancha xotira ishlatilishini va qancha funktsiya chaqiruvi amalga oshirilishini aytadi. Batafsilroq ma'lumotlar bilan siz ushbu ko'rsatkichlarni yaxshilashingiz mumkin.

Misol uchun, agar siz ramkadan foydalanayotgan bo'lsangiz, u holda ramkaning ba'zi funktsiyalaridan foydalanish bir nechta asosiy funktsiyalarga qo'ng'iroq qilishga olib kelishi mumkin. Agar siz ba'zi ma'lumotlarni bir necha marta o'qiyotgan bo'lsangiz, natijani o'zgaruvchida saqlashga arziydi.

Profiler shuningdek, PHP kodini keshlashdan qayerda foydalanishni tushunishga yordam beradi, masalan, foydalanish APCu yoki memkeshlangan.

Avvalo, eng ko'p bajarish vaqtini talab qiladigan funktsiyalarni optimallashtirishga arziydi. Hamma narsa optimallashtirilgach va yaxshilash uchun hech narsa qolmagandek tuyulsa, qo'ng'iroqlar soni bo'yicha funktsiyalarni saralash va uni kamaytirish ustida ishlashga arziydi. PHP tez bo'lsa ham, funksiyalarni tez-tez chaqirish kerakmi, deb o'ylash kerakmi?

Agar siz quyidagi holatlarga duch kelsangiz, keshlash haqida o'ylashingiz kerak:

  • O'zgarmas funktsiyalar tsikl ichida chaqiriladi,
  • Ba'zi kontent ikki marta yaratiladi,
  • O'zgarmas tarkib har safar yaratiladi,
  • Kontent ishlatilmasa ham yaratiladi.

Hamma narsani keshlash kerak emas, chunki xotira ham qimmatli manbadir. Doimiy ravishda kiradigan ma'lumotlarni keshlang. Bundan tashqari, keshlash saqlashdan ko'ra ko'proq resurslarni behuda sarf qilsa, keshlash unchalik ma'nosizdir.

Kodda keshlashdan tashqari, veb-server () yordamida, shuningdek, mijoz tomonidan keshlashni unutmang. Agar siz to'g'ri sarlavhalardan foydalansangiz, ko'plab so'rovlar serverga yetib bormasdanoq hal qilinishi mumkin.

PHP uchun xhprof o'rnatilmoqda:

Sudo apt-get o'rnatish php5-xhprof

Apache-ni qayta ishga tushiring:

Sudo xizmati apache2 qayta ishga tushirildi

phpinfo(); va modul ulangan yoki yo'qligini tekshiring?

Biz /etc/php5/apache2/conf.d ni tekshiramiz, u erda xhprof.ini konfiguratsiyasiga havola paydo bo'ladimi.

Agar yo'q bo'lsa, havolani o'zingiz yarating va Apache-ni qayta ishga tushiring.

Sudo ln -s /etc/php5/mods-available/xhprof.ini /etc/php5/apache2/conf.d/20-xhprof.ini sudo xizmati apache2-ni qayta ishga tushiring

Biz xhprof ulanishini tekshiramiz, 20-xhprof.ini ulanganligini tekshiramiz:

Skrinshotda 0.9.2 versiyasi ko'rsatilgan, garchi o'rnatish vaqtida 0.9.4 versiyasi ko'rsatilgan bo'lsa-da, lekin bu bizga to'sqinlik qilmaydi.

Endi biz kodimizni profillashimiz mumkin.

  1. Sahifaning boshida xhprof_enable(); yordamida profil yaratishni yoqing.
  2. Sahifaning oxirida xhprof_disable() yordamida profil yaratishni o'chiring va save_run() yordamida yig'ilgan ma'lumotlarni saqlang.
  3. Keyinchalik tahlil qilamiz.

Funktsiya xhprof_enable() argument sifatida bayroqlarni oladi:

Protsessor statistikasini yozib olish uchun XHPROF_FLAGS_CPU,

XHPROF_FLAGS_MEMORY - xotira uchun,

XHPROF_FLAGS_NO_BUILTINS - o'rnatilgan funktsiyalarni e'tiborsiz qoldirish.

Saqlash va batafsil ma'lumot olish uchun profilni tahlil qilish vositasini o'rnatishimiz kerak.

Arxivni tahlil qilish vositasi bilan xhprof: sahifasidan yuklab oling, 0.9.4 versiyasini oling.

Serverda yoki mahalliy kompyuterda localhost yoki alohida domen orqali kirish mumkin bo'lgan papkani yarating, unda biz yuklab olingan arxivni ochamiz:

Endi biz profilni saqlashimiz mumkin.

https://xn--d1acnqm.xn--j1amh/altadmin/posts/edit/188

Kuzatuv kodi quyidagicha ko'rinadi:

// Profilerni ishga tushiring - biz protsessor vaqtini ham, xotira sarfini ham hisoblaymiz xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// Profillangan kod # Profilerni to'xtating $xhprof_data = xhprof_disable(); # Hisobotni saqlang va uni ko'rish uchun havola yarating_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/html/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = yangi XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Hisobot: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=$run_id&source=xhprof_test"; echo "\n";

/var/www/html/xhprof-0.9.4 - bizga kerak bo'lgan kutubxonalarni ochgan papkaga yo'l.

Hisobot: http://localhost/xhprof-0.9.4/xhprof_html/index.php?run=57c32f3095d21&source=xhprof_test

Profil tahlili shunday ko'rinadi. Ushbu jadvalda profillangan barcha funksiya chaqiruvlari ko'rsatilgan.

Biz jadval sarlavhalarini bosish orqali funktsiyalarni saralashimiz mumkin.

Ba'zi funksiya ko'p marta yoki juda uzoq vaqt davomida bajarilishini ko'rsak, biz ushbu funktsiyani bosishimiz mumkin va shunga o'xshash jadval ochiladi, lekin ko'rib chiqilayotgan funktsiya ichidagi ichki qo'ng'iroqlar va funktsiya chaqirilgan ota-muhit bilan.

Ko'rsatkichlar:
Total Inc. Devor vaqti (rozetkalar, fayl tizimi va boshqa resurslardan javob kutishni hisobga olgan holda funktsiyalarni bajarishga sarflangan vaqt)
Total Inc. CPU (funktsiyalarni bajarish uchun sarflangan vaqt)
Total Inc. MemUse (xotiradan foydalanish)
Total Inc. PeakMemUse (xotiradan maksimal foydalanish)
Funksional chaqiruvlar soni

Hisobotni grafik ko'rsatish imkoniyati ham mavjud. Buning uchun sizda graphviz kutubxonasi o'rnatilganligiga ishonch hosil qilishingiz kerak:

Apt-get o'rnatish graphviz

Keyin profilingizda ko'rsatish uchun bosing va voila:

Endi siz kodni tahlil qilishingiz va yaxshilashingiz mumkin.