Xhprof və FirePHP istifadə edərək PHP proqramlarının profilləşdirilməsi və sazlanması. PhpStorm və Xdebug ilə PHP Tətbiqlərinin Profilləşdirilməsi php

10.08.2022

PHP kodunun profilləşdirilməsi

Gec-tez hər birimiz köhnə kod və onun optimallaşdırılması ilə qarşılaşırıq. Belə bir vəziyyətdə sazlayıcı və profil tərtibçisi proqramçının ən yaxşı köməkçiləridir. Derick Rethans sayəsində PHP ilə işləyənlər var yaxşı alət- xDebug. Hətta RuNet-də xDebug ilə bağlı çoxlu məlumat var, buna görə də bu məqalə bu barədə olmayacaq.

PHP üçün bir profilçinin qeydinə rast gələndə dərhal xDebug haqqında düşündüm (Zend-in mülkiyyət alətlərini çoxdan unutmuşam), lakin bu dəfə səhv etdim - XHProf haqqında danışacağıq.
XHProf

Bu profilçi xüsusi olaraq Facebook üçün hazırlanmışdır və mənbə 2009-cu ilin mart ayında açılmışdır.

Quraşdırma olduqca tez və rəvan getdi.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/uzatma/
phpize
./konfiqurasiya et && qurmaq && quraşdırmaq
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 yenidən başladın
cp vhost.conf.template prof.my.conf
sed -i s/site/prof/ prof.my.conf
vim prof.my.conf
/etc/init.d/nginx yenidən başladın

Qeyd olunan konfiqurasiyaları təhlil edək

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 konfiqurasiyası - ən standartıdır.

server (
qulaq asmaq 80;
server_name prof.my;
charset utf8;

Kök /usr/local/src/xhprof-0.9.2/xhprof_html ;
yer/(
indeks index.php;
}

Məkan ~ \.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 daxil edin;

/usr/local/src/xhprof-0.9.2/xhprof_html-də profilçi üçün yaxşı WEBGUI yaradan PHP mənbələri var.

Beləliklə, iki əsas fayl haqqında:

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"]))(
əgər (extension_loaded("xhprof")) (
$profiler_namespace = "mənim proqramım"; // tətbiqiniz üçün ad sahəsi
$xhprof_data = xhprof_disable();
$xhprof_runs = yeni XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

// XHProf UI kitabxanalarına url (host adını və yolunu dəyişdirin)
$profiler_url = sprintf("http://prof.my/index.php?run=%s&source=%s", $run_id, $profiler_namespace);
əks-səda<<Profiler çıxışı
OUT;
}
}

İndi biz internet vasitəsilə istənilən PHP skriptini işlədirik və yuxarı sol küncdə profil tərtibatçısının çıxışına keçid görürük – prof.my hostu məhz bunun üçün yaradılmışdır.

Nəzərə alın - mən COOKIE yoxlamasından istifadə edirəm! Belə bir yoxlama ilə, profilçini istehsal serverində - real məlumatlarda və real yükdə etibarlı şəkildə istifadə edə bilərsiniz.

Profiler veb interfeysi hər bir funksiya haqqında məlumat olan işarələri göstərir və aşağıdakı məlumatları bildirir:

  • Hər bir funksiyaya edilən zənglərin sayı
  • Wall-time, funksiyaları yerinə yetirmək üçün sərf olunan vaxt (o cümlədən, prizlərdən, fayl sistemindən və s. cavabların gözləməsi).
  • CPU vaxtı, funksiyaları yerinə yetirmək üçün sərf olunan vaxt (soketlərdən, fayl sistemindən və s. cavabların gözləməsi istisna olmaqla).
  • Yaddaş istifadəsi
  • Pik Yaddaş İstifadəsi

Cədvəli istənilən parametrə görə çeşidləmək mümkündür

Hər bir funksiya haqqında məlumat daha iki növə bölünür: İnklüziv və Eksklüziv. Daxil olana uşaq zəngləri tərəfindən istifadə edilən rəqəmlər daxildir, Exclusive isə onları əhatə etmir. Həmçinin funksiyanın adının üzərinə klikləməklə yalnız onun haqqında məlumatı və onun hansı funksiyalardan çağırıldığını və hansı funksiyaları çağırdığını görmək mümkündür.

Sistemdə GraphViz quraşdırılıbsa, profilçi sizin üçün zəng qrafiki çəkəcək.

P.S. Ənənələri pozmadan: bu mənim Habré-də ilk yazımdır.

UPD: PHP-də təkrar dərc edilmişdir.

O, xdebug-un necə qurulacağını və konfiqurasiya ediləcəyini göstərdi və var_dump() funksiyasının çıxışını yaxşılaşdırmaq və ya xəta mesajı alarkən zəng yığını izini çap etmək kimi bəzi əsas xüsusiyyətləri əhatə etdi. İkinci hissədə biz bu xdebug xüsusiyyətinə izləmə kimi baxdıq. İz proqramdakı funksiyalara və metodlara edilən bütün çağırışları, işə başlama vaxtı, isteğe bağlı olaraq yaddaş ölçüsü, ötürülən və qaytarılan parametrləri ehtiva edir. İzləmə jurnalı mürəkkəb proqramın icra yolunu anlamağa kömək edə bilər. Proqramın içərisinə sazlama kodunu daxil etmək əvəzinə, lazım olan yerdə izləməni yandırır və ya söndürür, sonra log faylını təhlil etmək üçün grep kimi utilitlərdən və ya öz PHP proqramlarınızdan istifadə edirsiniz.

