Php menghapus variabel dari memori

Komponen SetaPDF banyak menggunakan objek yang lewat ke objek lain untuk mengamati atau tujuan lain yang diakhiri dengan referensi bersiklus antara objek

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. 2

Untuk melepaskan referensi ini secara internal, hampir semua objek menawarkan metode cleanUp(). Jika Anda perlu menghapus referensi siklus, Anda harus mulai dengan instance SetaPDF_Core_Document - ini akan meneruskan panggilannya ke semua objek terkait secara rekursif

Hanya diperlukan untuk menggunakan metode cleanUp() di PHP 5. 2 dan jika skrip tidak diakhiri setelah panggilan finish() dan memori tambahan diperlukan

Jadi jika Anda perlu melepaskan memori dari proses PHP, Anda harus menggunakan metode ini setelah panggilan finish()

$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 Umum

Di 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: 
'; createPdfInSeparateScope(); echo 'Memory usage afterwards is: ' . memory_get_usage() . '
' . 'The memory consumption is increased and cycles are not collected, ' . 'because the possible root buffer is not full yet.
'; $cycles = gc_collect_cycles(); echo $cycles . ' were collected.
' . 'Memory usage afterwards: ' . memory_get_usage() . '
'; echo '
'; echo 'Now we create the same variables in the global scope. And we try to ' . 'collect the cycles without unsetting the variables:
'; $document = new SetaPDF_Core_Document(); // let's create some memory usage $catalog = $document->getCatalog(); $pages = $catalog->getPages(); $tmpPages = array(); for ($i = 200; $i > 0; $i--) { $tmpPages[] = $pages->create(SetaPDF_Core_PageFormats::A4); } $cycles = gc_collect_cycles(); echo $cycles . ' were collected.
'; echo 'Memory usage afterwards: ' . memory_get_usage() . '
'; echo '
'; echo 'Now we unset the variables and try to collect the cycles again:
'; unset($document, $catalog, $pages, $tmpPages); $cycles = gc_collect_cycles(); echo $cycles . ' were collected.
'; echo 'Memory usage afterwards: ' . memory_get_usage() . '
';
_

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

echo "Stage 1: Mem usage is: ", memory_get_usage(), "\n";

$arr = array();

for ($i = 0; $i < 1000000; ++$i) {
  $arr[] = rand();
}

echo "Stage 2: Mem usage is: ", memory_get_usage(), "\n";

$foo = 1;
$bar = 2;

echo "Stage 3: Mem usage is: ", memory_get_usage(), "\n";

$foo = $arr;
$bar = $arr;

echo "Stage 4: Mem usage is: ", memory_get_usage(), "\n";

$arr = array();

echo "Stage 5: Mem usage is: ", memory_get_usage(), "\n";

$bar[] = "hello, world";

echo "Stage 6: Mem usage is: ", memory_get_usage(), "\n";

$foo = array();

echo "Stage 7: Mem usage is: ", memory_get_usage(), "\n";

Bagi Anda yang tidak memiliki kemauan atau cara melakukannya, saya menjalankan skrip untuk Anda. Inilah yang saya dapatkan

Stage 1: Mem usage is: 37712
Stage 2: Mem usage is: 60232136
Stage 3: Mem usage is: 60232248
Stage 4: Mem usage is: 60232248
Stage 5: Mem usage is: 60232288
Stage 6: Mem usage is: 104426704
Stage 7: Mem usage is: 60242672
_

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?

  • Jika Anda ingin variabel cakupan global melepaskan memorinya, gunakan fungsi unset() atau setel ke nilai yang berbeda. Jika tidak, PHP akan membuatnya tetap mengambang untuk berjaga-jaga

  • Copy-on-write adalah teman Anda, dan berarti bahwa untuk semua maksud dan tujuan, array disalin dengan referensi dengan cara yang sama seperti objek. Satu-satunya perbedaan adalah jika Anda mengubah array selanjutnya, salinan dalam dilakukan

  • Begitu Anda menghapus () atau menetapkan ulang variabel, PHP membebaskan memorinya. Membebaskan memori - terutama dalam jumlah besar - tidak gratis dalam hal waktu prosesor, yang berarti bahwa jika Anda ingin skrip Anda dieksekusi secepat mungkin dengan mengorbankan RAM, Anda harus menghindari pengumpulan sampah pada variabel besar saat sedang berjalan, maka

    Bagaimana cara menghapus memori variabel di PHP?

    Dengan melakukan unset() pada variabel , Anda pada dasarnya menandai variabel untuk 'pengumpulan sampah' (PHP tidak . Variabel tidak lagi menampung data, tetapi tumpukan tetap berukuran lebih besar.

    Bagaimana cara menghapus nilai variabel di PHP?

    Fungsi unset() menghancurkan variabel yang ditentukan. Perilaku unset() di dalam suatu fungsi dapat bervariasi tergantung pada jenis variabel apa yang Anda coba hancurkan. Jika variabel global tidak disetel () di dalam suatu fungsi, hanya variabel lokal yang dihancurkan.

    Apa yang lebih baik dalam membebaskan memori dengan PHP unset () atau $var NULL?

    Kesimpulan. NULL lebih baik jika memori yang dibutuhkan lebih sedikit untuk sebuah variabel .

    Bagaimana cara menghapus $_ posting di PHP?

    Anda dapat menggunakan kombinasi unset() dan inisialisasi. tidak disetel($_POST); . tidak disetel($_POST) ? Or in a single statement: unset($_POST) ?