Bir PHP komut dosyası profile basit yolu

oy
245

Bir PHP komut dosyası profile en kolay yolu nedir?

Bunun beni her işlev çağrılarının dökümü ve ne kadar süre aldı gösterir şey teyel isterdim ama aynı zamanda özel fonksiyonları etrafında şey koyarak ile iyiyim.

Ben deneme çalıştı microtime fonksiyonu:

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

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

ama bu bazen bana olumsuz sonuçlar verir. Artı hepsi benim kodu üzerinde o serpin için sorun bir çok şey.

Oluştur 21/08/2008 saat 21:40
kaynak kullanıcı
Diğer dillerde...                            


13 cevaplar

oy
8

Ben profilleme için phpDebug kullanmak ister. http://phpdebug.sourceforge.net/www/index.html

Hepsi dahildir dosyaların yanı sıra kullanılan herhangi SQL için her zaman / bellek kullanımını verir. Açıkçası, soyutlanmış koda üzerinde iyi çalışır.

Fonksiyon ve sınıf profilleme için sadece kullanacağız microtime()+ get_memory_usage()+ get_peak_memory_usage().

Cevap 21/08/2008 saat 21:45
kaynak kullanıcı

oy
245

Sen istemek xdebug sanırım. , Aç, sunucuya yüklemeyi yoluyla çıkışı pompa KCacheGrind (linux için) ya da wincachegrind (pencereler için) ve size birkaç güzel grafikler göstereceğiz detay kesin zamanlamalar, sayıları ve bellek kullanımı olduğunu (ama olacak ) Bunun için başka bir uzantı gerekir.

Cidden, rocks: D

Cevap 21/08/2008 saat 21:46
kaynak kullanıcı

oy
101

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

<?php
apd_set_pprof_trace();

//rest of the script
?>

Sonra kullanılarak oluşturulan dosyayı ayrıştırmak pprofp.

Örnek çıkışı:

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
Cevap 21/08/2008 saat 22:04
kaynak kullanıcı

oy
4

Kıyaslama için, örnekte olduğu gibi, kullandığım armut Benchmark paketini. Sen ölçmek için işaretleri ayarlayın. Sınıf da birkaç sunum yardımcıları sağlar veya size uygun biçimde verileri işleyebilir.

Aslında bu bir __destruct yöntemiyle başka sınıfta sarılı var. Bir komut dosyası çıktığında, çıkış syslog'a log4php aracılığıyla kaydedilir, bu yüzden çalışmak performans çok veri var.

Cevap 22/08/2008 saat 16:43
kaynak kullanıcı

oy
10

PECL XHPROF çok interensting görünüyor. It has tıklanabilir HTML arayüzünü inceleyen raporlar ve oldukça basit için dokümantasyon . Gerçi bunu test etmek henüz.

Cevap 23/06/2011 saat 12:26
kaynak kullanıcı

oy
22

Microtimes çıkarılarak size olumsuz sonuçlar verirse, argüman ile işlevini kullanmayı deneyin true( microtime(true)). Ile true, işlev yerine bir dize bir şamandıra döndürür (bu kanıtlar olmaksızın denir eğer yaptığı gibi).

Cevap 10/01/2012 saat 17:47
kaynak kullanıcı

oy
2

XDebug kararlı değildir ve her zaman belli php sürümü için değil. Bazı sunucularda Örneğin ben hala, php-5.1.6 çalıştırmak - hatta bu php ile derleme değil RedHat RHEL5 (söyliyim hala tüm önemli sorunlarına ilişkin güncellemeleri alır) ve son xdebug ile aşağıdakiler. Bu yüzden geçiş ile sona erdi DBG'yi ayıklayıcıya Onun php kıyaslama fonksiyonları, yöntemler, modülleri ve hatta hatları için zamanlama sağlamaktadır.

Cevap 04/04/2013 saat 08:48
kaynak kullanıcı

oy
21

Açıkçası, profilleme için NewRelic kullanarak en iyi olduğunu iddia edeceğim.

O hiç çalışma zamanını yavaşlatmak görünmüyor PHP uzantısı ve onlar aşağı iyi matkap izin sizin için izleme yapmak. Pahalı sürümde bunlar (ama biz onların fiyatlandırma modelini göze alamaz) ağır matkap aşağı izin verir.

hatta ücretsiz standart / planla Yine, düşük asılı meyve çoğu nerede açık ve basit. Ben de çok size DB etkileşimlerini bir fikir verebilir böyle.

arayüzleri birinin ekran görüntüsü profilleme

Cevap 19/12/2013 saat 03:05
kaynak kullanıcı

oy
69

Hiçbir uzantıya ihtiyaç vardır, sadece basit profilleme için bu iki işlevlerini 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>";
}