Bu yazıda profilləşdirməyə baxacağıq. İlk baxışdan profilləşdirmə izləməyə bənzəyir. Profilləmə jurnalı insanlar üçün nəzərdə tutulmayıb, proqramın gedişatını vizuallaşdırmaq üçün nəzərdə tutulmayıb, lakin o, işləyən proqramın statistik təhlili üçün bizə məlumat verir.

Profil jurnalının yaradılması

Aşağıda xdebug tərəfindən yaradılan profilləmə jurnalından qısa bir parça verilmişdir:

fl=php:daxili
fn = php :: müəyyən edin
106 3

Fl=C:\www\drupal\includes\bootstrap.inc
fn=require_once::C:\www\drupal\includes\bootstrap.inc
1 648
cfn = php :: müəyyən edin
zənglər = 1 0 0
13 6
cfn = php :: müəyyən edin
zənglər = 1 0 0
18 4
cfn = php :: müəyyən edin
zənglər = 1 0 0
23 2


Gördüyünüz kimi, profilləmə jurnalını birbaşa oxumaq mümkün deyil. Əldə edilmiş məlumatları vizuallaşdırmaq və təhlil etmək üçün əlavə vasitələrdən istifadə edəcəyik. Beləliklə, profilləşdirmə müəyyən bir xəttin neçə dəfə işə salındığını və işə salınmanın nə qədər çəkdiyini göstərir.
Profil jurnalının yaradılması, izləmə jurnalının yaradılmasına bənzər performansı əhəmiyyətli dərəcədə aşağı salır, çünki hər bir xəttin keçidini təsvir etməlisiniz. Buna görə də, izləmə vəziyyətində olduğu kimi, istehsal serverlərində profil yaratmayın... Bununla belə, profilləşdirmənin canlı sistemdə icra edilməsi lazım olduğu hallar var. Bu halda, xdebug-u yükləyicilər, optimallaşdırıcılar və ya keşlər kimi digər Zend genişləndirmələri ilə eyni vaxtda işə salmaqda diqqətli olun.
Xdebug-un profil qeydlərini yazmağa başlaması üçün əlavə edin

Nəzərə alın ki, başlanğıc zamanı bir əmr işlətməklə profil yaratmağa başlaya bilməzsiniz.
Profilləşdirmə jurnalının analizator proqramları tərəfindən oxunması nəzərdə tutulduğundan, iz jurnalında olduğu kimi əlavə məlumatı göstərməyə imkan verən əlavə parametrlər yoxdur. Bununla belə, izləməni qurarkən istifadə etdiyimiz kimi, profilləşdirməni konfiqurasiya etməyə imkan verən bəzi parametrlər var.
Birincisi, xdebug standart olaraq profilləmə jurnalını /tmp qovluğuna yazır. Əgər siz Windows istifadə edirsinizsə, php.ini-ni belə düzəltməlisiniz:
xdebug.profiler_output_dir="c:\traces"

Varsayılan olaraq, xdebug mövcud profil jurnalının üzərinə yazır. Aşağıdakı əmri əlavə etməklə onu mövcud olanı tamamlamaq üçün konfiqurasiya edə bilərsiniz

php.ini-də. Bütün fayllar üçün profil jurnalı yaratmaq istəmədiyiniz hallar var, lakin eyni zamanda iş vaxtında profilləşdirməni aktivləşdirmək problemlidir. Profili vaxtaşırı yandırıb söndürmək əvəzinə, əmri əlavə edin
xdebug.profiler_enable_trigger=Aktivdir

php.ini-də. İndi siz XDEBUG_PROFILE xüsusi GET və ya POST parametrini PHP skriptinə ötürməklə profilləşdirməni yandırıb söndürə bilərsiniz. Bu, yalnız bu PHP skripti üçün profil yaratmağa imkan verəcək. Bu parametrin dəyərini təyin etmək lazım deyil, sadəcə bu parametri test.php?XDEBUG_PROFILE ünvanına əlavə etməyi unutmayın.

Profilin log adı

Xdebug-un standart olaraq profilləşdirmə jurnalına təyin etdiyi ad “cachegrind.out”dur. plus proses identifikatoru. İzləmə jurnalında olduğu kimi, php.ini-yə müvafiq parametrləri əlavə etməklə jurnalın adlarını dəyişə bilərsiniz. Parametr adı xdebug.profiler_output_name. Arqument sətirdir. müxtəlif dəyişdiriciləri ehtiva edə bilər. Ən vacibləri aşağıdadır:

  • %p – proses identifikatoru
  • %r – təsadüfi ədəd
  • %u - vaxt
  • %H – $_SERVER["HTTP_HOST"] dəyəri
  • %R – $_SERVER["REQUEST_URI"] dəyəri
  • %s – tam yol daxil olmaqla ad, kəsiklər alt xəttə çevrilir
