Menü
Bedava
kayıt
ev  /  Kurulum ve konfigürasyon/ Hayali profiller php. xhprof ile php uygulamalarının profilini çıkarma ve hata ayıklama

Hayali profiller php. xhprof ile php uygulamalarının profilini çıkarma ve hata ayıklama

PHP kodunun profilini çıkarma

Er ya da geç, her birimiz eski kod ve optimizasyonu ile karşı karşıya kalırız. Böyle bir durumda hata ayıklayıcı ve profil oluşturucu - en iyi yardımcılar programcı. PHP ile çalışanlar için Derick Rethans sayesinde iyi bir araç var - xDebug. Runet'te bile xDebug ile ilgili birçok bilgi var, bu yüzden bu makale bununla ilgili olmayacak.

PHP için bir profil oluşturucudan bahsedince, hemen xDebug'u düşündüm (Zend'in özel araçlarını çoktan unuttum), ama bu sefer yanılmışım - XHProf hakkında konuşacağız.
XHProf

Bu profil oluşturucu özellikle Facebook için geliştirilmiştir ve kaynak Mart 2009'da açılmıştır.

Kurulum hızlı ve sorunsuz gerçekleşti.
wget pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2 / uzantı /
phpize etmek
./configure && make && make install
cd /usr/local/etc/php.d/
vim xhprof.ini
cd / usr / yerel /
vim başlığı.php
vim altbilgi.php
vim vb / php.ini
/etc/init.d/php-fpm yeniden başlatma
cp vhost.conf.template prof.my.conf
sed -i s / site / prof / prof.my.conf
vim prof.my.conf
/etc/init.d/nginx yeniden başlat

Bahsedilen yapılandırmaları analiz edelim

Xhprof.ini
extension = / usr / local / lib / php / extensions / no-debug-non-zts-20090626 / xhprof.so
xhprof.output_dir = "/ ana sayfa / maks / www / profil /"

Prof.my.conf - nginks yapılandırması - en standart.

sunucu (
80 dinle;
sunucu_adı prof.my;
karakter kümesi utf8;

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

Konum ~ \ .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'ı dahil et;

/Usr/local/src/xhprof-0.9.2/xhprof_html, profil oluşturucu için güzel bir WEBGUI oluşturan PHP kaynakları içerir.

Yani iki ana dosya hakkı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);
}
}

altbilgi.php
if (isset ($ _ COOKIE ["xhprof"])) (
if (extension_loaded ("xhprof")) (
$ profiler_namespace = "uygulamam"; // uygulamanız için ad alanı
$ xhprof_data = xhprof_disable();
$ xhprof_runs = yeni XHProfRuns_Default ();
$ run_id = $ xhprof_runs-> save_run ($ xhprof_data, $ profiler_namespace);

// XHProf UI kitaplıklarının url'si (ana bilgisayar adını ve yolunu değiştirin)
$ profiler_url = sprintf ("http://prof.my/index.php?run=%s&source=%s", $ run_id, $ profiler_namespace);
Eko<<Profil oluşturucu çıktısı
DIŞARI;
}
}

Şimdi web üzerinden herhangi bir PHP betiğini çalıştırıyoruz ve sol üst köşede profil oluşturucunun çıktısına bir bağlantı görüyoruz - prof.my ana bilgisayarı bunun için yaratıldı.

Lütfen dikkat - COOKIE için doğrulama kullanıyorum! Bu doğrulama ile profil oluşturucuyu üretim sunucusunda - gerçek verilerde ve gerçek yükte - güvenle kullanabilirsiniz.

Profil oluşturucu web arayüzü, her bir işlev hakkında bilgi içeren etiketleri görüntüler ve aşağıdaki bilgileri raporlar:

  • Her işleve yapılan çağrı sayısı
  • Duvar zamanı, işlevleri yürütmek için harcanan zaman (soketlerden, dosya sisteminden vb. yanıtları beklemek dahil).
  • CPU zamanı, işlevlerin yürütülmesi için harcanan zaman (soketlerden, dosya sisteminden vb. yanıtları beklemek hariç).
  • Hafıza kullanımı
  • En yüksek bellek kullanımı

Tabloyu herhangi bir parametreye göre sıralamak mümkündür.

