Bir PHP betiğini profil oluşturmanın en kolay yolu


289

Bir PHP betiğinin profilini oluşturmanın en kolay yolu nedir?

Bana tüm işlev çağrılarının bir dökümünü ve ne kadar sürdüğünü gösteren bir şey yapmayı çok isterdim ama aynı zamanda belirli işlevlerin etrafına bir şey koymak konusunda da iyiyim.

Mikrotim fonksiyonu ile denemeyi denedim :

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

ama bu bazen olumsuz sonuçlar veriyor. Ayrıca, tüm kodumu serpiştirmek çok zor.


7
hey Mark, olumsuz yorumları çözmenize yardımcı olması için bu yorumu inceleyin: ro.php.net/manual/en/function.microtime.php#99524
Mina

16
@Midiane ile bağlantılı olan bu yorum bir anlam ifade etmiyor. Yorumcunun problemini çözüyor gibi görünüyorsa, bu bir tesadüf olmalıdır. Sadece kullanarak microtime(): gibi bazen değerlendiren ifadelere yol açacaktır "0.00154800 1342892546" - "0.99905700 1342892545"gibi değerlendirecektir: 0.001548 - 0.999057. @Luka'nın işaret ettiği microtime( TRUE )gibi, bu problemden kaçınmak için kullanabilirsiniz .
JMM

Yanıtlar:


104

PECL APD , aşağıdaki gibi uzantı kullanılır:

<?php
apd_set_pprof_trace();

//rest of the script
?>

Ardından, oluşturulan dosyayı kullanarak ayrıştırın pprofp.

Örnek çıktı:

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

Uyarı: APD'nin en son sürümü 2004 tarihli, uzantı artık korunmuyor ve çeşitli uyumluluk sorunları var (yorumlara bakın).


19
APD uzantısı php 5.4 üzerinde bozuk.
Skynet

User457015'e karşılık olarak, wordpress 3.8.1 ve PHP 5.3.10 çalıştıran bir web sitesinde çalışmayı başardım ve gayet iyi çalışıyor gibiydi.
Supernovah

1
@Supernovah, user457015 PHP 5.4 dedi. PHP 5.3 üzerinde bozulduğunu söylemedi.
magnus

@ user1420752 5.3.27 çalıştırıyorum ve orada da çalışmıyor. Tanımlanmamış bir işlev hatası alıyorum.
Fractaly

2
APD'nin son sürümü 2004'ten (!) PHP 7 ile çalışmaz. PHP 5 ile kurmaya çalışırken pecl install apd"config.m4" ile ilgili bir hata mesajı verir. Henüz denemediğim kaynaktan yüklemeniz gerekiyor gibi görünüyor. Cidden, PHP için Homebrew ile kurulan, minimum kurulum gerektiren ve kolayca okunabilir çıktı veren modern, güncellenmiş bir CLI tabanlı profil oluşturma aracı yok mu?
forthrin

267

Sanırım xdebug istiyorsun . Sunucuya kurun, açın, çıktıyı kcachegrind (linux için) veya wincachegrind (windows için) ile pompalayın ve tam zamanlamaları, sayıları ve bellek kullanımını detaylandıran birkaç güzel grafik gösterecektir (ancak bunun için başka bir uzantıya ihtiyaç duyar).

Cidden sallanır: D


6
Bunu uygulamak APD çözümünden çok daha kolay buldum. Ama belki de bunun nedeni APD'nin sistemimde düzgün bir şekilde derlenmemesidir. Ayrıca kcachegrind'in çizelgeleri vaat edildiği kadar güzeldi.
wxs

1
@EvilPuppetMaster, php'yi --enable-memory-limit ile derlemeniz veya daha modern bir php sürümü kullanmanız gerekir. Bkz. Xdebug.org/docs/basic#xdebug_memory_usage
mercutio

