Faktanya, masalah konsumsi memori dapat dengan mudah menyebabkan crash, bug yang sulit ditemukan, dan bahkan membuka pintu untuk serangan Denial-of-Service. Hal ini sangat penting di situs web dengan lalu lintas tinggi, di mana banyak eksekusi skrip bersamaan terjadi dan masalah terkait memori lebih mudah menyebabkan masalah Show
Sebelum pindah ke bagian selanjutnya, saya sarankan Anda melihat video singkat berikut, yang menjelaskan dengan baik bagaimana manajemen memori bekerja di PHP dan memberi Anda beberapa tips dasar untuk mengoptimalkan kode Anda
Beberapa jenis skrip PHP sangat berisiko konsumsi memori yang berlebihan
Tentu saja, masalah memori juga dapat terjadi pada skrip jenis lain
Tetapi bagaimana Anda bisa memeriksa berapa banyak memori yang digunakan skrip Anda? Mudah library PHP standar memberi Anda dua fungsi yang memberi Anda informasi yang tepat. memory_get_usage() dan memory_get_peak_usage() . Mari kita lihat cara kerjanya. [tweet-mudah tweet="Tutorial (dengan contoh) tentang cara memeriksa penggunaan memori skrip PHP Anda" via="no" hashtags="PHP"]
memory_get_usage() mengembalikan jumlah byte yang digunakan oleh skrip saat fungsi dipanggil. Demikian pula, memory_get_peak_usage() mengembalikan jumlah maksimum memori (sekali lagi, dalam byte) yang digunakan oleh skrip until the function is called. Sebagai contoh
Di PC saya, saya mengerti
Seperti yang Anda lihat, setelah larik tidak disetel, penggunaan memori saat ini turun menjadi 370Kb, tetapi penggunaan puncaknya tetap sama (Jika Anda ingin mempelajari cara menyiapkan lingkungan PHP lokal, lihat bab Memulai program pembelajaran PHP saya) Kedua fungsi menggunakan argumen boolean opsional bernama $real_usage . Nilai standarnya salah. Apa artinya dan kapan sebaiknya Anda menyetelnya ke true? Ayo cari tahu Apakah Anda ingin berbicara dengan saya dan pengembang lain tentang PHP dan pengembangan web? . Kafe Alex PHP Sampai jumpa di sana 🙂
ARGUMEN $real_usage. BAGAIMANA CARA MENGGUNAKANNYAZ $real_usage adalah argumen boolean. Nilai defaultnya adalah false untuk memory_get_usage() dan memory_get_peak_usage(). Jika argumen ini disetel ke true, maka fungsi mengembalikan jumlah penuh dari memori yang dialokasikan . instead of the memory actually used by the script. Apa bedanya…?
Begini Cara kerjanya Penerjemah PHP secara dinamis mengalokasikan memori untuk skrip. Memori ini dialokasikan dalam potongan, bagian kecil dari jumlah memori tetap. Ketika semua memori yang dialokasikan telah digunakan oleh skrip, juru bahasa mengalokasikan potongan lain Jadi
Oleh karena itu, jumlah yang dialokasikan memori selalu sedikit lebih besar daripada jumlah digunakan< . memory (how much bigger depends on many factors, including the PHP configuration and the operating system settings).
Untuk inilah $real_usage digunakan
Contoh berikut menunjukkan bagaimana memori yang dialokasikan bertambah seiring dengan memori yang sebenarnya digunakan oleh skrip
_
Inilah hasilnya
Perhatikan bagaimana memori yang digunakan (kolom pertama) tumbuh secara bertahap, sedangkan memori yang dialokasikan (kolom kedua) tumbuh dalam potongan
Catatan jika Anda mencoba menjalankan contoh ini dan mendapatkan hasil yang aneh, seperti memori yang dialokasikan lebih kecil dari memori yang digunakan, mungkin karena beberapa sistem caching Cara untuk menghindari masalah tersebut adalah dengan memulai ulang server web tepat sebelum menjalankan skrip
Kapan Anda harus menyetel $real_usage ke true?
Inilah aturan praktisnya jika Anda ingin melihat berapa banyak memori sistem yang digunakan skrip Anda, maka Anda harus menyetel . to true. Mengapa? Karena memori yang dialokasikan, meskipun tidak benar-benar digunakan oleh skrip, masih dicadangkan untuknya dan tidak tersedia untuk proses sistem lainnya Dengan kata lain, ini adalah jumlah RAM sistem yang dicadangkan untuk proses PHP
Sebaliknya, jika Anda ingin membuat profil skrip PHP Anda , lebih baik biarkan false because you will see the memory usage in more detail. Faktanya, dengan cara itu Anda dapat melihat berapa banyak memori yang digunakan oleh potongan kode tertentu terlepas dari berapa banyak memori yang tersedia untuk skrip secara keseluruhan
Mari kita lihat beberapa contoh cara melakukannya.
CARA MEMANTAU LOOP Di dalam struktur loop penggunaan memori yang berlebihan dapat menimbulkan masalah, terutama jika penggunaan ini terus bertambah setelah setiap iterasi loop. Jika Anda ingin memastikan loop tidak menggunakan terlalu banyak memori, sebaiknya buat profilnya Bagaimana kamu melakukannya?
Pertama-tama, Anda harus mencetak penggunaan memori sebelum dan sesudah pengulangan untuk memeriksa perbedaannya. Jika Anda melihat bahwa penggunaan memori terlalu tinggi, Anda juga harus memeriksa bagian dalam loop itu sendiri Parameter $real_usage sebaiknya dibiarkan false, karena Anda ingin profil your code in detail more than your whole script.
Ini juga berguna untuk melihat berapa banyak memori maksimum yang tersedia sedang digunakan Skrip PHP hanya dapat menggunakan memori dalam jumlah tertentu. Nilai ini diatur dalam variabel memory_limit dari file php.ini. file ini (file konfigurasi utama PHP) Anda dapat mengambil nilai tersebut dengan fungsi ini_get() , mengubahnya menjadi byte dan membandingkannya dengan penggunaan memori skrip
Ini sebuah contoh
CARA MEMANTAU DAEMON PHP
Daemon PHP adalah skrip perulangan yang tidak pernah berakhir Mereka sangat berguna untuk tugas pemeliharaan dan pemantauan, seperti sistem pemberitahuan email otomatis dan operasi pemeliharaan Sama seperti aplikasi selalu aktif, daemon PHP juga dapat mengalami kebocoran memori. Praktik yang baik adalah memeriksa penggunaan memori di awal setiap putaran dan melakukan sesuatu jika ternyata terlalu tinggi
Misalnya, Anda dapat membunuh atau menghentikan sementara . send a notification email (you will see how to do it in the next chapter). Untuk tujuan ini, sebaiknya atur $real_usage ke true, karena Anda sekarang lebih tertarik pada berapa banyak memori yang benar-benar digunakan .
Tentu saja, jika masalah memori terjadi, Anda perlu membuat profil skrip dengan hati-hati untuk melihat dari mana asal masalah (untuk itu, akan lebih baik membiarkan $real_usage menjadi false)
Sebagai contoh, mari kita lihat cara menghentikan daemon jika memori yang digunakan lebih dari 50Mb
Anda juga dapat menghentikan daemon ketika penggunaan memorinya melebihi persentase tertentu dari penggunaan maksimum yang diperbolehkan Untuk melakukan ini, Anda perlu membandingkan penggunaan memori dengan nilai memory_limit, seperti yang Anda lihat pada contoh loop sebelumnya Inilah contohnya
_
PANAS UNTUK MENDAPATKAN PEMBERITAHUAN EMAIL KETIKA MEMORY TERLALU BANYAK DIGUNAKAN
Terkadang, men-debug dan membuat profil penggunaan memori skrip PHP bisa jadi sulit Tidak selalu mudah untuk mengambil output dari memory_get_usage() dan memory_get_peak_usage(), especially when the memory usage depends on the request string values and other factors.
Dalam beberapa kasus, masalah memori mungkin muncul hanya dalam keadaan tertentu atau hanya setelah beberapa waktu (terutama dalam daemon PHP) Hanya mengulangi penggunaan memori tidak selalu cukup baik Anda tidak bisa hanya menatap layar Anda menunggu kebocoran memori terjadi, bukan?
Salah satu solusinya adalah log informasi penggunaan memori ke file log atau database. Tetapi solusi ini juga tidak sempurna, karena Anda akan mendapatkan banyak log yang perlu Anda baca dan kelola
Solusi yang lebih cerdas adalah membuat PHP melakukan kerja keras Alih-alih mencetak atau mencatat semuanya, cukup periksa apakah penggunaan memori terlalu tinggi Jika tidak, lanjutkan eksekusi skrip. Jika tidak, kirimkan email pemberitahuan kepada Anda sendiri bersama dengan informasi debug yang berguna.
Prosedur sederhana ini menghilangkan kebutuhan Anda untuk secara aktif memeriksa skrip Anda Faktanya, skrip itu sendiri akan memberi tahu Anda jika ada yang salah 😉 Jauh lebih baik, bukan?
Jadi, bagaimana ini bisa dilakukan dalam praktik?
Mari kembali ke contoh daemon Sekarang, sebelum mematikan skrip ketika penggunaan memori terlalu tinggi, kami mengirim email agar kami tahu bahwa skrip ini telah dihentikan Kami juga melampirkan file dengan jejak kembali debug dan satu dengan semua variabel yang ditentukan untuk memudahkan kami men-debug masalah
CATATAN. Anda perlu menginstal PHPMailer terlebih dahulu. Ikuti tutorial PHPMailer saya untuk mempelajari cara melakukannya.
Ini kodenya
PERHATIAN. SUMBER DAYA Ada satu masalah dengan memory_get_usage() dan memory_get_peak_usage() mereka TIDAK memperhitungkan sumber daya . Jenis resource PHP mencakup variabel yang ditangani oleh library eksternal atau sistem operasi, termasuk
Memori sistem untuk jenis ini tidak ditangani oleh mesin inti PHP itu sendiri Perpustakaan eksternal yang melakukan itu Oleh karena itu, memory_get_[peak]_usage() tidak memasukkannya ke dalam hasilnya dan Anda perlu mengambilnya dengan cara lain
Posting dari drib tech ini dengan jelas menjelaskan situasi ini dan juga memberikan solusi Dapatkan jumlah nyata dari memori yang dialokasikan oleh PHP
Solusi yang Anda temukan di posting di atas hanya berfungsi pada sistem Linux Tapi jangan khawatir jika Anda menggunakan Windows, Anda dapat menggunakan kode berikut yang bergantung pada alat jendela daftar tugas
_
KESIMPULAN
Sekarang Anda tahu mengapa penting untuk menjaga agar penggunaan memori skrip tetap terkendali, dan Anda tahu cara melakukannya Anda mempelajari perbedaan antara memory_get_usage() dan memory_get_peak_usage() dan apa sebenarnya arti dari argumen $real_usage Anda juga melihat bagaimana memasukkan jenis sumber daya eksternal dalam perhitungan, baik pada sistem Linux maupun Windows Bagaimana cara menghitung penggunaan memori di PHP?Untuk memeriksa penggunaan memori, PHP menyediakan fungsi bawaan memory_get_usage() . Fungsi ini mengembalikan jumlah memori yang dialokasikan ke skrip PHP. ** fungsi memory_get_usage() mengembalikan jumlah memori yang dialokasikan ke skrip PHP Anda dalam byte.
Manakah dari fungsi PHP berikut yang dapat digunakan untuk menghasilkan?Solusi (Oleh Tim Examveda)
Manakah dari fungsi PHP berikut yang dapat digunakan untuk membangun fungsi yang menerima sejumlah argumen *?Anda dapat menggunakan func_get_args() di dalam fungsi Anda untuk mengurai sejumlah parameter yang diteruskan.
Manakah dari fungsi PHP berikut yang dapat digunakan untuk membuat fungsi yang menerima sejumlah argumen Mcq?Jawab. D) func_get_args() dapat menerima sejumlah parameter. |