Her fonksiyonla ilgili bilgiler, Dahil Edilen ve Münhasır olarak iki türe daha ayrılmıştır. Inclusive, çocuk aramaları tarafından kullanılan rakamları içerirken Exclusive içermez. Ayrıca, fonksiyonun ismine tıklayarak, sadece fonksiyon ve çağrıldığı ve çağrıldığı fonksiyonlar hakkında bilgi görmek mümkündür.

Sistemde GraphViz kuruluysa, profil oluşturucu sizin için bir çağrı grafiği çizecektir.

not Gelenekleri bozmadan: bu benim habr'daki ilk mesajım.

UPD: PHP'de yeniden gönderin.

Profil oluşturma sistemlerinin yardımıyla, php kodundaki hangi işlevlerin daha fazla CPU zamanı ve RAM tükettiği hakkında bilgi toplayabilir, yani bir php programında en yavaş ve en yoğun bellek kullanan yerleri belirleyebilirsiniz.

xhprof

XHProf - Facebook tarafından geliştirilen PHP profil oluşturucu.

Kurulum:

Yetenek kurulumu php-pear pecl kurulumu xhprof-0.9.4 echo "uzantı = xhprof.so"> /etc/php5/mods-available/xhprof.ini ln -s /etc/php5/mods-available/xhprof.ini / etc /php5/conf.d/xhprof.ini apachectl yeniden başlatma

Çalışmak için gerekli dosyalar dizinde bulunur / usr / paylaş / php... Ancak, hepsi değil, yalnızca php kodu ile. Raporların düzgün görüntülenmesi için jquery ve css gerekir. Github'daki depodan edinilebilirler:

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

Bundan sonra, veri toplamanın başlaması gereken yere php-script koduna satırı ekleyin:

Xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Veri toplama parametreleri parantez içinde belirtilmiştir. Bu durumda, işlemci üzerindeki yük ve RAM kullanımı hakkında veriler toplanacaktır. Bir parametre daha mümkündür XHPROF_FLAGS_NO_BUILTINS yerleşik işlevlerde hangi verilerin toplanmadığını kullanırken.

$ 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 "Rapor: http://domain.tld/xhprof_html/index.php? run = $ run_id & source = xhprof_test"; yankı "\ n";

Çizgide $ run_id tırnak işaretleri, isteğe bağlı olarak ayarlanabilen profilin adını gösterir.

İşlenen sonuç şöyle görünür:

parametreyi belirtirseniz XHPROF_FLAGS_NO_BUILTINS, ardından işlev çağrılarının sayısının önemli ölçüde azaldığını görebilirsiniz:

Tablo aşağıdaki bilgileri sağlar:

aramalar- fonksiyon çağrılarının sayısı,
duvar zamanı- dış kaynaklardan gelen yanıt için bekleme süresi de dahil olmak üzere işlevin toplam çalışma süresi,
İşlemci- işleme işlevlerine ne kadar zaman harcandığı,
MemKullanım- ne kadar RAM kullanıldı,
PeakMemKullanım- en yüksek bellek tüketimi.

Değiştiriciler şunlardır:

dahil- dahil - bu işlevden diğer işlevlere yapılan çağrıları dikkate alarak,
Hariç- özel - işlev çağrıları hariç.

Ayrıca toplam işlem süresi, kullanılan hafıza ve fonksiyon çağrı sayısı ile ilgili bilgiler tablonun üzerinde sunulmaktadır.

Ayrıca XHProf kırmızı ve yeşil ile gösterilen iki çalışma arasında farklı raporlar oluşturmanıza olanak tanır. Bu raporlar ile her kod değişikliğinden sonra yapılan iyileştirmelerin net bir resmini elde edebilirsiniz.

Böyle bir rapor almak için formun bir bağlantısını kullanmanız gerekir:

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

nerede run_id1 ve run_id2- tanımlayıcıları başlatın.

yüklerseniz grafik:

Yetenek yüklemesi graphviz

Ayrıca php profiler xhprof için veritabanlarını kullanan üçüncü taraf web arayüzleri vardır:

xDebug

xDebug Derick Rethans tarafından yazılmış bir profil oluşturma PHP kod hata ayıklayıcısıdır.

Kurulum:

Yum php5-xdebug yükleyin

Ardından yapılandırmayı düzenleriz:

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

satırları ekleyerek:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = Açık xdebug.profiler_output_dir = / tmp

Burada PHP profil oluşturucuyu açıyoruz ve profillerin yerleştirileceği dizini belirliyoruz. Profiller gibi isimlerle oluşturulur cachegrind.out *