Nəzərə alın ki, %s dəyişdiricisi yalnız xdebug.profiler_output_name üçün istifadə olunur. Profilləşdirmə jurnalının adını bilmək istəyirsinizsə, xdebug_get_profiler_filename() funksiyasına zəng edə bilərsiniz.

Profilin log analizi
Yuxarıda qeyd edildiyi kimi, profilləşdirmə jurnalını təhlil etmək üçün məlumatların vizuallaşdırılması üçün əlavə proqramlar tələb olunur. Xdebug-un yaratdığı bütün profil qeydləri Cachegrind formatına oxşar formatdadır. Cachegrind, Valgrind adlı daha güclü proqramın bir hissəsi olan, Linux üçün proqram təminatının sazlanması və profilləşdirilməsi proqramı olan profil tərtibatçısıdır. Cachegrind keşlərin, yaddaşdan istifadənin və proqram əmrlərinin statistikasını təhlil etmək üçün nəzərdə tutulmuşdur. Digər Valgrind aləti Callgrind, zəng qrafiklərini çəkir. PHP ilə əlaqədar olaraq, biz bu proqramdan profil jurnalını vizuallaşdırmaq və təhlil etmək üçün istifadə edə bilərik.
Xdebug tərəfindən yaradılan profilləşdirmə jurnalını təhlil etmək üçün adətən istifadə olunan alət adlanır. KCachegrind GPL altında lisenziyalaşdırılmış pulsuz proqramdır (yalnız Unix sistemlərində işləyir). Bununla belə, Windows üçün sadə bir proqram var, o da pulsuzdur. Əvvəlcə Windows versiyasına baxaq.

WinCacheGrind: Windows-da profilləmə qeydlərinin təhlili

WinCachgrind-in cari versiyası (bu məqalənin müəllifi tərəfindən yazılan zaman) 1.0.0.12-dir. Bu versiya 2005-ci ilə aiddir, yəni WinCachgrind uzun müddətdir hazırlanmayıb. Buraxılış qeydlərinə baxsanız, müəlliflər proqramda bəzən onu qəribə aparan səhvlər olduğunu yazır.
Ona görə də mən ən son Linux distribüterində, məsələn Ubuntu-da virtual maşın əsasında işə salınmış KCachegrind-dən istifadə etməyi məsləhət görürəm (tərcüməçinin qeydi, ümumiyyətlə, qəribə bir tövsiyədir; bu halda mən sadəcə Linux-u quraşdırmağı məsləhət görərdim, nəinki çəpərləmə. virtual maşınlar bağı). Windows altında çox sayda virtual maşın mövcuddur. Əgər nədənsə Unix və ya virtual maşından istifadə etmək mümkün deyilsə, sadə profilləmə jurnalının təhlili üçün WinCachegrind-dən istifadə etməyə davam edə bilərsiniz. WinCachgrind, KCachgrind-dən fərqli olaraq zəng qrafiklərini çəkmir.
Wincachegrind quraşdırmaq olduqca asandır. Quraşdırıcını işə salın, lisenziyanı qəbul etmək üçün düyməni basın və quraşdırma tamamlandı. İndi proqramı işə sala və xdebug tərəfindən yaradılmış cachegrind profilləmə qeydlərindən birini aça bilərsiniz.

Saata və ya siqma işarəsinə klikləməklə, məlumatı mütləq dəyərlərdə və faizlərdə göstərmək arasında keçid edə bilərsiniz. Faiz göstəricisi ümumi vaxtın faizi kimi verilmiş blokda funksiyanı çağırmaq üçün nə qədər vaxt lazım olduğunu göstərir.
İki faydalı parametr: Profiler -> Sürətli Funksiyaları Gizlət və Profiler -> Kitabxana Funksiyalarını Gizlət. Birinci keçid proqramın ümumi icra müddətinə vaxt töhfəsi əhəmiyyətsiz olan funksiyaları gizlədir.
İkinci parametr, Profiler -> Kitabxana Funksiyalarını Gizlət, PHP-də qurulmuş funksiyaları ümumi təhlildən gizlədir. Bu parametrlərin hər ikisi aktiv olduqda, daha az məlumat görürsünüz, bu da kodunuzun optimallaşdırmaya ehtiyacı olan sahələrinə diqqət yetirməyə imkan verir.
Əsas pəncərədə iki nişan var: Sətir-sətir və Ümumi. Hər iki nişan eyni məlumatı göstərir, lakin Ümumi nişanı daha yaxşı təqdimat üçün məlumatları birləşdirir. Self time cari blokda kodun işləmə vaxtını, məcmu vaxt (Cum.) isə verilmiş blokdakı funksiyaların ümumi işləmə müddətini göstərir.

KCacheGrind: Unix-də profilləmə qeydlərinin təhlili

