Apa cara termudah untuk membuat profil skrip PHP?
Saya senang sekali menempelkan sesuatu yang menunjukkan kepada saya dump semua panggilan fungsi dan berapa lama waktu yang saya butuhkan, tetapi saya juga setuju dengan menempatkan sesuatu di sekitar fungsi tertentu.
Saya mencoba bereksperimen dengan fungsi mikrotim :
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
tapi itu terkadang memberi saya hasil negatif. Ditambah lagi, banyak masalah untuk memercikkan seluruh kode saya.
microtime()
akan menyebabkan kadang-kadang mengevaluasi ekspresi seperti:"0.00154800 1342892546" - "0.99905700 1342892545"
, yang akan mengevaluasi seperti:0.001548 - 0.999057
. Anda dapat menggunakanmicrotime( TRUE )
untuk menghindari masalah itu, seperti yang ditunjukkan oleh @luka.Jawaban:
The PECL APD ekstensi digunakan sebagai berikut:
Setelah itu, parsing file yang dihasilkan menggunakan
pprofp
.Contoh output:
Peringatan: rilis APD terbaru bertanggal 2004, ekstensi tidak lagi dipertahankan dan memiliki berbagai masalah kompabilitas (lihat komentar).
sumber
pecl install apd
, itu memberikan pesan kesalahan tentang "config.m4". Sepertinya Anda harus menginstalnya dari sumber, yang belum saya coba. Serius, bukankah ada alat profilinging modern berbasis CLI yang diperbarui untuk PHP yang diinstal dengan Homebrew, membutuhkan pengaturan minimal dan memberikan hasil yang mudah dibaca manusia?Anda ingin xdebug, saya pikir. Instal di server, hidupkan, pompa output melalui kcachegrind (untuk linux) atau wincachegrind (untuk windows) dan itu akan menunjukkan kepada Anda beberapa grafik cantik yang merinci waktu, jumlah, dan penggunaan memori yang tepat (tetapi Anda akan perlu ekstensi lain untuk itu).
Itu batu, serius: D
sumber
Tidak diperlukan ekstensi, cukup gunakan dua fungsi ini untuk pembuatan profil sederhana.
Berikut ini adalah contoh, memanggil prof_flag () dengan deskripsi di setiap pos pemeriksaan, dan prof_print () di akhir:
Output terlihat seperti ini:
Mulai
0,004303
Terhubung ke DB
0,003518
Lakukan kueri
0,000308
Ambil data
0,000009
Tutup DB
0,000049
Selesai
sumber
Lintas memposting referensi saya dari SO Documentation beta yang sedang offline.
Pembuatan profil dengan XDebug
Perpanjangan ke PHP yang disebut Xdebug tersedia untuk membantu dalam pembuatan profil aplikasi PHP , serta debugging runtime. Saat menjalankan profiler, output ditulis ke file dalam format biner yang disebut "cachegrind". Aplikasi tersedia di setiap platform untuk menganalisis file-file ini. Tidak ada perubahan kode aplikasi yang diperlukan untuk melakukan profil ini.
Untuk mengaktifkan profil, instal ekstensi dan sesuaikan pengaturan php.ini. Beberapa distribusi Linux datang dengan paket standar (mis.
php-xdebug
Paket Ubuntu ). Dalam contoh kami, kami akan menjalankan profil secara opsional berdasarkan parameter permintaan. Ini memungkinkan kami untuk menjaga pengaturan statis dan mengaktifkan profiler hanya sesuai kebutuhan.Selanjutnya gunakan klien web untuk membuat permintaan ke URL aplikasi Anda yang ingin Anda profil, misalnya
Saat halaman memprosesnya akan menulis ke file dengan nama yang mirip dengan
Secara default nomor dalam nama file adalah id proses yang menulisnya. Ini dapat dikonfigurasi dengan
xdebug.profiler_output_name
pengaturan.Perhatikan bahwa itu akan menulis satu file untuk setiap permintaan / proses PHP yang dieksekusi. Jadi, misalnya, jika Anda ingin menganalisis posting formulir, satu profil akan ditulis untuk permintaan GET untuk menampilkan formulir HTML. Parameter XDEBUG_PROFILE perlu diteruskan ke permintaan POST berikutnya untuk menganalisis permintaan kedua yang memproses formulir. Karenanya saat membuat profil, kadang-kadang lebih mudah menjalankan curl ke POST suatu formulir secara langsung.
Menganalisa Output
Setelah ditulis, cache profil dapat dibaca oleh aplikasi seperti KCachegrind atau Webgrind . PHPStorm, IDE PHP populer, juga dapat menampilkan data profil ini .
KCachegrind, misalnya, akan menampilkan informasi termasuk:
Apa yang dicari
Tentunya penyetelan kinerja sangat spesifik untuk setiap kasus penggunaan aplikasi. Secara umum ada baiknya mencari:
Catatan : Xdebug, dan khususnya fitur profilnya, sangat padat sumber daya dan memperlambat eksekusi PHP. Disarankan untuk tidak menjalankan ini di lingkungan server produksi.
sumber
Jika mengurangi microtimes memberi Anda hasil negatif, coba gunakan fungsi dengan argumen
true
(microtime(true)
). Dengantrue
, fungsi mengembalikan float bukan string (seperti halnya jika ia dipanggil tanpa argumen).sumber
Jujur, saya akan berpendapat bahwa menggunakan NewRelic untuk profil adalah yang terbaik.
Ini adalah ekstensi PHP yang tampaknya tidak memperlambat runtime sama sekali dan mereka melakukan pemantauan untuk Anda, memungkinkan penelusuran yang layak. Dalam versi yang mahal, mereka mengizinkan pencarian yang berat (tapi kami tidak mampu membeli model harganya).
Namun, bahkan dengan paket gratis / standar, jelas dan sederhana di mana sebagian besar buah yang menggantung rendah. Saya juga suka itu bisa memberi Anda ide tentang interaksi DB juga.
sumber
Profil orang miskin, tidak perlu ekstensi. Mendukung profil bersarang dan persentase total:
Contoh:
Hasil:
sumber
PECL XHPROF juga terlihat menarik. Ini memiliki antarmuka HTML yang dapat diklik untuk melihat laporan dan dokumentasi yang cukup mudah . Saya belum mengujinya.
sumber
Saya suka menggunakan phpDebug untuk profil. http://phpdebug.sourceforge.net/www/index.html
Ini menghasilkan semua waktu / penggunaan memori untuk SQL apa pun yang digunakan serta semua file yang disertakan. Jelas, ini bekerja paling baik pada kode yang diabstraksi.
Untuk fungsi dan profil kelas saya hanya akan menggunakan
microtime()
+get_memory_usage()
+get_peak_memory_usage()
.sumber
Saya menantang untuk mencoba BlackFire .
Ada virtualBox ini yang saya kumpulkan menggunakan puphpet , untuk menguji kerangka kerja php yang berbeda yang berasal dari BlackFire, silakan garpu dan / atau distribusikan jika diperlukan :)
https://github.com/webit4me/PHPFrameworks
sumber
Untuk pembandingan, seperti pada contoh Anda, saya menggunakan paket Benchmark pir . Anda menetapkan spidol untuk diukur. Kelas ini juga menyediakan beberapa pembantu presentasi, atau Anda dapat memproses data sesuai keinginan Anda.
Saya sebenarnya membungkusnya dengan kelas lain dengan metode __destruct. Ketika skrip keluar, output dicatat melalui log4php ke syslog, jadi saya punya banyak data kinerja untuk bekerja.
sumber
XDebug tidak stabil dan tidak selalu tersedia untuk versi php tertentu. Sebagai contoh pada beberapa server saya masih menjalankan php-5.1.6, - itulah yang datang dengan RedHat RHEL5 (dan btw masih menerima pembaruan untuk semua masalah penting), dan XDebug baru-baru ini bahkan tidak dapat dikompilasi dengan php ini. Jadi saya berakhir dengan beralih ke DBG debugger Pembandingan php- nya menyediakan waktu untuk fungsi, metode, modul dan bahkan garis.
sumber
Anda semua harus memeriksa profiler php baru ini.
https://github.com/NoiseByNorthwest/php-spx
Ini mendefinisikan kembali cara bagaimana profiler php mengumpulkan dan menyajikan hasilnya. Alih-alih hanya menampilkan total jumlah panggilan fungsi tertentu dan total waktu yang dihabiskan untuk mengeksekusinya - PHP-SPX menyajikan seluruh garis waktu eksekusi permintaan dengan cara yang mudah dibaca. Di bawah ini adalah layar GUI yang disediakannya.
sumber