Bir webgrind web istemcisi var: https://github.com/jokkedk/webgrind. Çok hızlı çalışmaz ancak küçük profilleri hızlı bir şekilde görüntülemenizi sağlar. Aslında bu, github'dan klonlanması gereken PHP kodudur:

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

bir dizin oluşturulacak ağ değirmeni herhangi bir sitenin dizinine kopyalamanız ve tarayıcıdan erişmeniz gereken . Ayrıca, yapılandırma dosyasındaki grafiklerin Debian'da çalışması için config.php yürütülebilir dosyanın yolunu düzeltmeniz gerekir grafik... Şöyle görünmelidir:

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

Ayrıca, saat dilimini düzeltebilirsiniz:

Statik $ defaultTimezone = "Avrupa / Moskova";

Başlıkta, bir profil seçebilir ve yerleşik işlevleri dikkate alıp almayacağınızı kutuyu işaretleyebilirsiniz. Tablonun kendisinde, işlevleri, çağrı sayısını, işlevin çalışma süresini ve bekleme süresini dikkate alarak süreyi görebilirsiniz. Fonksiyonlara daha derine inmek için üçgen oka tıklamanız yeterlidir. Benim durumumda, yeterince büyük profillerle (birkaç megabayttan), sonuç beklentisi gereksiz yere yüksekti. Muhtemelen, yeterince büyük profiller için yerel görüntüleme programlarını kullanmak daha iyidir.

Grafik şöyle görünebilir:

Bunu not et ağ değirmeniüretim sunucularında kullanılmamalıdır, çünkü yetki verilmemektedir, ancak aynı zamanda php'deki dosyaların koduna erişim vardır. Gerekirse en azından Apache temel yetkilendirmesini kullanın.

Linux altında olduğu gibi profilleri analiz etmek için programlar da vardır:

Profil oluşturma hakkında

Profil verileri, uygulamanızı geliştirmenize, yani belirli hedeflere ulaşmanıza, örneğin bellek tüketimini azaltmanıza, sayfa oluşturma süresini kısaltmanıza vb. yardımcı olabilir.

Profildeki bilgiler optimizasyonda başlangıç ​​noktasıdır: sonucun ne kadar sürede üretildiğini, ne kadar bellek kullanıldığını ve kaç işlev çağrısı yapıldığını söyler. Daha ayrıntılı verilerle bu metrikleri iyileştirebilirsiniz.

Örneğin, bir çerçeve kullanıyorsanız, çerçevenin bazı işlevlerini kullanmak, birkaç temel işlevin çağrılmasına neden olabilir. Bazı verileri birden çok kez okuyorsanız, sonucu bir değişkene kaydetmeye değer olabilir.

Ayrıca, profil oluşturucu PHP önbelleğe almanın nerede kullanılacağını anlamanıza yardımcı olabilir, örneğin APCu veya memcached.

Her şeyden önce, yürütülmesi en çok zaman alan işlevleri optimize etmeye değer. Her şey optimize edildikten ve iyileştirilecek başka bir şey yok gibi göründükten sonra, işlevleri çağrı sayısına göre sıralamaya ve düşürmeye çalışmaya değer. PHP hızlı olsa bile, işlevleri bu kadar sık ​​çağırmanız gerekip gerekmediğini düşünmeye değer mi?

Aşağıdaki durumlarla karşılaştığınızda, önbelleğe almayı düşünmeye değer:

  • Değişmez işlevler döngü içinde çağrılır,
  • Bazı içerikler iki kez oluşturulur,
  • Her seferinde değişmeyen içerik üretilir,
  • İçerik kullanılmasa bile oluşturulur.

Her şeyi önbelleğe almamalısınız, çünkü bellek de değerli bir kaynaktır. Sürekli eriştiğiniz verileri önbelleğe alın. Ayrıca, önbelleğe alma, tasarruf ettiğinden daha fazla kaynağı boşa harcıyorsa, önbelleğe alma pek mantıklı değildir.

Kodunuzda önbelleğe almaya ek olarak, web sunucusunu () ve ayrıca istemci tarafında önbelleğe almayı unutmayın. Doğru başlıklar kullanılarak birçok istek sunucuya ulaşmadan çözülebilir.