KCachegrind-in Unix versiyası WinCachgrind-dən daha çox funksionallıq təmin edir. KCachegrind məlumatları vizuallaşdırır və zəng qrafiki qurur.
Onu istifadə etməyə başlamaq üçün KCachegrind quraşdırmalısınız. Cari versiya . Daha yeni versiya (0.10.1) mövcuddur, lakin o, Valgrind paketinin bir hissəsidir.
Mümkünsə, KCachgrind paketini quraşdırmaq üçün paket menecerindən istifadə edin. KCachegrind zəng qrafiklərini çəkmək üçün GraphViz-dən istifadə edir, ona görə də paket meneceriniz asılı paketləri avtomatik quraşdırmırsa, siz GraphViz paketini də quraşdırmalısınız.
KCachgrind binar paketini tapmasanız, KCachgrind-i özünüz tərtib etməli olacaqsınız. Mənbələri yüklədikdən sonra işə salın

./konfiqurasiya --prefiks=/opt/kde3
etmək
quraşdırmaq

Qeyd etdiyiniz kimi, KDE kitabxanasının cari quraşdırılmasına gedən yolu göstərməlisiniz. KDE kitabxanalarının sisteminizdə harada yerləşdiyini bilmirsinizsə, istifadə edin

KDE kitabxanalarına gedən yolu göstərmək üçün.
Quraşdırıldıqdan sonra KCacheGrind-i komanda xəttindən işə sala bilərsiniz

KCachegrind-də verilənlərin cədvəl şəklində göstərilməsi WinCachgrind-ə çox bənzəyir. Siz həmçinin mütləq və faiz dəyərləri arasında keçid edə bilərsiniz. Bəzi KCachgrind xüsusiyyətləri PHP üçün nəzərdə tutulmayıb. Aşağıdakı şəkildə phpMyAdmin proqramının zəng qrafiki göstərilir:


Göründüyü kimi, işə başlama vaxtının çox hissəsi common.inc.php daxilində keçirdi. Aşağıdakı ekran görüntüsü common.inc.php daxilində funksiya çağırışlarının vizuallaşdırılmasını göstərir:

Bu kod bloku iki require_onces işlədir ki, bu da common.inc.php-ni işə salmaq üçün lazım olan vaxtın yarısıdır. İstənilən düzbucaqlıya iki dəfə klikləmək sizi məlumatların təhlilinə daha dərindən aparacaq.

Profil məlumatlarına əsaslanan kodun optimallaşdırılması

Optimallaşdırmadan əvvəl həmişə tətbiqlərinizi profilləndirin. Optimallaşdırmaya özünüz başlaya bilərsiniz, o yerdə ki, bu optimallaşdırma effekt verəcəkdir, lakin bu həmişə doğru deyil. Optimallaşdırma əsasən yalnız icra prosesində ən çox vaxt aparan hissələrə təsir göstərir.
Əgər siz eyni vaxtda bir proqramın bir çox nüsxəsini işlədirsinizsə, hələ də proqramınızın icra vaxtının çox hissəsini tutan hissəsini optimallaşdırmalısınız. Bu halda, optimallaşdırma bir fərdi sorğuya daha sürətli xidmət göstərməyəcək, lakin serverinizə həmin sorğulara xidmət etmək üçün daha az resurs sərf etməklə yüksək yükləri idarə etməyə imkan verəcək.
Profilerin işləmə müddətlərinə baxarkən mütləq dəyərlərin nisbi dəyərlərdən daha az əhəmiyyətli olduğunu unutmayın. Fərqli sistemlərdə ölçüldükdə mütləq dəyərlər dəyişə bilər. Bununla belə, kodunuzu optimallaşdırmağa başlamazdan əvvəl aşağıdakıları nəzərdən keçirin.
Optimallaşdırmada mühüm qayda I/O əməliyyatlarının sayını azaltmaqdır. Bəzi I/O əməliyyatları hesablamalarla müqayisədə çox vaxt aparır. Bu cür əməliyyatların azaldılması proqramınızı sürətləndirmək üçün çox təsirli bir yol ola bilər. Bir giriş/çıxış zənginin silinməsi kodu optimallaşdırmaq üçün çox saat sərf etməkdən daha effektiv təkmilləşdirmə təmin edə bilər. Buna görə də, kodlaşdırmaya başlamazdan əvvəl ilk növbədə I/O əməliyyatlarına diqqət yetirməlisiniz.
Optimallaşdırmadan əvvəl serverlərinizin sayını da artıra bilərsiniz. Siz məhsuldarlıqda kiçik bir artım verəcək böyük bir satın ala bilərsiniz. İnkişaf müddəti yeni bir serverin qiymətindən daha bahadır. Və avadanlıqların miqdarını artırsanız, PHP koduna heç bir təsir göstərmədən artımı dərhal alacağınıza əmin ola bilərsiniz. Tərtibatçı kodu optimallaşdırmaq üçün bir və ya iki gün sərf etdikdə, məhsuldarlığın nə qədər artacağını heç vaxt deyə bilməzsiniz. Və sonda, optimallaşdırmanın heç bir səhv gətirməyəcəyinə artıq əmin ola bilməzsiniz.
Bəzi səhifələri statik səhifələrə çevirmək daha yaxşı performans əldə etməyin yollarından biridir. Tutaq ki, çoxlu trafikə malik bir sayt var, burada PHP skripti verilənlər bazasından və ya XML faylından məlumat seçərək hər sorğu üçün ilk səhifə yaradır. Əgər səhifədəki məlumatlar kifayət qədər tez-tez dəyişirsə, onun statik surətini yenidən yarada bilərsiniz. Əgər səhifə üçün statik görünüşə çevirmək mümkün deyilsə (bəzi şəxsi məlumatlar səhifədə göstərilir), siz bəzi blokları statik görünüşə çevirə bilərsiniz.
Optimallaşdırmanın başqa bir səviyyəsi PHP kodunun dəyişdirilməsini tələb etmir. Bildiyimiz kimi PHP tərcümə olunan bir dildir. Bu o deməkdir ki, onun əmrləri icra zamanı aralıq koda çevrilir. Skript hər dəfə işə salındıqda yayım təkrarlanır. Bu, C və ya Java kimi dillərlə müqayisədə PHP-ni daha yavaş edir, hər dəfə işlədiyiniz zaman kodu təhlil etməyi tələb etmir. PHP üçün aralıq kodu saxlamaq və təkrar istifadə etmək üçün aralıq təmsil keşlərindən (mənim tərcüməmə bax....) istifadə edə bilərsiniz, bu işə başlama və icranı daha sürətli edir.
Bütün bunlar o demək deyil ki, PHP kodunu optimallaşdırmağın vaxtı və yeri deyil. Bəzi kod optimallaşdırmaları performansı əhəmiyyətli dərəcədə yaxşılaşdıra bilər. Bununla belə, həmişə yadda saxlayın ki, kodun dəyişdirilməsi həmişə əlavə səhvlər və təhlükəsizlik problemlərinin yaranması riskini daşıyır. Həmçinin unutmayın ki, kodunuzu optimallaşdırmaq onu daha az oxunaqlı edir.

