Komponen SetaPDF banyak menggunakan objek yang lewat ke objek lain untuk mengamati atau tujuan lain yang diakhiri dengan referensi bersiklus antara objek Show PHP hadir dengan pengumpul sampah yang sangat berantakan hingga versi 5. 3. Sebelumnya 5. 3 pengumpul sampah kekurangan pengumpulan referensi siklus seperti itu yang berakhir dengan kebocoran memori Melepaskan Memori di PHP 5. 2Untuk melepaskan referensi ini secara internal, hampir semua objek menawarkan metode Hanya diperlukan untuk menggunakan metode Jadi jika Anda perlu melepaskan memori dari proses PHP, Anda harus menggunakan metode ini setelah panggilan $document = SetaPDF_Core_Document::load(...); $pages = $document->getCatalog()->getPages(); ... $document->save()->finish(); // unset all references to any variable in the current scope unset($pages); // then call the cleanUp() method: $document->cleanUp(); unset($document); Manajemen Memori UmumDi PHP5. 3 Pengumpulan Sampah baru diperkenalkan yang mampu menangani referensi bersepeda Untuk memungkinkan Pengumpulan Sampah membersihkan referensi yang didaur ulang, persyaratannya adalah tidak ada variabel yang menunjuk ke objek terkait dalam lingkup variabel tertentu Untuk mendapatkan manfaat penuh dari Pengumpulan Sampah, ini adalah cara yang lebih disukai untuk merangkum tugas intensif memori ke dalam lingkup metode/fungsi. Dengan cara ini Pengumpulan Sampah dapat membersihkan referensi ketika ruang lingkup dibiarkan dan tidak perlu menghapus variabel secara manual Mengikuti kode PHP menunjukkan perilaku. getCatalog(); $pages = $catalog->getPages(); $tmpPages = array(); for ($i = 200; $i > 0; $i--) { $tmpPages[] = $pages->create(SetaPDF_Core_PageFormats::A4); } } echo 'First of all we create the variables in the function scope:_ Secara default, pengumpul sampah PHP diaktifkan. Namun, ada php. pengaturan ini yang memungkinkan Anda untuk mengubah ini. Mendapatkan pemahaman penuh tentang cara kerja pengumpulan sampah di PHP, dan juga cara kerja copy-on-write, bukanlah tugas yang mudah. Namun, jika Anda berencana untuk membuat aplikasi interaktif dengan PHP, pemahaman seperti itu sangat penting karena tanpanya, program Anda berisiko mengalami kebocoran memori Saya menyusun skrip pengujian sederhana yang menunjukkan cara kerja penggunaan memori di PHP. Untuk menjalankannya, Anda perlu mengkompilasi PHP secara manual, dengan tombol konfigurasi "--enable-memory-limit". Anda juga harus meningkatkan batas memori dari 8MB di php Anda. ini. Setel ke sesuatu yang tinggi seperti 800MB untuk sementara, hanya untuk memastikan. Untuk mendapatkan penggunaan memori, cukup panggil fungsi memory_get_usage() tanpa parameter - ini mengembalikan jumlah memori yang digunakan oleh proses PHP saat ini, dalam byte. Ini skripnya
Bagi Anda yang tidak memiliki kemauan atau cara melakukannya, saya menjalankan skrip untuk Anda. Inilah yang saya dapatkan
Oke, jadi apa artinya itu bagi kita? . Di sinilah skrip parsing dan komponen dasar lainnya hidup - tidak ada yang bisa kami lakukan tentang itu. Di Tahap 2, kami telah mengalokasikan 1.000.000 angka ke dalam array $arr, menggunakan 57. RAM 5MB. Ya, PHP melaporkan 60232136 byte, tetapi ada 1024 byte dalam satu kilobyte, dan 1024 kilobyte dalam satu megabyte, jadi 57. 5MB. Pada tahap 3 kami juga telah mengatur variabel $foo dan $bar ke bilangan bulat, jadi ada peningkatan nominal dalam penggunaan memori. Sejauh ini bagus Sekarang, bagian yang menarik adalah tahap 4. $arr "disalin" ke dalam $foo dan $bar, memberi kita tiga contoh dari array yang sama. Namun, lihat penggunaan memori - persis sama dengan tahap 3. Kenapa ini? . Yaitu, baik $foo, $bar, dan $arr semuanya menunjuk ke larik internal yang sama Ini diilustrasikan dalam dua tahap berikutnya. Pada tahap 5 $arr diatur menjadi array kosong, namun penggunaan memori hampir tidak bergerak. Itu naik sedikit karena struktur array baru dialokasikan kosong untuk $arr, tetapi pada dasarnya dapat diabaikan. Pada tahap 6 kami telah menambahkan elemen array ke array $bar, jadi PHP melakukan operasi copy-on-write - $bar mengambil salinan lengkap dari array yang sebelumnya ditunjuk, lalu menambahkan elemen baru. Pada titik ini, $foo dan $bar menunjuk ke dua larik yang berbeda, dan $arr menunjuk ke larik kosong Pada tahap 7, $foo juga disetel menjadi larik kosong, dan tiba-tiba ada penurunan besar dalam jumlah memori yang digunakan saat larik $foo dibersihkan. Perhatikan, bagaimanapun, bahwa meskipun $bar array tidak lagi direferensikan di sisa skrip, itu bukan sampah yang dikumpulkan. PHP menyimpannya dalam memori sampai skrip selesai Nah, pelajaran apa yang bisa kita petik dari situ?
|