Zamanla, herhangi bir PHP programcısı, uygulamalarının düşük performans sorunuyla karşı karşıya kalır. Bu, belirli bir sayfanın yavaş yüklenmesi veya API'den çok uzun bir yanıt olabilir. Ve bazen frenlerin sebebinin ne olduğunu anlamak oldukça zor? Bazen daha zor durumlar olur: üretim sunucusunda api çok yavaştır, ancak geliştirmenin gerçekleştiği stantta her şey yolundadır. Ve neyin yanlış gittiğini anlamaya git. Bir üretim sunucusunda hata ayıklama, elbette, kontrol edilmemesi en iyisi olan aşırı bir umutsuzluktur.

Bu durumlar için uygulama profil oluşturucuları adı verilen özel araçlar icat edildi. PHP dünyasında bu rol xDebug ve xhprof tarafından oynanır. xhprof daha hafif, daha basit ve daha esnek bir araçtır ve bu nedenle tercih edilir. İlginç bir şekilde, xhprof 2009'da facebook tarafından geliştirildi, ancak onlardan hala resmi bir php7 desteği yok ve facebook HHVM'ye geçtiğinden beri artık orada olmayacak. Ancak, büyük php geliştiricileri topluluğu sayesinde, kurulumu herhangi bir zorluğa neden olmayan php7'yi destekleyen bir çatal ortaya çıktı.

Kurulum

Öncelikle xhprof'u gerçekten yüklemeniz gerekir:

Git klonu https://github.com/longxinH/xhprof xhprof cd xhprof / extension phpize ./configure --with-php-config = / usr / bin / php-config sudo make && sudo make install mkdir / var / tmp / xhprof

Uzantı = xhprof.so xhprof.output_dir = "/ var / tmp / xhprof"

/ var / tmp / xhprof klasörü yazma erişimine sahip olmalıdır, çünkü profil oluşturma sonuçları oraya kaydedilecektir.

PHP-FPM'yi yeniden yükleyebilir ve uzantının kurulu olup olmadığını kontrol edebilirsiniz. Bu basmakalıptır, phpinfo() fonksiyonunun çıktısı kullanılarak yapılabilir;

xhprof kurulu, kullanabilirsiniz. xhprof paketi, profil oluşturma raporlarını analiz etmek için çok kullanıcı dostu bir arayüz içerir. xhprof, hem metin hem de grafik biçiminde raporlar oluşturmanıza olanak tanır. xhprof kurulum klasörü, ihtiyacımız olan xhprof_html ve xhprof_lib'i içerir. Xhprof_html klasörü - GUI'ye erişim sağlar. xhprof_lib, kodu görüntülemek ve analiz etmek için bir kitaplıktır. Tüm xhprof klasörünü / var / www / xhprof dizinine taşımanız ve bunun için bir sanal ana bilgisayar yapılandırmanız önerilir, örneğin xhprof.loc. nginx'e örnek:

Sunucu (dinle 80; sunucu_adı xhprof.loc; karakter kümesi utf-8; root / var / www / xhprof / xhprof_html; index.php; konum / (try_files $ uri $ uri / /index.php?q=$uri&$args) ;) konum ~ \ .php (fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^ (. + \. php) (/.+) $; fastcgi_param SCRIPT_FILENAME $ belge_kökü $ fastcgi_script_name; fastcgi_params içerir;))

Ayrıca hosts dosyanızı güncellemeyi de hatırlamanız gerekir. Şimdi, tarayıcıya xhprof.loc URL'sini girdiğimizde, profil oluşturucunun web arayüzüne yönlendirileceğiz ve burada oluşturulan dosyalara erişilecektir.

Artık doğrudan kodunuzun profilini çıkarmaya başlayabilirsiniz.

Profil oluşturucuyu etkinleştirmek için, aşağıdaki işaretleri girdi olarak alan xhprof_enable () işlevini kullanın:

  • XHPROF_FLAGS_CPU - işlemci istatistiklerini düzeltmek için;
  • XHPROF_FLAGS_MEMORY - bellek için;
  • XHPROF_FLAGS_NO_BUILTINS - yerleşik işlevleri yok saymak için.

Profil oluşturucuyu devre dışı bırakmak için xhprof_disable () işlevini kullanın. Kolaylık olması için, bu işlevleri gerçekleştiren iki adet header.php ve footer.php betiği yazalım. header.php, profilli betiğin başında bulunur ve footer.php sonunda bulunur. footer.php ayrıca profil oluşturma verilerinin kaydedilmesiyle de ilgilenir.

