php-memprof adalah ekstensi profil memori yang cepat dan akurat untuk PHP yang dapat digunakan untuk menemukan penyebab kebocoran memori.
Ekstensi ini melacak alokasi dan pelepasan blok memori untuk melaporkan jumlah memori yang bocor oleh setiap fungsi, metode, atau file dalam suatu program.
Melaporkan memori yang tidak dibebaskan pada titik mana pun dalam program
Membuang profil dalam format callgrind, pprof, atau array mentah
Dapat melacak memori yang dialokasikan oleh PHP itu sendiri serta malloc asli
php-memprof bergantung pada libjudy dan sys/queue.h.
Pada distribusi berbasis Debian, dependensi dapat diinstal dengan:
# Debian or Ubuntu: apt install libjudy-dev
Di Alpen:
# Alpine apk add judy-dev bsd-compat-headers
Di MacOS:
# install libjudy dependency: brew install traildb/judy/judy
Pastikan untuk menginstal dependensi, lalu:
pecl install memprof
Di MacOS: JUDY_DIR=$(brew --prefix traildb/judy/judy) pecl install memprof
Catatan Jika libjudy diinstal di jalur non-standar (bukan /usr atau /usr/local), silakan gunakan metode instalasi manual di bawah.
Pastikan untuk menginstal dependensi, lalu:
Unduh sumbernya dan jalankan perintah berikut di direktori sumber:
phpize ./configure make make install
Catatan Jika libjudy diinstal di jalur non-standar (bukan /usr atau /usr/local), Anda dapat menentukannya seperti ini:
./configure --with-judy-dir=/opt/homebrew/Cellar/judy/1.0.5
Pengguna Arch Linux mungkin lebih suka menginstal paket php-memprof tidak resmi dengan makepkg
atau pembantu AUR pilihan mereka. Jika menggunakan yay
, misalnya:
yay -S php-memprof
Silakan laporkan masalah apa pun dengan paket ini di halaman AUR-nya.
Ekstensi dapat dimuat pada baris perintah, hanya untuk satu skrip:
php -dextension=memprof.so script.php
Atau secara permanen, di php.ini:
extension=memprof.so
Ekstensi ini tidak memiliki overhead saat tidak membuat profil, sehingga dapat dimuat secara default di lingkungan pengembang.
Cara paling sederhana untuk menggunakan memprof
adalah membiarkannya menyimpan profil memori ketika batas memori program terlampaui.
dump_on_limit
Pembuatan profil dalam mode dump_on_limit
diaktifkan saat permintaan dimulai jika salah satu hal berikut ini benar:
Variabel lingkungan MEMPROF_PROFILE
sama dengan dump_on_limit
$_GET["MEMPROF_PROFILE"]
sama dengan dump_on_limit
$_POST["MEMPROF_PROFILE"]
sama dengan dump_on_limit
Untuk skrip baris perintah, kita dapat mengatur variabel lingkungan:
MEMPROF_PROFILE=dump_on_limit php test.php
Untuk skrip web, kita dapat mengatur variabel $_GET
:
curl http://127.0.0.1/test.php?MEMPROF_PROFILE=dump_on_limit
Atau variabel $_POST
:
curl -d MEMPROF_PROFILE=dump_on_limit http://127.0.0.1/test.php
Catatan Fungsi
memprof_enabled_flags()
dapat dipanggil untuk memeriksa apakah pembuatan profil saat ini diaktifkan dalam modedump_on_limit
.
Dalam mode ini, memprof
akan secara otomatis menyimpan profil jika program melebihi batas memori (ketika PHP memicu kesalahan seperti Fatal error: Allowed memory size of 15728640 bytes exhausted (tried to allocate 1024 bytes)
kesalahan).
Secara default, profil disimpan dalam file bernama memprof.callgrind.*
di /tmp
atau C:WindowsTemp
.
Cara yang disarankan untuk memvisualisasikan hasilnya adalah dengan menggunakan Kcachegrind (di Linux) atau Qcachegrind (di MacOS, Windows). Google Perftools juga didukung. Lihat dokumentasi memprof_dump_callgrind()
dan variannya.
Kebanyakan distribusi mempunyai paket kcachegrind
yang siap diinstal.
Misalnya, Ubuntu atau Debian:
sudo apt install kcachegrind
Distribusi lain kemungkinan besar memiliki paket yang siap untuk diinstal juga.
Gunakan Homebrew: https://formulae.brew.sh/formula/qcachegrind
Unduh dari https://sourceforge.net/projects/qcachegrindwin/
Pembuatan profil diaktifkan saat permintaan dimulai jika salah satu hal berikut ini benar:
Variabel lingkungan MEMPROF_PROFILE
tidak kosong
$_GET["MEMPROF_PROFILE"]
tidak kosong
$_POST["MEMPROF_PROFILE"]
tidak kosong
Variabel MEMPROF_PROFILE
menerima daftar flag yang dipisahkan koma.
Contoh nilai MEMPROF_PROFILE
yang valid:
1
: tidak kosong: pembuatan profil diaktifkan
dump_on_limit
: pembuatan profil diaktifkan, akan dibuang pada batas memori
native
: pembuatan profil diaktifkan, akan memprofilkan alokasi asli
dump_on_limit,native
: pembuatan profil diaktifkan, akan membuat profil alokasi asli, akan membuang pada batas memori
Daftar bendera yang valid:
dump_on_limit
: Akan membuang profil dalam format callgrind di /tmp
atau C:WindowsTemp
. Direktori keluaran dapat diubah dengan pengaturan memprof.output_dir
ini.
native
: Akan memprofilkan alokasi malloc()
asli, bukan hanya PHP (Ini tidak aman untuk thread, lihat di bawah).
Memprof tidak melacak alokasi asli secara default, namun ini dapat diaktifkan dengan menyetel MEMPROF_PROFILE
ke native
.
Alokasi asli adalah alokasi yang dibuat di luar pengalokasi memori PHP sendiri. Biasanya, perpustakaan eksternal seperti libxml2 (digunakan dalam ekstensi DOM) membuat alokasi asli. PHP juga dapat membuat alokasi asli untuk sumber daya yang persisten.
Mengaktifkan pelacakan alokasi asli akan membuat profil alokasi ini selain alokasi PHP sendiri.
Perhatikan bahwa ketika pelacakan asli diaktifkan, program akan mogok jika perpustakaan asli menggunakan thread, karena kait yang mendasarinya tidak aman untuk thread.
Format file keluaran ditentukan dengan pengaturan memprof.output_format
ini. Pilihannya adalah:
callgrind
(default)
pprof
Catatan : ini mungkin hanya tersedia ketika ekstensi dibuat dari sumber (dan tidak diinstal dengan pecl), mulai #101.
Mengembalikan apakah pembuatan profil memori saat ini diaktifkan (lihat di atas).
Mengembalikan apakah pembuatan profil memori dan fitur pembuatan profil mana yang diaktifkan (lihat di atas).
Membuang profil saat ini dalam format callgrind. Hasilnya dapat divisualisasikan dengan alat seperti KCacheGrind atau QCacheGrind.
<phpmemprof_dump_callgrind(fopen("keluaran", "w"));
Berikut tangkapan layar QcacheGrind:
Membuang profil saat ini dalam format pprof.
<?phpmemprof_dump_pprof(fopen("profil.heap", "w"));
File dapat divisualisasikan dengan alat pprof
google-perftools. (Lihat di bawah untuk petunjuk pemasangan.)
Tampilkan grafik panggilan beranotasi di browser web atau di gv
:
$ pprof --web profile.heap $ # or: $ pprof --gv profile.heap
Keluaran satu baris per fungsi, diurutkan berdasarkan penggunaan memori sendiri:
$ pprof --text profile.heap
pprof
: Ubuntu: apt install google-perftools
. Di Ubuntu alat ini diberi nama google-pprof
, jadi Anda perlu mengganti pprof
dengan google-pprof
pada contoh di atas.
Mengembalikan array yang mewakili profil saat ini.
<php$dump = memprof_dump_array();
Array memperlihatkan informasi berikut:
Memori inklusif dan eksklusif dibocorkan berdasarkan fungsi (hanya menghitung memori yang masih belum dibebaskan saat memprof_dump_array dipanggil)
Jumlah fungsi blok yang inklusif dan eksklusif (jumlah alokasi; hanya menghitung blok yang masih belum dibebaskan ketika memprof_dump_array dipanggil)
Data disajikan dalam tumpukan panggilan. Dengan cara ini, jika suatu fungsi dipanggil dari beberapa tempat, dimungkinkan untuk melihat jalur panggilan mana yang paling banyak menyebabkan kebocoran memori
Array ( [memory_size] => 11578 [blocks_count] => 236 [memory_size_inclusive] => 10497691 [blocks_count_inclusive] => 244 [calls] => 1 [called_functions] => Array ( [main] => Array ( [memory_size] => 288 [blocks_count] => 3 [memory_size_inclusive] => 10486113 [blocks_count_inclusive] => 8 [calls] => 1 [called_functions] => Array ( [a] => Array ( [memory_size] => 4 [blocks_count] => 1 [memory_size_inclusive] => 10485825 [blocks_count_inclusive] => 5 [calls] => 1 [called_functions] => Array ( [b] => Array ( [memory_size] => 10485821 [blocks_count] => 4 [memory_size_inclusive] => 10485821 [blocks_count_inclusive] => 4 [calls] => 1 [called_functions] => Array ( [str_repeat] => Array ( [memory_size] => 0 [blocks_count] => 0 [memory_size_inclusive] => 0 [blocks_count_inclusive] => 0 [calls] => 1 [called_functions] => Array ( ) ) ) ) ) ) [memprof_dump_array] => Array ( [memory_size] => 0 [blocks_count] => 0 [memory_size_inclusive] => 0 [blocks_count_inclusive] => 0 [calls] => 1 [called_functions] => Array ( ) ) ) ) ) )
Mengembalikan versi ekstensi sebagai string. Versinya dapat dibandingkan dengan version_compare().
Ekstensi mungkin bertentangan dengan xdebug, blackfire, atau ekstensi lainnya. Jika itu yang terjadi pada Anda, harap laporkan.
Cabang saat ini mendukung PHP 7.1 hingga PHP 8.
Cabang php5 mendukung PHP 5.
Lihat INTERNALS.md