52
xdebug + webgrind hızlı ve kolay profil oluşturma için kısa sürede tercih ettiğim silahım oldu. code.google.com/p/webgrind
xkcd150

6
xdebug + xdebug_start_trace () + xdebug_stop_trace () = kazanmak
quano

3
XAMPP ile Windows üzerinde çalışmak çok kolaydı. Zaten xdebug için yapılandırılmış netbeans vardı. Yapmanız gereken tek şey php.ini dosyasındaki bir xdebug ayarını xdebug.profiler_output_name = "cachegrind.out.% T-% s" olarak değiştirmektir, aksi takdirde çıktı oluşturulmaz. Apache'nin yeniden başlatılmasını gerektirir.
beginner_

97

Uzantıya gerek yoktur, basit profil oluşturma için bu iki işlevi kullanın.

// Call this at each point of interest, passing a descriptive string
function prof_flag($str)
{
    global $prof_timing, $prof_names;
    $prof_timing[] = microtime(true);
    $prof_names[] = $str;
}

// Call this when you're done and want to see the results
function prof_print()
{
    global $prof_timing, $prof_names;
    $size = count($prof_timing);
    for($i=0;$i<$size - 1; $i++)
    {
        echo "<b>{$prof_names[$i]}</b><br>";
        echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
    }
    echo "<b>{$prof_names[$size-1]}</b><br>";
}

Aşağıda, her kontrol noktasında bir açıklama ile prof_flag () ve sonunda prof_print () öğesini çağıran bir örnek verilmiştir:

prof_flag("Start");

   include '../lib/database.php';
   include '../lib/helper_func.php';

prof_flag("Connect to DB");

   connect_to_db();

prof_flag("Perform query");

   // Get all the data

   $select_query = "SELECT * FROM data_table";
   $result = mysql_query($select_query);

prof_flag("Retrieve data");

   $rows = array();
   $found_data=false;
   while($r = mysql_fetch_assoc($result))
   {
       $found_data=true;
       $rows[] = $r;
   }

prof_flag("Close DB");

   mysql_close();   //close database connection

prof_flag("Done");
prof_print();

Çıktı şöyle görünür:

Başlangıç
   0.004303
DB Bağlan
   0.003518
sorgu gerçekleştirin
   0.000308
veri almak
   0.000009
Kapat DB
   0.000049
Yapıldı


37

Referansımı çevrimdışına çıkacak olan SO Documentation beta'dan yayınlayın.

XDebug ile profil oluşturma

PHP uygulamalarının profillenmesine ve çalışma zamanı hata ayıklamasına yardımcı olmak için Xdebug adlı bir PHP uzantısı vardır . Profil oluşturucuyu çalıştırırken, çıktı "cachegrind" adlı ikili biçimde bir dosyaya yazılır. Bu dosyaları analiz etmek için her platformda uygulamalar mevcuttur. Bu profili oluşturmak 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-xdebugpaketi). Örneğimizde isteğe bağlı olarak bir istek parametresine göre profili çalıştıracağız. Bu, ayarları sabit tutmamıza ve profil oluşturucuyu yalnızca gerektiği gibi açmamıza olanak tanır.

# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"

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

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

Sayfa işlendikçe, aşağıdakine 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, ayar ile yapılandırılabilir xdebug.profiler_output_name.

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 isterseniz, GET isteğinin HTML formunu görüntülemesi için bir profil yazılır. XDEBUG_PROFILE parametresinin, formu işleyen ikinci isteği analiz etmek için sonraki POST isteğine geçirilmesi gerekir. Bu nedenle profil oluştururken bazen doğrudan bir formu POST yapmak için kıvrılma çalıştırmak daha kolaydır.

Çıktıyı Analiz Etme

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

KCacheGrind

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

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

Bakılacak şey