header.php: if (extension_loaded ("xhprof")) (include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof/xhprof_lib/utils/xhpprof_runs.php xhprof_enable ( XHPROF_FLAGS_CPU);) footer.php: if (extension_loaded ("xhprof")) ($ profilerNamespace = "PROFILED_SCRIPT_NAME_ HERE"; $ xhprofData = xhprof_shprofRunIsable (); ($ xhprofData, $ profilerNamespace);)
kullanım

Header.php ve footer.php'yi profilli komut dosyasına bağladıktan sonra başlayabilirsiniz: profilli komut dosyası yürütüldüğünde, komut dosyasının çalışması hakkında bilgi içeren / var / tmp / xhprof dizinine kaydedilecek bir dosya oluşturulur. xhprof.loc web arayüzünü açtığınızda, oluşturulan bu dosya mevcut olacaktır:


Profil oluşturma dosyasını açtığınızda, uygulamanın çalışması hakkında ayrıntılı bilgi görünür, tüm çağrı yığını:


Sütunların anlamı:

  • aramalar- fonksiyon çağrılarının sayısı ve yüzdesi;
  • dahil duvar zamanı- iç içe geçmiş işlevlere sahip bir işlevin yürütme süresi;
  • Hariç duvar zamanı- iç içe işlevler olmadan bir işlevin yürütme süresi;
  • dahil İşlemci- iç içe geçmiş işlevlerle işlemci süresi;
  • Hariç İşlemci- İç içe işlevler olmadan CPU zamanı;
  • dahil MemKullanım- iç içe geçmiş işlevlerle bellek tüketimi;
  • Hariç MemKullanım- iç içe işlevler olmadan bellek tüketimi;
  • dahil PeakMemKullanım- iç içe işlevlerle maksimum bellek tüketimi;
  • Hariç PeakMemKullanım- iç içe işlevler olmadan maksimum bellek tüketimi.

Bağlantıyı takip ederseniz, en çok engellenen kodun görsel bir göstergesi olan güzel bir çağrı ağacı göreceksiniz. Bu olmadıysa, büyük olasılıkla graphviz kitaplığını yüklemeniz gerekir:

Apt-get install graphviz

Çizilmiş bir grafik örneği:

Benim durumumda, darboğaz veritabanı ile etkileşimdir.


Bir üretim sunucusunda xhprof kullanma

Başlangıçta xhprof, üretim sunucularında savaşta kodun profillenmesi amacıyla özel olarak geliştirildi. Savaşta php7 kodunun profilini çıkarmak için başka ücretsiz ve etkili bir araç yoktur, bu nedenle xhprof'un rakibi yoktur. Özellikle, günde bir milyon istek işleyen bir üretim sunucusunda xhprof kullanma deneyimim var. Php7 kullanıyor ve henüz bir sorun bulunamadı. Ancak, xhprof her istek için çalışmaz - çok fazla profil oluşturma dosyası oluşturulur. Profil oluşturucum yalnızca istek "XHPROF_ENABLE" başlığını içeriyorsa ve doğru olarak ayarlanmışsa başlar. Başka bir strateji de kullanabilirsiniz, örneğin, profil oluşturucuyu örneğin 1/1000 olasılıkla rastgele çalıştırın. O zaman resim de yeterince net olacaktır.


Çıktı

xhprof, php7 için resmi olarak desteklenmese de, php geliştiricileri için hala vazgeçilmez bir araç olmaya devam ediyor.

PHP uygulamalarının profillenmesine ve çalışma zamanı hata ayıklamasına yardımcı olmak için Xdebug adlı bir PHP uzantısı mevcuttur. Profil oluşturucuyu çalıştırırken, çıktı "cachegrind" adı verilen ikili biçimde bir dosyaya yazılır. Bu dosyaları analiz etmek için her platformda uygulamalar mevcuttur. Bu profil oluşturmayı gerçekleştirmek için uygulama kodu değişikliği gerekmez.