Nəticə

Profilləşdirmə jurnalının yaradılması və vizuallaşdırılması PHP kodunun optimallaşdırılması üçün vacib şərtlərdən biridir. Proqramda hansı yerlərin daha çox vaxt tələb etdiyini bilməlisiniz və optimallaşdırmağa buradan başlamalısınız.
Növbəti məqalədə xdebug istifadə edərək sazlamaya baxacağıq. xdebug sizə uzaqdan sazlama aparmaq imkanı verə bilər. Eclipse PDT kimi bu qabiliyyətə malik olan müştəridən istifadə edərək, kodu dəyişmədən onu sazlaya, kəsilmə nöqtələrini təyin edə, kod bölmələri arasında keçid edə və dəyişənlərin dəyərləri necə və harada dəyişdiyini görə bilərsiniz.

Tətbiq profilinin yaradılması müxtəlif proqram bölmələrinin (fayllar və funksiyaların) icra sürəti haqqında məlumatların toplanmasıdır. Bir çox PHP profilləşdirmə alətləri mövcuddur, lakin bütün alətlər birbaşa istehsalda təhlil aparmaq üçün uyğun deyil.

XHProf- proqram demək olar ki, heç bir yük olmadan işləyərkən birbaşa statistika toplayan meqa sadə profilçi.

Niyə profil?

Tətbiq yavaş-yavaş işləməyə başlayırsa, profilləşdirmə hansı hissənin yavaş olduğunu öyrənməyə kömək edə bilər. Profilləşdirmənin nəticəsi adətən yerinə yetirilən funksiyaların siyahısı və onların icra müddəti olur.

Hər hansı bir tətbiqin optimallaşdırılmasından əvvəl profilləmə aparılmalıdır. Əks təqdirdə, təxminlər sizi rəhbər tutacaq. Çox güman ki, səhvdir.

Xdebug problemi

Xdebug PHP üçün güclü bir həlldir. Lakin Xdebug platformasının özü o qədər ağırdır ki, o canlı saytlarda istifadə edilə bilməz. XDebug server resurslarında əhəmiyyətli yük yaradır və tətbiqi ləngidir.

Digər tərəfdən, canlı saytdakı problemlər inkişaf mühitindəki problemlərdən tamamilə fərqli ola bilər. Yalnız tərtibatçı kompüterlərində profil yaratmaq problemlərin yalnız bir hissəsini göstərəcəkdir.

Buna görə həll yolu hazırlanmışdır XHprof. O, işləyən proqramlarda istifadə üçün nəzərdə tutulub. Bu profilçinin əsas ideyası əməliyyat sürəti ilə bağlı bütün lazımi məlumatları toplayarkən tətbiqdə minimum yük yaratmaqdır. Həll Facebook-dan olan uşaqlar tərəfindən hazırlanıb və PHP-nin yeni versiyaları tərəfindən dəstəklənir.

XHProf

Quraşdırma

Debian-da XHprof sid paketlərindədir, ona görə də: apt-get install xhprof

XHprof-u özünüz də qura bilərsiniz.

Profilləşdirməni aktivləşdirin

Tutaq ki, bizdə aşağıdakı kodu olan bir skript var:

icra etmək();

XHprof istifadə edərək profilləşdirmə aparaq. Bu səhifədə bunu etmək üçün sizə lazımdır:

  1. Ən əvvəlində profili aktivləşdirin.
  2. Proqramın ən sonunda profili dayandırın və alınan məlumatları saxlayın.

Bu belə görünəcək:

# Profileri işə salınxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Profileri işə saldıqdan sonra proqramı icra edin icra etmək(); # Proqramı icra etdikdən sonra profili dayandırın$xhprof_data = xhprof_disable();