Açıkçası performans ayarlama her uygulamanın kullanım durumlarına çok özeldir. Genel olarak aşağıdakileri aramak iyidir:

  • Görmeyi beklemediğ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 temel fırsatlar olabilir.
  • Yavaş çalışan fonksiyonlar. Uygulama zamanının çoğunu nerede geçiriyor? performans ayarındaki en iyi getirisi, uygulamanın en çok zaman harcayan bölümlerine odaklanmaktır.

Not : Xdebug ve özellikle profil oluşturma özellikleri çok kaynak yoğundur ve PHP'nin çalışmasını yavaşlatır. Bunların bir üretim sunucusu ortamında çalıştırılmaması önerilir.


3
Profil önbelleğini ayrıştırmak için araçlar listesine ekleme: PhpStorm ayrıca profil önbelleğini önizlemek için bir araca sahiptir
peterchaula

1
@peter PHPStorm'un bu özelliği olduğunu unuttum. Belgelere bir link ekledim. Teşekkürler!
Matt S

Doğrudan sunucuda metin (GUI olmayan) raporu almanın herhangi bir yolu var mı?
Alexander Shcheblikin

1
@ Mark bunu cevap olarak işaretler misiniz lütfen. Şu anki cevap, yayınlanmış olsa bile güncelliğini yitirmiş ve yıllardır çalışmadı.Bu işe yarıyor ve daha iyi bir yöntem bilmiyorum.
Mawg, Monica

24

Mikro saatlerin çıkarılması size olumsuz sonuçlar veriyorsa, işlevi argüman true( microtime(true)) ile kullanmayı deneyin . İle true, işlev bir dize yerine bir kayan nokta döndürür (bağımsız değişken olmadan çağrıldığı gibi).


24

Dürüst olmak gerekirse, profilleme için NewRelic kullanmanın en iyisi olduğunu savunacağım.

Bu, çalışma zamanını hiç yavaşlatmayan bir PHP uzantısıdır ve sizin için izlemeyi yaparlar, iyi bir detaya izin verir. Pahalı versiyonda ağır detaya inmeye izin veriyorlar (ancak fiyatlandırma modellerini karşılayamıyoruz).

Yine de, serbest / standart planla bile, düşük asılı meyvelerin çoğunun olduğu açık ve basittir. Ayrıca DB etkileşimleri hakkında da bir fikir verebilir.

Profil oluştururken arayüzlerden birinin ekran görüntüsü


16
Yeni Relic umut verici görünüyor. Ancak, Gizlilik Politikasının "Uygulama Verilerinizin Açıklanması" kısmı beni anında itti. Imho, özel kaynak kod parçalarını üçüncü taraflarla paylaşmak biraz fazla.
Cengiz Can

8
Burada savunmaya geçmemekle birlikte, "Uygulama Verileri", uygulama kaynak kodunuz değil, yalnızca performans bilgisi ve sistem yapılandırma bilgisidir.
David Shields

Köknar benim yeni kalıntı benim "WebTransaction" zaman% 99 olarak gösteriyor ve "ApplicationTraces" için pro hesabı yok
Karthik T

1
Kaydolmayı deneyin: newrelic.com/rackspace <size ücretsiz "standart"
vermelidir

16

Zavallı adamın profili, uzantıya gerek yok. Yuvalanmış profilleri ve toplamın yüzdesini destekler:

function p_open($flag) {
    global $p_times;
    if (null === $p_times)
        $p_times = [];
    if (! array_key_exists($flag, $p_times))
        $p_times[$flag] = [ 'total' => 0, 'open' => 0 ];
    $p_times[$flag]['open'] = microtime(true);
}

function p_close($flag)
{
    global $p_times;
    if (isset($p_times[$flag]['open'])) {
        $p_times[$flag]['total'] += (microtime(true) - $p_times[$flag]['open']);
        unset($p_times[$flag]['open']);
    }
}