Burada bir örnek sonunda her bir kontrol noktasında açıklama ve prof_print () ile prof_flag () 'u çağırarak gibidir:

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ı aşağıdaki gibidir:

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

Cevap 12/03/2015 saat 23:43
kaynak kullanıcı

oy
5

Ben meydan okurcasına verecekti Blackfire bir deneyin.

Bu VirtualBox kullanıyorum araya getirdik yoktur puphpet çatal çekinmeyin ve / veya gerekirse dağıtmak lütfen Blackfire ile coms farklı php çerçeveler test etmek, :)

https://github.com/webit4me/PHPFrameworks

Cevap 29/09/2015 saat 21:04
kaynak kullanıcı

oy
6

Kötü adamın profilleme, hiçbir uzantıları gerekli. İç içe profilleri ve toplam 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;
}

Örnek:

<?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
  ]
]
Cevap 07/09/2016 saat 20:36
kaynak kullanıcı

oy
11

çevrimdışı gidiyor SO Belgeler beta benim referans gönderme dile.

Xdebug ile profil oluşturma

PHP bir uzantısı Xdebug yardımcı kullanılabilir denilen PHP uygulamaları profilleme yanı sıra çalışma zamanı hata ayıklama. Profilcisini çalıştırırken, çıkış "cachegrind" adlı bir ikili formatta bir dosyaya yazılır. Başvurular bu dosyaları analiz etmek için her platformda mevcuttur. Hiçbir uygulama kodu değişiklikler bu profil oluşturmaları gereklidir.

, Profil oluşturma özelliği sağlar uzantısı yüklemek ve php.ini'yi ayarlarınızı yapın. Bazı Linux dağıtımları standart paketler (örneğin Ubuntu'nun ile gelen php-xdebugpaketi). Örneğimizde isteğe bağlı olarak bir istek parametresi temelinde profili çalışacaktır. Bu statik ayarları saklamak ve gerektiğinde yalnızca profilcisine açmak için bize izin verir.

// 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"

Sonraki istediğiniz uygulamanın URL'ye bir istek profil yapmak için bir web istemcisi kullanıyorsanız, mesela

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

sayfa işlerken bu benzer bir ada sahip bir dosyaya yazacak

/tmp/cachegrind.out.12345

Varsayılan olarak dosya numaralı yazdım süreç kimliğidir. Bu ile yapılandırılabilir xdebug.profiler_output_nameayarı.

yürütüldüğünde her PHP isteği / süreç için bir dosya yazacak unutmayın. Bir form yazı analiz etmek istiyorsanız Yani, örneğin, bir profil HTML formu görüntülemek için GET isteği için yazılır. XDEBUG_PROFILE parametresi formu işleyen ikinci bir istemin analiz etmek için onu takip eden isteğe geçirilecek gerekir. Nedenle bazen doğrudan bir form POST bukle çalıştırmak daha kolaydır profilleme zaman.

Yazılı kez profili önbellek gibi bir uygulama tarafından okunabilir KCacheGrind veya Webgrind .

KCacheGrind

Bu da dahil olmak üzere bilgileri görüntüler:

  • Fonksiyonlar infaz
  • Çağrı süresi, kendisi hem de daha sonraki işlev çağrıları dahil
  • kaç kez her fonksiyon denir
  • Çağrı grafikleri
  • Kaynak kodu linkler

Açıkçası performans ayarlama her uygulamanın kullanım örneklerine çok özeldir. Genelde aramaya iyidir:

  • Gördüğünüz istemem aynı işleve Tekrarlanan çağrılar. işlemek fonksiyonları ve sorgu verileri için bu önbelleğe uygulamanız için asal fırsat olabilir.
  • fonksiyonları Yavaş çalışan. Nerede uygulaması, çoğu zaman harcıyor? performans ayarlama en iyi ödeme en çok zaman tüketen uygulama bu parçaların üzerinde duruluyor.

Not Xdebug ve özellikle onun profilleme özellikleri, çok yoğun kaynak ve PHP yürütme yavaşlatmak edilir. Bir üretim sunucu ortamında bu çalışmaz önerilir.

Cevap 04/08/2017 saat 17:27
kaynak kullanıcı

oy
0

Hepiniz kesinlikle bu yeni php profilcisini kontrol etmelidir.

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

Bu php profilleyicilerini toplar ve hediyelerin sonucu nasıl şeklini değiştirerek. PHP-SPX gayet okunaklı bir şekilde istek yürütme bütün zaman çizelgesi sunulur - Yerine belirli fonksiyon çağrıları ve onu yürütme harcanan toplam zaman sadece toplam sayı çıkışında. Aşağıda sağladığı GUI ekranıdır.

Burada görüntü açıklama girin

Cevap 03/02/2020 saat 12:56
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more