Profil oluşturmayı etkinleştirmek için uzantıyı yükleyin ve php.ini ayarlarını yapın. Bazı Linux dağıtımları standart paketlerle gelir (örneğin, Ubuntu'nun php-xdebug paketi). Örneğimizde, isteğe bağlı olarak bir request parametresine dayalı olarak profili çalıştıracağız. Bu, ayarları statik tutmamıza ve profil oluşturucuyu yalnızca gerektiği kadar açmamıza olanak tanır.

# php.ini settings # Her istek için açmak için 1'e ayarlayın xdebug.profiler_enable = 0 # Profil oluşturucuyu açmak için bir GET / POST parametresi kullanalım xdebug.profiler_enable_trigger = 1 # Geçeceğimiz GET / POST değeri ; herhangi bir değer için boş xdebug.profiler_enable_trigger_value = "" # Önbellek dosyalarını / tmp'ye çıkar, böylece sistemimiz daha sonra temizler xdebug.profiler_output_dir = "/ tmp" xdebug.profiler_output_name = "cachegrind.out.% p"

Ardından, profil oluşturmak istediğiniz uygulamanızın URL'sine istekte bulunmak için bir web istemcisi kullanın, ör.

Http://example.com/article/1?XDEBUG_PROFILE=1

Sayfa işlerken şuna benzer bir ada sahip bir dosyaya yazacaktır.

/tmp/cachegrind.out.12345

Varsayılan olarak dosya adındaki sayı, onu yazan işlem kimliğidir. Bu, xdebug.profiler_output_name ayarıyla yapılandırılabilir.

Yürütülen her PHP isteği / işlemi için bir dosya yazacağını unutmayın. Örneğin, bir form gönderisini analiz etmek istiyorsanız, GET isteğinin HTML formunu görüntülemesi için bir profil yazılacaktır. Formu işleyen ikinci isteği analiz etmek için XDEBUG_PROFILE parametresinin sonraki POST isteğine geçirilmesi gerekecektir. Bu nedenle, profil oluştururken, bir forma doğrudan curl komutunu çalıştırmak bazen daha kolaydır.

Çıktıyı Analiz Etme

Profil önbelleği yazıldıktan sonra veya Webgrind gibi bir uygulama tarafından okunabilir. Popüler bir PHP IDE olan PHPStorm, bu profil oluşturma verilerini de görüntüleyebilir.

Örneğin KCachegrind, aşağıdakileri içeren bilgileri görüntüler:

  • Yürütülen işlevler
  • Çağrı süresi, hem kendisi hem de sonraki işlev çağrıları dahil
  • Her işlevin çağrılma sayısı
  • Çağrı grafikleri
  • Kaynak koduna bağlantılar

Bakılacak şey

Açıkçası performans ayarlaması, her uygulamanın kullanım durumlarına çok özeldir. Genel olarak şunları aramak iyidir:

  • Görmeyi beklemeyeceğiniz aynı işleve tekrarlanan çağrılar. Verileri işleyen ve sorgulayan işlevler için bunlar, uygulamanızın önbelleğe alması için başlıca fırsatlar olabilir.
  • Yavaş çalışan fonksiyonlar. Uygulama zamanının çoğunu nerede geçiriyor? performans ayarının en iyi getirisi, uygulamanın en çok zaman harcayan kısımlarına odaklanmaktır.

Not: Xdebug ve özellikle profil oluşturma özellikleri çok kaynak gerektirir ve PHP'nin yürütülmesini yavaşlatır. Bunları bir üretim sunucusu ortamında çalıştırmamanız önerilir.

FirePHP, küçük php sınıfıyla birlikte, örneğin var_dump ve diğer hata ayıklama bilgileri gibi php'den verileri firebug konsoluna yayınlamanıza izin veren bir firebug uzantısıdır. herhangi bir şekilde uygulamanın mantığı.Resmi site: http://firephp.org/.

Ana fikir.

Genel profil oluşturma algoritması aşağıdaki gibidir:
  1. Sayfanın başında, xhprof_enable () kullanarak profil oluşturmayı etkinleştirin
  2. Sayfanın sonunda, xhprof_disable () kullanarak profil oluşturmayı kapatın ve toplanan verileri save_run () kullanarak kaydedin
  3. Ardından, firephp php sınıfını kullanarak, profil oluşturma verisinin bağlantısını istemci tarafına aktarıyoruz.
  4. Firebug konsolunda "ve ihtiyacımız olan bilgileri açın
  5. Biz mutluyuz :)
Ayrıca şunu da söylemek isterim ki bu fonksiyonları php scriptlerinize manuel olarak eklemeniz harika. Ancak geliştirme sırasında bu bilgilerin her zaman el altında olmasını ve aynı zamanda savaş sunucularına ulaşmamasını istiyorum. Bu sorunu şu şekilde çözüyoruz:

