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<<
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:
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 3Fl=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
xdebug.profiler_output_dir="c:\traces"
xdebug.profiler_enable_trigger=Yoiq
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:
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
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.
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 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.
Debian-da XHprof sid paketlarida, shuning uchun: apt-get install xhprof
XHprof-ni o'zingiz ham qurishingiz mumkin.
Aytaylik, bizda quyidagi kodli skript bor:
function execute() { # Какой-то PHP код } bajarish ();
XHprof yordamida profil yaratishni amalga oshiramiz. Ushbu sahifada buni amalga oshirish uchun sizga kerak bo'ladi:
Bu shunday ko'rinadi:
function execute() { # Какой-то PHP код } # 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
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:
... $xhprof_data = xhprof_disable(); 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
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:
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.
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
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 - 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- 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 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:
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.
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.