Itu disebutkan di halaman manual yang tidak disetel pada 2009 :
unset()
tidak hanya apa yang namanya - hapus variabel. Itu tidak memaksa pembebasan memori segera. Pemulung sampah PHP akan melakukannya ketika cocok - dengan niat segera, karena siklus CPU itu tidak diperlukan, atau selambat-lambatnya sebelum skrip kehabisan memori, apa pun yang terjadi terlebih dahulu.
Jika Anda melakukannya $whatever = null;
maka Anda menulis ulang data variabel. Anda mungkin mendapatkan memori lebih cepat / menyusut lebih cepat, tetapi mungkin mencuri siklus CPU dari kode yang benar-benar membutuhkannya lebih cepat, menghasilkan waktu eksekusi keseluruhan yang lebih lama.
(Sejak 2013, unset
halaman manual itu tidak termasuk bagian itu lagi)
Perhatikan bahwa hingga php5.3, jika Anda memiliki dua objek dalam referensi melingkar , seperti dalam hubungan orangtua-anak, panggilan tidak disetel () pada objek induk tidak akan membebaskan memori yang digunakan untuk referensi induk dalam objek anak. (Memori juga tidak akan dibebaskan ketika objek induk dikumpulkan dari sampah.) ( Bug 33595 )
Pertanyaan " perbedaan antara tidak disetel dan = nol " merinci beberapa perbedaan:
unset($a)
juga menghapus $a
dari tabel simbol; sebagai contoh:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Keluaran:
Notice: Undefined variable: a in xxx
NULL
Tapi kapan $a = null
digunakan:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Tampaknya itu $a = null
sedikit lebih cepat daripada unset()
rekannya: memperbarui entri tabel simbol tampaknya lebih cepat daripada menghapusnya.
- ketika Anda mencoba menggunakan
unset
variabel yang tidak ada ( ), kesalahan akan dipicu dan nilai untuk ekspresi variabel akan nol. (Karena, apa lagi yang harus dilakukan PHP? Setiap ekspresi perlu menghasilkan nilai tertentu.)
- Variabel dengan null ditugaskan untuk itu masih merupakan variabel normal.
$whatever
menunjuk ke suatu objek,$whatever = null
timpa pointer, bukan objek itu sendiri, sehingga pada dasarnya sama denganunset()
.unset
sebenarnya bukan fungsi, tetapi konstruksi bahasa . Ini tidak lebih dari panggilan fungsi daripada areturn
atau ainclude
.Selain masalah kinerja, penggunaan
unset
membuat maksud kode Anda lebih jelas.sumber
unset
sebagaiUnSeT
, misalnya. Komunitas telah memilih huruf kecil semua sebagai masalah gaya, tetapi selubung lainnya masih berfungsi.Dengan melakukan unset () pada variabel, Anda pada dasarnya telah menandai variabel untuk 'pengumpulan sampah' (PHP tidak benar-benar memilikinya, tetapi sebagai contohnya) sehingga memori tidak segera tersedia. Variabel tidak lagi menampung data, tetapi tumpukan tetap pada ukuran yang lebih besar. Melakukan metode nol menjatuhkan data dan mengecilkan memori tumpukan segera.
Ini berasal dari pengalaman pribadi dan juga yang lainnya. Lihat komentar fungsi unset () di sini .
Saya pribadi menggunakan unset () di antara iterasi dalam satu lingkaran sehingga saya tidak harus memiliki keterlambatan tumpukan yang ukurannya yo-yo'd. Data hilang, tetapi jejak tetap ada. Pada iterasi berikutnya, memori sudah diambil oleh php dan karenanya, lebih cepat menginisialisasi variabel berikutnya.
sumber
Per itu sepertinya "= null" lebih cepat.
Hasil PHP 5.4:
Hasil PHP 5.3:
Hasil PHP 5.2:
Hasil PHP 5.1:
Hal-hal mulai terlihat berbeda dengan PHP 5.0 dan 4.4.
5.0:
4.4:
Perlu diingat microtime (true) tidak berfungsi dalam PHP 4.4 jadi saya harus menggunakan contoh microtime_float yang diberikan di php.net/microtime / Contoh # 1.
sumber
unset
lebih cepat. Saya memiliki tes yang kemudian memeriksa keberadaannya dalamunset
kasus ini. Dalam tes itu pengaturannya menjadinull
sedikit lebih cepat. Uji: pastebin.com/fUe57C51gc_collect_cycles
sebelum memulai timer untuk mendapatkan hasil yang lebih akurat.Itu membuat perbedaan dengan elemen array.
Pertimbangkan contoh ini
Di sini, 'tes' kuncinya masih ada. Namun, dalam contoh ini
kunci tidak ada lagi.
sumber
Ia bekerja dengan cara berbeda untuk variabel yang disalin dengan referensi:
sumber
Mengenai objek, terutama dalam skenario lazy-load, orang harus mempertimbangkan pengumpul sampah berjalan dalam siklus CPU menganggur, jadi anggap Anda akan mendapat masalah ketika banyak objek memuat hukuman kecil waktu akan menyelesaikan pembebasan memori.
Gunakan time_nanosleep untuk mengaktifkan GC untuk mengumpulkan memori. Pengaturan variabel ke nol diinginkan.
Diuji pada server produksi, awalnya pekerjaan tersebut menghabiskan 50MB dan kemudian dihentikan. Setelah nanosleep digunakan 14MB adalah konsumsi memori yang konstan.
Orang harus mengatakan ini tergantung pada perilaku GC yang dapat berubah dari versi PHP ke versi. Tetapi berfungsi dengan baik di PHP 5.3.
misalnya. contoh ini (kode diambil dari VirtueMart2 google feed)
sumber
Saya masih ragu tentang ini, tetapi saya sudah mencobanya di skrip saya dan saya menggunakan xdebug untuk mengetahui bagaimana itu akan mempengaruhi penggunaan memori aplikasi saya. Script diatur pada fungsi saya seperti ini:
Dan saya menambahkan tidak diset sebelum
return
kode dan itu memberi saya: 160200 maka saya mencoba mengubahnya dengan$sql = NULL
dan itu memberi saya: 160224 :)Tetapi ada sesuatu yang unik pada perbandingan ini ketika saya tidak menggunakan unset () atau NULL, xdebug memberi saya 160144 sebagai penggunaan memori
Jadi, saya pikir memberikan baris untuk menggunakan unset () atau NULL akan menambahkan proses ke aplikasi Anda dan akan lebih baik untuk tetap asal dengan kode Anda dan mengurangi variabel yang Anda gunakan seefektif mungkin.
Koreksi saya jika saya salah, terima kasih
sumber
Saya membuat tes kinerja baru untuk
unset
dan=null
, karena seperti yang disebutkan dalam komentar yang ditulis di sini memiliki kesalahan ( penciptaan ulang elemen). Saya menggunakan array, seperti yang Anda lihat tidak masalah sekarang.Tetapi saya hanya dapat mengujinya di server PHP 5.5.9, di sini hasilnya: - butuh 4,4571571350098 detik - butuh 4,4425978660583 detik
Saya lebih suka
unset
untuk alasan keterbacaan.sumber
PHP 7 sudah bekerja pada masalah manajemen memori seperti itu dan penggunaannya yang dikurangi hingga minimal.
PHP 7.1 Outpu:
mengambil 0,16778993606567 detik mengambil 0,16630101203918 detik
sumber
unset
kode jika tidak membebaskan memori langsung masih sangat membantu dan akan menjadi praktik yang baik untuk melakukan ini setiap kali kita meneruskan langkah-langkah kode sebelum kita keluar dari suatu metode. perhatikan ini bukan tentang membebaskan memori langsung. memori langsung untuk CPU, bagaimana dengan memori sekunder yaitu RAM.dan ini juga menangani tentang mencegah kebocoran memori.
silakan lihat tautan ini http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2
Saya telah menggunakan unset untuk waktu yang lama sekarang.
praktik yang lebih baik seperti ini dalam kode untuk secara instan menghapus semua variabel yang telah digunakan sebagai array.
dan
just unset($data);
untuk membebaskan semua penggunaan variabel.silakan lihat topik terkait untuk tidak disetel
Seberapa pentingkah menghapus variabel di PHP?
[bug]
sumber
Sebagai catatan, dan tidak termasuk waktu yang diperlukan:
Ia kembali
Kesimpulannya, memori bebas nol dan tidak disetel seperti yang diharapkan (tidak hanya pada akhir eksekusi). Juga, menetapkan ulang suatu variabel memegang nilai dua kali pada beberapa titik (520216 versus 438352)
sumber