Terjemahan artikel ini disiapkan khusus untuk siswa kursus Pengembang PHP Backend .
PHP 7.4 menambahkan preloading, fitur yang dapat secara signifikan meningkatkan kinerja kode.
Singkatnya, singkatnya.
- Untuk memuat file Anda harus menulis skrip PHP terpisah.
- Script ini dijalankan sekali pada permulaan server.
- Semua file yang dimuat sebelumnya tersedia dalam memori untuk semua permintaan.
- Perubahan yang dilakukan pada file sumber tidak akan berfungsi sampai Anda me-restart server.
Mari kita bicara tentang fitur baru secara lebih rinci.
Lebih dari Opcache
Ya, preloading didasarkan pada opcache, tapi itu tidak persis sama. Opcache mengambil file sumber PHP, mengkompilasinya menjadi opcodes, dan kemudian menyimpan file yang dikompilasi ke disk.
Opcodes dapat dianggap sebagai representasi tingkat rendah dari kode Anda yang mudah ditafsirkan saat runtime. Dengan demikian, opcache memungkinkan Anda untuk melewati tahap menerjemahkan file sumber ke dalam apa yang sebenarnya dibutuhkan oleh penerjemah PHP pada saat dijalankan. Penghematan yang nyata!
Namun, Anda dapat menyimpan lebih banyak lagi. Dikompilasi dengan file
opcash
tidak tahu apa-apa tentang file lain. Jika Anda memiliki kelas A, yang merupakan perluasan dari kelas B, mereka masih perlu dihubungkan pada saat runtime. Selain itu, opcache memeriksa untuk melihat apakah file sumber telah berubah, dan saat mendeteksi perubahan akan membuat cache mereka tidak valid.
Dan di sini preload datang untuk menyelamatkan: itu tidak hanya mengkompilasi file sumber menjadi opcodes, tetapi juga menghubungkan kelas, sifat, dan antarmuka yang tergantung. Ini menyimpan fragmen "dikompilasi" seperti kode dieksekusi (yaitu, kode yang dapat digunakan penerjemah PHP) dalam memori.
Ketika permintaan tiba di server, ia dapat menggunakan bagian-bagian dari basis kode yang telah dimuat ke dalam memori, tanpa waktu tambahan.
Apa "bagian dari basis kode" yang sedang kita bicarakan?
Lakukan preloading
Untuk preloading yang benar, pengembang harus memberi tahu server file mana yang harus diunduh. Ini dilakukan menggunakan skrip PHP sederhana, jadi tidak ada yang perlu ditakutkan.
Tidak ada yang rumit.
- Anda memberikan skrip preload dan menautkannya ke file php.ini menggunakan
opcache.preload
. - Setiap file PHP yang Anda ingin preload harus dilewatkan ke
opcache_compile_file()
dari skrip preload.
Katakanlah Anda ingin memuat semacam kerangka kerja. Biarkan itu menjadi Laravel. Dalam hal ini, skrip Anda harus melihat semua file PHP di
vendor/laravel
dan menambahkannya satu per satu.
Berikut ini cara Anda dapat memasukkan skrip ini dalam php.ini:
opcache.preload=/path/to/project/preload.php
Dan berikut ini adalah contoh implementasi:
$files = ; foreach ($files as $file) { opcache_compile_file($file); }
Alih-alih
opcache_compile_file
Anda dapat menggunakan
include
. Namun, tampaknya ada
bug di sini , karena pada saat penulisan opsi kedua tidak berfungsi.
Peringatan bahwa Anda tidak dapat melakukan pramuat kelas yang tidak terkait
Ada peringatan
Tidak bisakah memuat sebelumnya kelas yang tidak ditautkan ? Faktanya adalah bahwa sebelum preloading file, Anda juga perlu melakukan preload objek dependen mereka - antarmuka, sifat, dan kelas induk.
Jika Anda mengalami masalah dengan dependensi kelas, Anda akan diperingatkan tentang ini ketika memulai server:
Can't preload unlinked class Illuminate\Database\Query\JoinClause: Unknown parent Illuminate\Database\Query\Builder
Perhatikan bahwa
opcache_compile_file()
hanya
opcache_compile_file()
-
opcache_compile_file()
file, tetapi tidak akan menjalankannya. Ini berarti bahwa jika suatu kelas memiliki dependensi yang belum dimuat sebelumnya, maka kelas itu sendiri tidak dapat dimuat sebelumnya.
Ini tidak penting: server akan berfungsi seperti biasa, tetapi Anda tidak akan memiliki semua file yang ingin Anda muat sebelumnya.
Itu sebabnya Anda harus hati-hati memilih file untuk dimuat sebelum untuk menghindari masalah ketergantungan. Melakukannya secara manual adalah tugas yang tidak berterima kasih dan menghabiskan waktu, sehingga pengembang sudah bekerja pada solusi otomatis.
Dukungan komposer
Solusi otomatis paling menjanjikan sedang disiapkan oleh pengembang komposer, yang sudah digunakan di sebagian besar proyek PHP modern.
Sekarang orang-orang bekerja pada kemampuan untuk mengkonfigurasi preload di
composer.json
, yang pada gilirannya akan menghasilkan file preload, bukan Anda. Seperti preloading itu sendiri, fitur ini masih dalam pengembangan. Anda dapat mengikuti perkembangan acara di
sini .
Untungnya, Anda tidak perlu mengkonfigurasi file preload secara manual jika Anda tidak menginginkannya - komposer dapat melakukannya untuk Anda.
Persyaratan server
Ada dua poin penting lain yang harus diingat pengembang saat menggunakan preload.
Anda sudah tahu bahwa Anda perlu membuat entri di
php.ini
agar preload berfungsi. Ini berarti bahwa jika Anda menggunakan hosting bersama, Anda tidak akan dapat mengkonfigurasi PHP sesuka Anda.
Dalam praktiknya, Anda akan memerlukan server khusus (virtual) untuk mengoptimalkan file yang dimuat sebelumnya untuk satu proyek. Ingatlah ini.
Ingat juga bahwa Anda harus me-restart server (jika Anda menggunakan
php-fpm
, ini sudah cukup) setiap kali Anda ingin memuat ulang file dalam memori. Bagi sebagian besar, ini jelas, tetapi tidak akan berlebihan untuk mengingat.
Performa
Sekarang untuk pertanyaan yang paling penting: apakah preloading benar-benar meningkatkan kinerja?
Tentu saja! Ben Morel membagikan hasil pengujian komparatif, yang dapat ditemukan dalam
topik yang sama
tentang komposer , yang kami sebutkan di atas.
Dan juga, itu menarik. Jika mau, Anda hanya dapat memuat sebelumnya yang disebut
hot classes
- kelas yang sering digunakan dalam basis kode Anda. Tes Ben Morel menunjukkan bahwa memuat hanya sekitar 100 dari kelas-kelas ini memberikan peningkatan kinerja yang lebih tinggi daripada preloading semuanya sekaligus. Dalam kasus pertama, produktivitas meningkat sebesar 17%, dalam kasus kedua - sebesar 13%.
Tentu saja, pilihan kelas untuk preloading tergantung pada proyek spesifik. Adalah bijaksana untuk memulai dengan hanya melakukan preloading sebanyak mungkin. Jika beberapa persen perbedaan dalam kinerja ini sangat penting bagi Anda, Anda harus mengontrol kode saat runtime.
Semua operasi ini, tentu saja, dapat diotomatisasi, dan ini kemungkinan akan dilakukan di masa depan.
Sekarang penting bahwa dukungan pra-muat ditambahkan ke
composer
, yang menghilangkan kebutuhan untuk membuat file sendiri. Fitur ini sangat mudah dikonfigurasi di server, asalkan itu sesuai keinginan Anda.
Apakah Anda akan menggunakan preloading dalam versi baru PHP 7.4? Ada pemikiran atau komentar? Email saya di
Twitter atau
Email .
Secara tradisional, kami menunggu komentar dan keuntungan Anda jika Anda menemukan artikel yang menarik :-)