Penjana dalam PHP menyediakan cara yang kuat untuk melelehkan dataset besar tanpa memuatkan keseluruhan dataset ke dalam memori sekaligus. Mereka mencapai ini dengan menghasilkan nilai satu demi satu, bukannya mengembalikan array lengkap. Ini amat bermanfaat apabila berurusan dengan sumber data yang terlalu besar untuk disesuaikan dengan selesa dalam ingatan, seperti fail besar atau hasil pangkalan data.
Untuk menggunakan penjana, anda menentukan fungsi yang menggunakan kata kunci . Setiap kali menghasilkan kata kunci
ditemui, penjana menjeda pelaksanaan dan mengembalikan nilai yang dihasilkan. Pada masa yang akan datang, penjana dipanggil (misalnya, menggunakan gelung ), pelaksanaan semula dari mana ia ditinggalkan.
Berikut adalah contoh mudah fungsi penjana yang menghasilkan nombor dari 1 hingga 5:
}} foreach (numberGenerator () sebagai $ nombor) {echo $ number. & quot; & quot ;; // output: 1 2 3 4 5} Penjana ini tidak menyimpan semua nombor dalam array; Ia menghasilkan mereka satu demi satu yang diperlukan. Penjana yang lebih kompleks boleh membaca data dari fail, pangkalan data, atau sumber lain, menghasilkan nilai seperti yang diproses, dengan itu mengekalkan jejak memori kecil. Anda juga boleh menggunakan hasil dari
untuk mewakilkan lelaran kepada penjana lain, menjadikan lelaran kompleks lebih mudah untuk dikendalikan.
Walaupun overhead awal membuat dan memanggil penjana mungkin sedikit lebih tinggi daripada mengakses array yang sedia ada, ini biasanya boleh diabaikan berbanding dengan simpanan memori dan keuntungan prestasi untuk dataset yang besar. Peningkatan prestasi menjadi lebih ketara apabila saiz dataset meningkat. Tambahan pula, penjana dapat meningkatkan prestasi dengan membenarkan penilaian malas-pengiraan hanya dilakukan apabila nilai sebenarnya diminta, dan bukannya pra-mengira segala-galanya di hadapan. Keupayaan mereka untuk menghasilkan nilai satu demi satu bermakna hanya sebahagian kecil daripada data yang perlu diadakan dalam ingatan pada bila -bila masa. Ini adalah penting untuk dataset yang terlalu besar agar sesuai dengan RAM.
Sebagai contoh, pertimbangkan untuk memproses fail log besar. Daripada memuatkan keseluruhan fail ke dalam array, anda boleh menggunakan penjana untuk membaca dan memproses baris fail mengikut baris. Setiap baris dihasilkan secara individu, menghalang keseluruhan fail daripada dimuatkan ke dalam ingatan. Pendekatan ini secara dramatik mengurangkan penggunaan memori dan mengelakkan kesilapan memori yang berpotensi. Begitu juga, anda boleh menggunakan penjana untuk memproses data dengan cekap dari pangkalan data, aliran rangkaian, atau sumber data yang besar.
<code class="php"> ProcessLargeFile ($ filename) {$ handle = fopen ($ filename, 'r'); jika ($ handle === false) {membuang pengecualian baru (& quot; tidak dapat membuka fail: $ filename & quot;); } sementara (($ line = fgets ($ handle))! == false) {hasil trim ($ line); // menghasilkan setiap baris selepas memotong ruang putih} fclose ($ handle); } foreach (ProcessLargeFile ('my_large_file.txt') sebagai $ line) {// Proses setiap baris secara individu echo & quot; baris pemprosesan: & quot; . $ line. Php_eol; } </code>
Penjana ini membuka fail, membacanya mengikut baris menggunakan fgets ()
, dan menghasilkan setiap baris. Fungsi trim ()
menghilangkan ruang putih yang terkemuka/trailing. Selepas memproses semua baris, fail ditutup. Ini mengelakkan menyimpan keseluruhan kandungan fail dalam ingatan. Anda boleh menyesuaikan pendekatan ini untuk aliran data lain, seperti sambungan rangkaian atau set hasil pangkalan data, dengan menggantikan fgets ()
dengan fungsi yang sesuai untuk membaca data dari sumber tersebut. Pengendalian ralat, seperti yang ditunjukkan dengan pengecualian
Dalam contoh ini, adalah penting untuk pemprosesan aliran yang mantap.
Atas ialah kandungan terperinci Bagaimana cara menggunakan penjana untuk lelaran efisien memori dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!