Projelerimizde, hemen hemen tüm scriptlerde, başlangıçta sınıf yükleyici, bağlantı fonksiyonları ve diğer gerekli şeyler ile çalışan bir dosya bağlanır. Bu nedenle, profil oluşturmanın dahil edilmesini bu dosyaya taşıdık. Hata ayıklama modunu istediğiniz zaman açıp kapatabilmek için, bir yapılandırma sabiti kontrolü ekledik ve bu kontrolleri proje oluştururken otomatik olarak kaldırılan bazı meta etiketlere sardık. Aynısı, firephp kullanarak profil oluşturmayı devre dışı bırakmak ve üstbilgilere bilgi yazmak için de geçerlidir - bu görevler, her php betiğinin sonunda çağrılan ve ayrıca meta etiketlere sarılmış bir işlev tarafından çözülür. Şuna benziyor:

// Bu sabitler uygulama yapılandırma dosyasına yazılır

/ ** Ortam çalışma modu * * /
define ("UYGULAMA_ENV", "dev"); // dev - hata ayıklama | pro - üretim
/ ** Profil oluşturucuya giden yol * /
tanımla ("XHPROF_ROOT", __DIR__. "/ExtProcs/debug/xhprof-0.9.2");

/***************************************************************************************
* Ardından, her betiğin başında yüklenen dosyada profil oluşturmayı çalıştırıyoruz.
* DEV_START ve DEV_END meta etiketlerimizdir, aralarındaki her şey montaj sırasında kesilir
***************************************************************************************/

// - DEV_START
// - hata ayıklama modunda, hata ayıklama kitaplıklarını bağlayın

// firephp yükle
require_once (__ DIR__. "/include/ExtProcs/debug/firephp/FirePHP.class.php");
// - profil oluşturucuyu yükle
"/xhprof_lib/utils/xhprof_lib.php");
require_once (XHPROF_ROOT. "/xhprof_lib/utils/xhprof_runs.php");
// Gerekli bayraklarla profil oluşturmayı başlatın. Bayrakların ayrıntılı açıklaması
// php.net/manual/ru/xhprof.constants.php adresinde bulunabilir
xhprof_enable (XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}
// - DEV_END

// Pekala, bu fonksiyon her betiğin sonunda çağrılır
// Çağrısı ayrıca DEV_START ve DEV_END içine sarılır

/**
* Profil oluşturma sonucuna bir bağlantı oluşturun ve konsola çıktısını alın
*/
dev_boot_Down işlevi () (
if (APPLICATION_ENV === "dev") (
// firephp örneğini başlat
$ firephp = FirePHP :: getInstance (true);
// Profil oluşturmayı kapatın ve verileri kaydedin
$ xhprof_data = xhprof_disable();
$ xhprof_runs = yeni XHProfRuns_Default ();
$ run_id = $ xhprof_runs-> save_run ($ xhprof_data, "xhprof_testing");
// Profil oluşturma verilerine bir bağlantı oluşturun ve konsola yazın
$ bağlantı = "http://". $ _SERVER ["HTTP_HOST"]. "/includes/ExtProcs/debug/xhprof-0.9.2/xhprof_html/index.php?run=($run_id)&source=xhprof_testing\n";
$ firephp-> info ($ link, "profil oluşturma verileri");
}
}


* Bu kaynak kodu, Kaynak Kodu İşaretleyici ile vurgulanmıştır.

Bu uzantıları yüklemenin ayrıntılarına girmeyeceğim çünkü burada her şey basit. Sadece bazı kurulum noktalarından bahsedeceğim. Xhproof, profil oluşturma verilerinin kaydedileceği klasörü gösteren yalnızca bir yapılandırma değişkeni olan xhprof.output_dir sağlar. Bu nedenle, altında php betiklerinin yürütüldüğü kullanıcının belirtilen dizine yazma izinlerine sahip olduğundan emin olun. Öyleyse php.ini'nize şöyle bir şey koyun:


uzantı = xhprof.so
xhprof.output_dir = "/ var / tmp / xhprof"

Çağrı grafikleri çizmek için nokta veya Graphviz gibi bir şey koymak da fena değil. MacOS X altında Graphviz'im var.

Yukarıdaki prosedürleri tamamladıktan sonra, komut dosyalarımızdan herhangi birinin profilini herhangi bir zamanda tarayıcıda açıp bakabildik.