Apakah ada fungsi dalam PHP (atau ekstensi PHP) untuk mengetahui berapa banyak memori yang digunakan variabel tertentu? sizeof
hanya memberi tahu saya jumlah elemen / properti.
memory_get_usage
membantu karena memberi saya ukuran memori yang digunakan oleh seluruh skrip. Apakah ada cara untuk melakukan ini untuk satu variabel?
Perhatikan bahwa ini ada di mesin pengembangan, jadi memuat ekstensi atau alat debug dapat dilakukan.
Jawaban:
Anda Mungkin membutuhkan Memory Profiler. Saya telah mengumpulkan informasi dari SO tetapi saya telah menyalin beberapa hal penting yang dapat membantu Anda juga.
Seperti yang mungkin Anda ketahui, Xdebug menghentikan dukungan profil memori sejak versi 2. *. Silakan cari string "fungsi yang dihapus" di sini: http://www.xdebug.org/updates.php
Opsi Profiler Lainnya
php-memory-profiler
https://github.com/arnaud-lb/php-memory-profiler . Inilah yang saya lakukan di server Ubuntu saya untuk mengaktifkannya:
Dan kemudian di kode saya:
Terakhir buka
callgrind.out
file dengan KCachegrindMenggunakan Google gperftools (disarankan!)
Pertama-tama instal Google gperftools dengan mengunduh paket terbaru di sini: https://code.google.com/p/gperftools/
Kemudian seperti biasa:
Sekarang dalam kode Anda:
Kemudian buka terminal Anda dan luncurkan:
pprof akan membuat jendela baru di sesi browser Anda yang sudah ada dengan sesuatu seperti yang ditunjukkan di bawah ini:
Xhprof + Xhgui (menurut saya yang terbaik untuk profil cpu dan memori)
Dengan Xhprof dan Xhgui Anda dapat membuat profil penggunaan cpu juga atau hanya penggunaan memori jika itu masalah Anda saat ini. Ini adalah solusi yang sangat lengkap, ini memberi Anda kendali penuh dan log dapat ditulis baik di mongo atau di sistem file.
Untuk lebih jelasnya lihat disini .
Api hitam
Blackfire adalah profiler PHP oleh SensioLabs, orang-orang Symfony2 https://blackfire.io/
Jika Anda menggunakan boneka untuk mengatur mesin virtual Anda, Anda akan senang mengetahui bahwa itu didukung ;-)
Xdebug dan melacak penggunaan memori
XDEBUG2 adalah ekstensi untuk PHP. Xdebug memungkinkan Anda untuk mencatat semua panggilan fungsi, termasuk parameter dan mengembalikan nilai ke file dalam format yang berbeda. Ada tiga format keluaran. Satu dimaksudkan sebagai jejak yang dapat dibaca manusia, yang lain lebih cocok untuk program komputer karena lebih mudah untuk diurai, dan yang terakhir menggunakan HTML untuk memformat jejak. Anda dapat beralih di antara dua format berbeda dengan pengaturan. Contoh akan tersedia di sini
forp
forp sederhana, tidak mengganggu, berorientasi pada produksi, profiler PHP. Beberapa fiturnya adalah:
pengukuran waktu dan memori yang dialokasikan untuk setiap fungsi
penggunaan CPU
file dan nomor baris pemanggilan fungsi
keluaran sebagai format Peristiwa Jejak Google
keterangan fungsi
pengelompokan fungsi
alias fungsi (berguna untuk fungsi anonim)
DBG
DBG adalah debugger php berfitur lengkap, alat interaktif yang membantu Anda men-debug skrip php. Ini bekerja pada server WEB produksi dan / atau pengembangan dan memungkinkan Anda men-debug skrip Anda secara lokal atau jarak jauh, dari IDE atau konsol dan fitur-fiturnya adalah:
Debugging jarak jauh dan lokal
Aktivasi eksplisit dan implisit
Tumpukan panggilan, termasuk panggilan fungsi, panggilan metode dinamis dan statis, dengan parameternya
Menavigasi melalui tumpukan panggilan dengan kemampuan untuk mengevaluasi variabel di tempat (bertingkat) yang sesuai
Step in / Step out / Step over / Run to cursor fungsionalitas
Breakpoint bersyarat
Breakpoint global
Logging untuk kesalahan dan peringatan
Beberapa sesi simultan untuk debugging paralel
Dukungan untuk GUI dan CLI front-end
Mendukung jaringan IPv6 dan IPv4
Semua data yang ditransfer oleh debugger dapat secara opsional dilindungi dengan SSL
sumber
Tidak ada cara langsung untuk mendapatkan penggunaan memori variabel tunggal, tetapi seperti yang disarankan Gordon, Anda dapat menggunakannya
memory_get_usage
. Itu akan mengembalikan jumlah total memori yang dialokasikan, sehingga Anda dapat menggunakan solusi dan mengukur penggunaan sebelum dan sesudah untuk mendapatkan penggunaan variabel tunggal. Ini agak hacky, tetapi seharusnya berhasil.Perhatikan bahwa ini sama sekali bukan metode yang dapat diandalkan, Anda tidak dapat memastikan bahwa tidak ada yang menyentuh memori saat menetapkan variabel, jadi ini hanya boleh digunakan sebagai perkiraan.
Anda sebenarnya dapat mengubahnya menjadi fungsi dengan membuat salinan variabel di dalam fungsi dan mengukur memori yang digunakan. Belum menguji ini, tetapi pada prinsipnya, saya tidak melihat ada yang salah dengannya:
sumber
$tmp = $var
akan membuat salinan dangkal. Ini tidak akan mengalokasikan lebih banyak memori sampai $ tmp diubah.$tmp = unserialize(serialize($var))
; Ini akan menggabungkan pendekatan Aistina di atas.$var
sudah menjadi salinan dangkal atau referensi dari apa yang diteruskan ke fungsi, Anda tidak perlu$tmp
, tetapi dapat menetapkan ulang$var
. Ini menyimpan referensi internal dari$tmp
ke$var
.$tmp
dari$var
?Tidak, tidak ada. Tapi Anda bisa
serialize($var)
dan memeriksastrlen
hasilnya untuk perkiraan.sumber
strlen(serialize(array(1,2,3)))
tetap 30.Sebagai jawaban atas jawaban Tatu Ulmanens:
Perlu dicatat, itu
$start_memory
sendiri akan memakan memori (PHP_INT_SIZE * 8
).Jadi keseluruhan fungsinya harus menjadi:
Maaf menambahkan ini sebagai jawaban tambahan, tapi saya belum bisa mengomentari jawaban.
Pembaruan: * 8 tidak pasti. Itu bisa tergantung pada versi php dan mungkin pada 64/32 bit.
sumber
* 8
? Terima kasih!PHP_INT_SIZE
byte, tetapiPHP_INT_SIZE*8
. Anda dapat mencobanya dengan memanggil fungsi ini, itu harus mengembalikan 0:function sizeofvar() { $start_memory = memory_get_usage(); return memory_get_usage() - $start_memory - PHP_INT_SIZE*8; }
8
tampaknya tidak konstan. Mengikuti fungsi komentar Anda di sistem dev saya (PHP 5.6.19), ia kembali-16
. Juga, yang menarik, dariphp -a
, memanggil dua baris fungsi memberikan berbagai nilai yang berbeda.Lihat:
memory_get_usage()
- Mengembalikan jumlah memori yang dialokasikan ke PHPmemory_get_peak_usage()
- Mengembalikan puncak memori yang dialokasikan oleh PHPPerhatikan bahwa ini tidak akan memberi Anda penggunaan memori dari variabel tertentu. Tetapi Anda dapat melakukan panggilan ke fungsi ini sebelum dan sesudah menetapkan variabel dan kemudian membandingkan nilainya. Itu akan memberi Anda gambaran tentang memori yang digunakan.
Anda juga dapat melihat Memtrack ekstensi PECL , meskipun dokumentasinya agak kurang, jika tidak bisa dikatakan, hampir tidak ada.
sumber
Anda dapat memilih untuk menghitung perbedaan memori pada nilai balik panggilan balik. Ini adalah solusi yang lebih elegan yang tersedia dalam PHP 5.3+.
sumber
Anda tidak dapat secara retrospektif menghitung footprint variabel yang tepat karena dua variabel dapat berbagi ruang yang dialokasikan sama di memori
Mari kita coba membagi memori antara dua larik, kita melihat bahwa mengalokasikan larik kedua menghabiskan setengah dari memori larik pertama. Saat kami membatalkan setelan yang pertama, hampir semua memori masih digunakan oleh yang kedua.
Jadi kita tidak bisa menyimpulkan daripada array kedua menggunakan setengah memori, karena menjadi salah ketika kita membatalkan yang pertama.
Untuk gambaran lengkap tentang bagaimana memori dialokasikan dalam PHP dan untuk kegunaan apa, saya sarankan Anda untuk membaca artikel berikut: Seberapa besar array (dan nilai) PHP sebenarnya? (Petunjuk: BESAR!)
The Dasar Referensi Counting dalam dokumentasi PHP juga memiliki banyak informasi tentang penggunaan memori, dan referensi menghitung sampai segmen data bersama.
Solusi berbeda yang diekspos di sini bagus untuk perkiraan tetapi tidak ada yang dapat menangani manajemen halus memori PHP.
Jika Anda menginginkan ruang yang baru dialokasikan setelah tugas, maka Anda harus menggunakan
memory_get_usage()
sebelum dan sesudah alokasi, karena menggunakannya dengan salinan memberi Anda pandangan yang salah tentang kenyataan.Ingatlah bahwa jika Anda ingin menyimpan hasil pertama
memory_get_usage()
, variabel harus sudah ada sebelumnya, danmemory_get_usage()
harus dipanggil lain waktu sebelumnya, dan setiap fungsi lainnya juga.Jika Anda ingin menggemakan seperti pada contoh di atas, buffer keluaran Anda harus sudah dibuka untuk menghindari memori akuntansi yang diperlukan untuk membuka buffer keluaran.
Jika Anda ingin mengandalkan fungsi untuk menghitung ruang yang diperlukan untuk menyimpan salinan variabel, kode berikut menangani pengoptimalan yang berbeda:
Perhatikan bahwa ukuran nama variabel penting dalam memori yang dialokasikan.
Variabel memiliki ukuran dasar yang ditentukan oleh struktur C bagian dalam yang digunakan dalam kode sumber PHP. Ukuran ini tidak berfluktuasi dalam hal angka. Untuk senar, itu akan menambah panjang senar.
Jika kita tidak memperhitungkan inisialisasi nama variabel, kita sudah tahu berapa banyak variabel yang digunakan (dalam hal angka dan string):
(angka-angka itu bisa berubah tergantung pada versi PHP)
Anda harus membulatkan hingga kelipatan 4 byte karena penyelarasan memori. Jika variabel berada di ruang global (bukan di dalam fungsi), itu juga akan mengalokasikan 64 byte lagi.
Jadi jika Anda ingin menggunakan salah satu kode di dalam halaman ini, Anda harus memeriksa apakah hasilnya menggunakan beberapa kasus uji sederhana (string atau angka) cocok dengan data tersebut dengan mempertimbangkan setiap indikasi dalam posting ini (array $ _GLOBAL, panggilan fungsi pertama, buffer keluaran, ...)
sumber
zvalue
,is_ref
dan copy-on-write. Terima kasih.Saya memiliki masalah serupa, dan solusi yang saya gunakan adalah menulis variabel ke file kemudian menjalankan filesize () di atasnya. Secara kasar seperti ini (kode yang belum diuji):
Solusi ini tidak terlalu cepat karena melibatkan IO disk, tetapi akan memberi Anda sesuatu yang jauh lebih tepat daripada trik memory_get_usage. Itu hanya tergantung pada seberapa banyak presisi yang Anda butuhkan.
sumber
strlen
akan lebih mudah.Belum pernah mencoba, tetapi jejak Xdebug dengan xdebug.collect_assignment s mungkin cukup.
sumber
sumber
Skrip berikut menunjukkan penggunaan memori total dari satu variabel.
Lihat ini
http://www.phpzag.com/how-much-memory-do-php-variables-use/
sumber