function p_dump()
{
    global $p_times;
    $dump = [];
    $sum  = 0;
    foreach ($p_times as $flag => $info) {
        $dump[$flag]['elapsed'] = $info['total'];
        $sum += $info['total'];
    }
    foreach ($dump as $flag => $info) {
        $dump[$flag]['percent'] = $dump[$flag]['elapsed']/$sum;
    }
    return $dump;
}

Misal:

<?php

p_open('foo');
sleep(1);
p_open('bar');
sleep(2);
p_open('baz');
sleep(3);
p_close('baz');
sleep(2);
p_close('bar');
sleep(1);
p_close('foo');

var_dump(p_dump());

Verim:

array:3 [
  "foo" => array:2 [
    "elapsed" => 9.000766992569
    "percent" => 0.4736904954747
  ]
  "bar" => array:2 [
    "elapsed" => 7.0004580020905
    "percent" => 0.36841864946596
  ]
  "baz" => array:2 [
    "elapsed" => 3.0001420974731
    "percent" => 0.15789085505934
  ]
]

13

PECL XHPROF da iç içe geçmiş görünüyor. Raporları ve oldukça basit belgeleri görüntülemek için tıklanabilir HTML arayüzüne sahiptir . Yine de test etmedim.


Çok fazla sevgi almıyor gibi görünüyor. Son güncelleme 2009, 5.3, 5.4 ve ötesi için PEAR paketi yok ...
dland

1
Facebook php 5.5 aracılığıyla bir çatal oluşturdu github.com/facebook/xhprof
borkencode

Bazı ek ayarlamalar öneren bu çatalı da kontrol edin: github.com/preinheimer/xhprof
Fedir RYKHTIK

xhprof.io , XHProf kullanılarak toplanan veriler için GUI'nin yanı sıra geçmiş analiz amacıyla veriyi veritabanında saklayabilme olanağı sağlar. İkinci uygulamanın yazarıyım.
Gajus

10

Profil oluşturma için phpDebug kullanmayı seviyorum. http://phpdebug.sourceforge.net/www/index.html

Dahil edilen tüm dosyaların yanı sıra kullanılan herhangi bir SQL için tüm zaman / bellek kullanımını çıktılar. Açıkçası, en iyi soyutlanmış kod üzerinde çalışır.

İşlev ve sınıf profili oluşturma için microtime()+ get_memory_usage()+ kullanacağım get_peak_memory_usage().



6

Kıyaslama için, örneğin örnekte olduğu gibi, armut Benchmark paketini kullanıyorum. Ölçmek için işaretler ayarlarsınız. Sınıf ayrıca birkaç sunum yardımcısı sağlar veya verileri uygun gördüğünüz gibi işleyebilirsiniz.

Aslında başka bir sınıfa __destruct yöntemi ile sarılmış var. Bir komut dosyası çıktığında, çıkış syslog'a log4php aracılığıyla kaydedilir, bu yüzden çalışmak için çok fazla performans verim var.


3

XDebug kararlı değil ve her zaman belirli php sürümü için mevcut değildir. Örneğin bazı sunucularda hala php-5.1.6 çalıştırıyorum, - RedHat RHEL5 ile birlikte geliyor (ve btw hala tüm önemli sorunlar için güncellemeler alıyor) ve son XDebug bu php ile bile derlemiyor. Bu yüzden DBG hata ayıklayıcısına geçiş ile sona erdi Onun php kıyaslama fonksiyonları, yöntemleri, modülleri ve hatta hatları için zamanlama sağlar.


2

Hepiniz kesinlikle bu yeni php profiler kontrol etmelisiniz.

https://github.com/NoiseByNorthwest/php-spx

Php profilers nasıl toplama ve sonuç yolunu yeniden tanımlar. Sadece belirli sayıda işlev çağrısı ve yürütmek için harcanan toplam süreyi çıkarmak yerine, PHP-SPX tüm istek yürütme zaman çizelgesini mükemmel okunabilir bir şekilde sunar. Aşağıda sağladığı GUI ekranı bulunmaktadır.

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.