# Profilin nəticəsini $xhprof_data dəyişəninə qeyd edin

  • Funksiya xhprof_enable() arqument kimi bayraqları götürür. Prosessor statistikasını qeyd etmək üçün XHPROF_FLAGS_CPU, yaddaş üçün XHPROF_FLAGS_MEMORY, daxili funksiyalara məhəl qoymamaq üçün XHPROF_FLAGS_NO_BUILTINS.
  • xhprof_disable() profilçini söndürəcək və toplanmış statistikanı qaytaracaq.

Hesabatlar

Nəsil

Toplanmış məlumatlar hesabat yaratmaq üçün XHprof interfeysində təhlil edilə bilər. Bunun üçün XHprof mənbələrini yükləməlisiniz: 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

Bundan sonra skriptdə dəyişiklik etməlisiniz:

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

# Yeni kod hesabatı GUI-də istifadə etmək üçün saxlayır

Hesabatlar üçün interfeys

Hesabata baxmaq üçün virtual hostu /var/www/xhprof-0.9.4/xhprof_html qovluğuna konfiqurasiya etməlisiniz. Məsələn, Nginx-də:

Server ( server_name xh..9.4/xhprof_html; index index.php; yer ~* \.(php)$ ( fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_params daxildir; fastcgi_param $do SCRIPT_FILE_ngot; SCRIPT_FILEngot $document_adı) -s yenidən yükləyin

Bundan sonra hesabatların siyahısı görünəcək:

Cədvəldə əlavə məlumatlarla bir səhifədə yerinə yetirilən funksiyaların siyahısı var:

  • Zənglər — funksiya zənglərinin sayı və faizi.
  • O cümlədən Wall Time — daxili funksiyaları olan funksiyanın icra müddəti.
  • İstisna Wall Time daxili funksiyalar olmadan funksiyanın icra müddətidir.
  • O cümlədən CPU - yuvalanmış funksiyaları olan prosessor vaxtı.
  • İstisna CPU - daxili funksiyalar olmadan prosessor vaxtı.
  • O cümlədən MemUse - daxili funksiyalarla yaddaş istehlakı.
  • İstisna MemUse - daxili funksiyalar olmadan yaddaş istehlakı.
  • O cümlədən PeakMemUse - yuvalanmış funksiyalarla maksimum yaddaş istehlakı.
  • İstisna PeakMemUse - yuvalanmış funksiyalar olmadan maksimum yaddaş istehlakı.

Qrafik hesabatlar

Qrafik hesabat yaratmaq üçün graphviz-in quraşdırıldığına əmin olun: apt-get install graphviz

Kodun resurs tutumlu bölmələri sarı (orta) və qırmızı (ən ağır) rənglərlə vurğulanır. Bunlar proqramın qalan hissəsinə nisbətən çoxlu resurs istifadə edən kod bölmələridir. Bu, bir yavaş funksiya və ya sürətli funksiyaya çoxlu zənglər ola bilər. Bizim nümunəmizdə funksiya str_replace() 262 zəngə görə qırmızı işarələnmişdir.

Ümumi hesabatlar

XHprof interfeysi eyni zamanda bir neçə hesabatdan ümumi məlumatı nəzərdən keçirməyə imkan verir. Bunun üçün run_id vergüllə ayrılaraq verilir: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&mənbə=test

TL; DR

PHP-ni birbaşa istehsalda profil etmək üçün XHprof istifadə edin.

Profilləşdirmə sistemlərindən istifadə etməklə siz PHP kodundakı hansı funksiyaların daha çox CPU vaxtı və RAM istehlak etdiyi barədə məlumat toplaya bilərsiniz, yəni PHP proqramında ən yavaş və ən çox yaddaş tələb edən yerləri müəyyən edə bilərsiniz.

xhprof

XHProf - Facebook tərəfindən hazırlanmış PHP profili.

Quraşdırma:

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 yenidən başladın

İş üçün lazım olan fayllar kataloqda yerləşir /usr/share/php. Ancaq hər şey deyil, yalnız PHP kodu ilə. Hesabatların normal göstərilməsi üçün jQuery və css tələb olunur. Onları github deposundan əldə etmək olar:

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

Bundan sonra, məlumatların toplanmasının başlamalı olduğu yerdə PHP skript koduna sətir əlavə edin:

Xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Məlumatların toplanması üçün parametrlər mötərizədə göstərilmişdir. Bu halda, məlumat prosessor yükü və RAM istifadəsi haqqında toplanacaq. Daha bir variant mümkündür XHPROF_FLAGS_NO_BUILTINS istifadə edildikdə, daxili funksiyalar haqqında məlumatlar toplanmır.

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

Xətdə $run_id Dırnaqlar özbaşına təyin oluna bilən profilin adını göstərir.

İşlənmiş nəticə belə görünür:

Parametri qeyd etsəniz XHPROF_FLAGS_NO_BUILTINS, funksiya çağırışlarının sayının əhəmiyyətli dərəcədə azaldığı aydındır:

Cədvəl aşağıdakı məlumatları təqdim edir:

Zənglər- funksiya çağırışlarının sayı,
Divar vaxtı- funksiyanın ümumi işləmə müddəti, o cümlədən xarici resurslardan cavab gözləmək vaxtı,
CPU- funksiyaları emal etməyə nə qədər vaxt sərf olundu,
MemUse- nə qədər RAM istifadə edildi,
PeakMemUse- maksimum yaddaş istehlakı.

Modifikatorlar bunlardır:

O cümlədən- daxil olmaqla - bu funksiyadan digər funksiyalara edilən zəngləri nəzərə alaraq,
İstisna- eksklüziv - funksiya zəngləri istisna olmaqla.

Bundan əlavə, cədvəlin yuxarısında ümumi emal vaxtı, istifadə olunan yaddaş və funksiya çağırışlarının sayı haqqında məlumat var.

Həmçinin XHProf qırmızı və yaşıl rənglərlə göstərilən iki qaçış arasında diferensial hesabatlar yaratmağa imkan verir. Bu hesabatlarla siz hər kod dəyişikliyindən sonra təkmilləşdirmələrin aydın mənzərəsini əldə edə bilərsiniz.

Belə bir hesabat əldə etmək üçün bu kimi bir keçiddən istifadə etməlisiniz:

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

Harada run_id1run_id2- işə salınan identifikatorlar.

Quraşdırsanız Graphviz:

Qrafik quraşdırma qabiliyyəti

Məlumat bazalarından istifadə edən php profiler xhprof üçün üçüncü tərəf veb interfeysləri də var:

xDebug

xDebug- Derick Rethans tərəfindən yazılmış profilləşdirmə qabiliyyətinə malik PHP kod sazlayıcısı.

Quraşdırma:

Yum php5-xdebug quraşdırın

Sonra konfiqurasiyanı redaktə edirik:

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

ona sətirləri əlavə etməklə:

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

Burada biz PHP profilini işə salırıq və profillərin saxlanacağı qovluğu təyin edirik. Profillər kimi adlarla yaradılır cachegrind.out.*

Webgrind veb müştərisi var: https://github.com/jokkedk/webgrind. Çox sürətli işləmir, lakin kiçik profillərə tez baxmaq imkanı verir. Əslində, bu, github-dan klonlaşdırılmalı olan PHP kodudur:

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

kataloq yaradılacaq web grind, hər hansı bir veb saytın kataloquna köçürmək və brauzerdən daxil olmaq lazımdır. Sonra, konfiqurasiya faylında planların Debian-da işləməsi üçün config.php icra olunan faylın yolunu düzəltmək lazımdır qrafviz. Bu belə görünməlidir:

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

Bundan əlavə, saat qurşağını tənzimləyə bilərsiniz:

Statik $defaultTimezone = "Avropa/Moskva";

Başlıqda bir profil seçə və daxili funksiyaları nəzərə almaq üçün qutuyu işarələyə bilərsiniz. Cədvəlin özü funksiyaları, zənglərin sayını, funksiyanın özünün işləmə müddətini və gözləmə müddətini göstərir. Funksiyalara daha dərindən getmək üçün üçbucaqlı oxu klikləmək kifayətdir. Mənim vəziyyətimdə, kifayət qədər böyük profillərlə (bir neçə meqabaytdan) nəticə gözləməsi lazımsız dərəcədə yüksək idi. Yəqin ki, kifayət qədər böyük profillər üçün yerli baxış proqramlarından istifadə etmək daha yaxşıdır.

Qrafik belə görünə bilər:

qeyd edin ki web grindİstehsal serverlərində istifadə edilməməlidir, çünki heç bir icazə verilmir, lakin php fayl koduna giriş var. Lazım gələrsə, ən azı əsas Apache avtorizasiyasından istifadə edin.

Linux üçün profilləri təhlil etmək üçün proqramlar da var:

Profilləşdirmə haqqında

Profil məlumatları tətbiqinizi təkmilləşdirməyə kömək edə bilər, yəni müəyyən məqsədlərə nail olmaq, məsələn, yaddaş istehlakını azaltmaq, səhifə yaratmaq vaxtını azaltmaq və s.

Profildəki məlumatlar optimallaşdırma üçün başlanğıc nöqtəsidir: nəticənin yaradılması üçün nə qədər vaxt lazım olduğunu, nə qədər yaddaş istifadə edildiyini və nə qədər funksiya çağırışının edildiyini bildirir. Daha ətraflı məlumatlarla siz bu göstəriciləri təkmilləşdirə bilərsiniz.

Məsələn, əgər siz çərçivədən istifadə edirsinizsə, onda çərçivənin bəzi funksiyalarından istifadə etmək bir neçə əsas funksiyaya çağırışlara səbəb ola bilər. Bəzi məlumatları bir neçə dəfə oxuyursunuzsa, nəticəni dəyişəndə ​​saxlamağa dəyər ola bilər.

Profiler, məsələn, istifadə edərək, PHP kodunun keşləşdirilməsinin harada istifadə olunacağını anlamağa kömək edə bilər APCu və ya yaddaşda saxlanmışdır.

İlk növbədə, ən çox icra müddəti tələb edən funksiyaları optimallaşdırmağa dəyər. Hər şey optimallaşdırıldıqdan və yaxşılaşdırmaq üçün heç bir şey qalmadığı görünürsə, funksiyaları zənglərin sayına görə çeşidləməyə və onu azaltmağa çalışmaq lazımdır. PHP sürətli olsa belə, funksiyaları tez-tez çağırmaq lazım olub-olmadığını düşünməyə dəyər?

Aşağıdakı hallarla qarşılaşsanız, keşləməni nəzərdən keçirməlisiniz:

  • Dəyişməz funksiyalar dövrə daxilində çağırılır,
  • Bəzi məzmun iki dəfə yaradılır,
  • Dəyişməyən məzmun hər dəfə yaradılır,
  • Məzmun istifadə edilməsə belə yaradılır.

Yaddaş da qiymətli resurs olduğu üçün hər şeyi keşləməməlisiniz. Daim daxil olduğunuz məlumatları önbelleğe alın. Bundan əlavə, keşləmə qənaət etməkdən daha çox resurs sərf edərsə, keşləmə çox az məna kəsb edir.

Kodda keşləmə ilə yanaşı, veb serverdən () istifadə edərək, həm də müştəri tərəfində keşləşdirməni unutma. Düzgün başlıqlardan istifadə etsəniz, bir çox sorğular serverə çatmamış həll edilə bilər.

php üçün xhprof quraşdırılması:

Sudo apt-get quraşdırma php5-xhprof

Apache-ni yenidən başladın:

Sudo xidməti apache2 yenidən başladın

phpinfo (); və modulun qoşulub-qoşulmadığını yoxlayın?

Orada xhprof.ini konfiqurasiyasına keçidin olub-olmadığını görmək üçün /etc/php5/apache2/conf.d-ni yoxlayırıq.

Əgər yoxsa, o zaman linki özünüz yaradın və Apache-ni yenidən başladın.

Sudo ln -s /etc/php5/mods-available/xhprof.ini /etc/php5/apache2/conf.d/20-xhprof.ini sudo xidmətini apache2 yenidən başladın

Xhprof bağlantısını yoxlayırıq, 20-xhprof.ini-nin bağlı olub olmadığını yoxlayırıq:

Ekran görüntüsü 0.9.2 versiyasını göstərir, baxmayaraq ki, quraşdırma zamanı 0.9.4 versiyası göstərildi, lakin bu, bizə maneə deyil.

İndi kodumuzu profilləşdirə bilərik.

  1. Səhifənin əvvəlində xhprof_enable();
  2. Səhifənin sonunda xhprof_disable() istifadə edərək profilləşdirməni söndürün və save_run();
  3. Sonra təhlil edirik.

Funksiya xhprof_enable() arqument kimi bayraqları götürür:

Prosessor statistikasını qeyd etmək üçün XHPROF_FLAGS_CPU,

XHPROF_FLAGS_MEMORY - yaddaş üçün,

XHPROF_FLAGS_NO_BUILTINS - daxili funksiyalara məhəl qoymamaq.

Saxlamaq və əlavə məlumat vermək üçün profil analiz aləti quraşdırmalıyıq.

Analiz aləti ilə arxivi xhprof: səhifəsindən yükləyin, 0.9.4 versiyasını götürün.

Serverdə və ya yerli kompüterdə localhost və ya ayrıca domen vasitəsilə əlçatan bir qovluq yaradın ki, orada yüklənmiş arxivi açırıq:

İndi profili saxlaya bilərik.

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

İzləmə kodu belə görünür:

// Profileri işə salın - biz həm prosessor vaxtını, həm də yaddaş sərfini hesablayacağıq xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// Profilli kod # Profileri dayandırın $xhprof_data = xhprof_disable(); # Hesabatı yadda saxlayın və ona baxmaq üçün bir link yaradın. "/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 = yeni XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Hesabat: 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 - bizə lazım olan kitabxanaları açdığımız qovluğa gedən yol.

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

Profil analizi belə görünür. Bu cədvəl profilli bütün funksiya çağırışlarını göstərir.

Biz cədvəlin başlıqlarına klikləməklə funksiyaları çeşidləyə bilərik.

Bəzi funksiyaların ya dəfələrlə, ya da çox uzun müddət icra edildiyini gördükdə, bu funksiyanın üzərinə klikləyə bilərik və bənzər bir cədvəl açılacaq, lakin sözügedən funksiyanın və funksiyanın çağırıldığı ana mühitin daxilində daxili çağırışlarla.

Göstəricilər:
Total Inc. Wall Time (soketlərdən, fayl sistemindən və digər resurslardan cavab gözləməyi nəzərə alaraq funksiyaların yerinə yetirilməsinə sərf olunan vaxt)
Total Inc. CPU (funksiyaların icrasına sərf olunan vaxt)
Total Inc. MemUse (yaddaş istifadəsi)
Total Inc. PeakMemUse (pik yaddaş istifadəsi)
Funksiya Zənglərinin Sayı

Hesabatı qrafik olaraq göstərmək imkanı da var. Ancaq bunu etmək üçün graphviz kitabxanasının quraşdırıldığından əmin olmalısınız:

Apt-get quraşdırma graphviz

Sonra profilinizdə göstərmək və voila etmək üçün klik etməlisiniz:

İndi kodu təhlil edə və təkmilləşdirə bilərsiniz.