Kıyaslama PHP sayfa yükleme süreleri

8 Cevap php

Nasıl (çeşitli farklı PHP ifadeleri ile) bir sayfayı yüklemek için alınan zaman ölçebilir?

Biraz burada mevcut istatistikler gibi - http://talks.php.net/show/drupal08/24

8 Cevap

En basit çok Apache ile temin edilen, Apache Bench (called ab) olduğu:

  • Bu komut satırı aracı
  • Bu ve URL, paralel olarak, pek çok istek gönderebilir
  • Ve raporlar zamanlamaları, hataları, ...

Seems to fit the kind of very simple reporting that's presented on your slide.
(It does actually report more than that)


If your needs ar ea bit more complex, Siege can be a good alternative.

Siege ilginç bir şey yerine sadece tek bir çalışma, bir dosyadan URL'lerin listesini alabilir olmasıdır.


An interesting thing with those tools is that you are not measuring only the time taken to execute a specific portion of code (like you would if using microtime directly in your PHP code), but you're getting the whole time that was required to serve the page.

Ayrıca, bu can bu kodun kendisi HTTP istek üzerine çalışan ve değil gibi daha adil bir PHP kodu daha benchmark,.

Bunu yapmanın pek çok yolu vardır. Ben şahsen şu şekilde microtime kullanarak bir hayranı oldum:

// Start of code
$time = microtime(true); // Gets microseconds

// Rest of code

// End of code
echo "Time Elapsed: ".(microtime(true) - $time)."s";

Bu size mikrosaniye doğruluk verecektir.

Eğer (Facebook bulmaca gibi) komut satırı yazıyorsanız, sadece zaman kullanabilirsiniz.

time php dancebattle.php ~/input.dat
Win

real    0m0.152s
user    0m0.142s
sys     0m0.012s

Ben (bir tarayıcıdan) izleme sayfa yükleme süreleri yöntemi hakkında unuttum. Sadece bunu yapmak için (Firefox için) Kundakçı gelen NET sekmesini kullanabilirsiniz. Bu çeşitli dosya yükler (AJAX, JS, CSS, Resimler, vb) izlemek izin verir.

  $ time curl http://www.example.com/

Not ağ gecikmesi de dahil olmak üzere bu kez bütün isteği. Ama bu istediğiniz istiyor olabilir?

Sen farkı hesaplamak ardından, microtime() işleme başında ve çıkış sonunda kullanabilir ve istediği eğer saniyeye dönüştürmek.

Bu sadece ona değil tüm sayfa yükleme süresi bağlantı gibi görünüyor, PHP tarafında için yürütme zamanı ölçecek, ama sen, örneğin, çeşitli yöntemler performansını karşılaştırmak mümkün olacak.

Try https://github.com/fotuzlab/appgati

Bu kod adımlarını tanımlamak için izin verir ve saati, bellek kullanımı, iki adım arasında sunucu yük vb raporlar.

Gibi bir şey:

    $appgati->Step('1');

    // Do some code ...

    $appgati->Step('2');

    $report = $appgati->Report('1', '2');
    print_r($report);

Örnek çıktı dizisi:

Array
(
    [Clock time in seconds] => 1.9502429962158
    [Time taken in User Mode in seconds] => 0.632039
    [Time taken in System Mode in seconds] => 0.024001
    [Total time taken in Kernel in seconds] => 0.65604
    [Memory limit in MB] => 128
    [Memory usage in MB] => 18.237907409668
    [Peak memory usage in MB] => 19.579357147217
    [Average server load in last minute] => 0.47
    [Maximum resident shared size in KB] => 44900
    [Integral shared memory size] => 0
    [Integral unshared data size] => 0
    [Integral unshared stack size] => 
    [Number of page reclaims] => 12102
    [Number of page faults] => 6
    [Number of block input operations] => 192
    [Number of block output operations] => 
    [Number of messages sent] => 0
    [Number of messages received] => 0
    [Number of signals received] => 0
    [Number of voluntary context switches] => 606
    [Number of involuntary context switches] => 99
)
  1. yöntemi tek: XDebug kullanın.
  2. method two: Put these statements all around your your scripts

    $TIMER['label']=microtime(1);
    /* some code */
    $TIMER['sql1_before']=microtime(1);
    a/* some code */
    $TIMER['sql1_after']=microtime(1);
    /* some code */

Bu gibi bir kod ile bunu ve daha sonra çıkışı:

  echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
  reset($TIMER);
  $start=$prev=current($TIMER);
  $total=end($TIMER)-$start;
  foreach($TIMER as $name => $value) {
    $sofar=round($value-$start,3);
    $delta=round($value-$prev,3);
    $percent=round($delta/$total*100);
    echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
    $prev=$value;
  }
    echo "</table>";

Thus, you'll get tetailed report on how your code goes. this action called profiling and take most important place in the optimization process.

Bu sunumda Çıktı Kuşatması (http://www.joedog.org/index/siege-home) kopyalanacak görünüyor.

"Gerçek dünya" performans bütün uygulama yığınını test etmek için bir başka oldukça yararlı bir araçtır Kundakçı olduğu (http://getfirebug.com/) ve YSlow (http://developer.yahoo.com/yslow/)

Eğer bir completely different from "Sayfa yükleme süreleri" ölçmek istediklerini söylüyorlar

  1. (PHP kodu bir iç zamanlayıcı ile ölçüldüğü gibi) zaman o sayfa oluşturmak için gereken

  2. ve (ab ile ölçülür) sunucudan yükünü

Bir sayfa yükleme süresi HTML ayrıştırmak ve tüm ilgili içerik (javascript dosyaları, css dosyaları, resim vb) almak için sunucusuna sonraki isteklerini yapmak için alınan zaman içermelidir.

Bu ölçüm aslında oldukça zordur. Düzgün yapmak için, tüm mantık istemci tarafında itmek gerekir - kullanıcı sonraki sayfada daha sonra, bir form bir linke tıkladığında veya gönderdiğinde javascript çerez bir Timestamped bırakın, onload yöntemini kullanarak (her şeyi yüklendikten sonra patlar ki) şimdiki zaman ile bu kez karşılaştırıldı. Daha sonra tekrar sunucuya bu ölçümü raporlama yöntemine ihtiyaç - Bir Ajax isteği kullanın veya sonraki isteği sunulmak üzere başka bir çerez olarak zaman saklayabilirsiniz.

Her müşteri tarafından gerekli dosyaları tarayıcı yan önbellek mevcut durumuna bağlı olacaktır unutmayın.

Eğer günlükleri tıklama akışlarını izole edebilir, o zaman bir metin / html içerik türü ve metin / html dışında içerik türü için son ardışık istek için bir talep arasındaki aralığı kontrol ederek iyi bir yaklaşım alabilirsiniz. Kullanıcıların simultaeneously birden fazla tarayıcı penceresi materyallar etkileşim halinde Ama istatistikler çarpık alacak.