Pernah membuat aplikasi web dengan jumlah tabel banyak pada project PHPMaker 2023? Jika ya, pastikan 2 opsi berikut kita aktifkan dari menu Tools -> Advanced Settings:
- Compile container for production
- Use route cache for production
Memang tidak ada patokan untuk ukuran “banyak” di sini. Kita asumsikan saja jika jumlah tabel di database yang di-generate oleh PHPMaker lebih dari 50, itu sudah termasuk banyak. Penulis bahkan pernah menggunakan 60-an Table dan 80-an View atau totalnya kurang lebih 140-an object di dalam sebuah project PHPMaker.
Kembali ke 2 opsi di atas! Mari kita bahas satu per satu.
Compile container for production. Seperti yang kita ketahui, PHPMaker menggunakan PHP-DI di mana DI singkatan dari Dependency Injection. PHP-DI sendiri memiliki jargon: The dependency injection container for humans. Kalau diartikan kurang lebih: Kontainer injeksi ketergantungan untuk manusia. Hmm, apa pulak itu? Dari dokumentasinya mengatakan seperti ini:
Dependency injection dan dependency injection containers adalah hal yang berbeda:
- dependency injection adalah sebuah method untuk menulis kode yang lebih baik
- a container adalah sebuah tool untuk membantu melakukan injecting dependencies.
Kita tidak membutuhkan container untuk melakukan dependency injection. Tapi, sebuah container dapat membantu kita untuk melakukan dependency injection. Jadi, PHP-DI kurang lebih artinya seperti ini: membuat proses dependency injection menjadi lebih praktis.
Nah, kembali ke pengaturan di atas tadi. Opsi Compile container for production berfungsi untuk mengkompilasi dependency injection container ke dalam kode PHP yang sudah dioptimasi, khususnya untuk konfigurasi dan class yang digunakan di source code aplikasi web kita. Jika opsi Compile container for production diaktifkan dan opsi Environment (Tools -> Advanced Settings) yang dipilih adalah production, maka itu artinya proses kompilasi akan dilakukan oleh aplikasi web.
Jadi, jika opsi tadi diaktifkan, container akan dikompilasi sekali dan tidak akan pernah di-generate ulang lagi. Ketika kita men-deploy versi baru file script (sebagai contoh, setelah menambahkan atau menghapus tabel) pada server production, kita harus menghapus file yang sudah di-generate tadi ({ProjectFolder} / {UploadPath} / cache / CompiledContainer.php) untuk memastikan bahwa container akan dikompilasi ulang kembali oleh aplikasi web kita.
Jika masih penasaran atau ingin tahu lebih lanjut, silahkan baca-baca perbandingan antara kode PHP classic, menggunakan dependency injection, dan menggunakan container dari ketiga link tadi.
Itulah penjelasan kurang lebih untuk opsi yang pertama.
Berikutnya mari kita bahas opsi yang kedua.
Use route cache for production, seperti namanya yang artinya apakah kita ingin menggunakan cache untuk route saat aplikasi web kita digunakan di server production. Jika opsi Environment (Tools -> Advanced Settings) yang dipilih adalah production, dan opsi Use route cache for production diaktifkan, maka penggunaan route cache akan dimungkinkan. Jika Anda memiliki jumlah tabel yang banyak, disarankan untuk mengaktifkan opsi ini untuk performansi routing yang lebih baik.
Jadi, jika diaktifkan, cache akan dikompilasi sekali dan tidak akan di-generate lagi oleh aplikasi web. Ketika kita men-deploy versi baru file script (sebagai contoh, setelah menambahkan atau menghapus sebuah tabel) pada lingkungan production, maka kita harus menghapus file (<ProjectFolder> / <UploadPath> / cache / RouteCache.php) untuk memastikan bahwa cache akan dikompilasi ulang oleh aplikasi web.
Mungkin ada yang bertanya, lantas apa bedanya dong jika kita tidak mengaktifkan kedua opsi di atas tadi? Pertanyaan yang bagus!
Jawabannya, maka setiap kali sistem mengakses sebuah halaman, maka sistem akan membuat ulang Container dan membuat ulang Route untuk halaman tadi. Begitu terus yang akan selalu terjadi. Bayangkan jika kondisi ini terjadi pada sebuah aplikasi web yang memiliki jumlah tabel yang sangat banyak, misalnya sampai 100-an lebih tabel. Tentu sangat tidak efektif dan tidak efisien sekali, bukan?
Dengan diaktifkannya kedua opsi tadi, maka sistem akan menghasilkan masing-masing 2 file seperti yang sudah dijelaskan di atas. Sistem tidak perlu melakukan injection ulang, dan tidak perlu lagi membuat ulang route untuk banyak table tadi. Sistem cukup membaca konfigurasi yang sudah dihasilkan pada kedua file tersebut.
Menurut pengalaman penulis, dengan mengaktifkan kedua opsi di atas, memang terjadi peningkatan performansi yang cukup signifikan pada aplikasi web di server production. Waktu yang digunakan untuk memuat aplikasi web menjadi jauh lebih cepat, dan relatif lebih stabil. Tidak percaya? Buktikan sendiri sekarang!
Pengalaman penulis lainnya, karena lokasi folder di localhost untuk development bisa saja berbeda dengan di server production, maka setelah meng-upload ulang file script versi baru ke server production, pastikan untuk menghapus kedua file di atas tadi, yaitu CompiledContainer.php dan RouteCache.php yang lokasinya berada pada folder <ProjectFolder> / <UploadPath> / cache /.
Jika file CompiledContainer.php tidak dihapus terlebih dulu, maka dampaknya aplikasi web menjadi tidak bisa diakses dengan normal. Mengapa? Karena kode konfigurasi untuk class PHP yang dihasilkan di file tersebut bisa saja berbeda versinya antara localhost dan production. Tergantung dengan nama folder tempat kita menempatkan file script aplikasi web kita.
Jadi, jangan panik dulu jika aplikasi web yang kita hasilkan di localhost berjalan dengan normal, sementara ketika diakses pada server production, hasilnya tidak sesuai dengan yang diharapkan. Bisa jadi hal ini disebabkan oleh penggunaan 2 opsi di atas tadi. Oke?
Oleh karena itu, untuk amannya, selalu hapus file CompiledContainer.php terlebih dulu di server production jika kita baru saja men-deploy versi baru dari file script aplikasi web kita, supaya aplikasi web di server production melakukan kompilasi ulang kode konfigurasi dan Class, sekaligus membuat ulang file CompiledContainer.php pada folder <ProjectFolder> / <UploadPath> / cache /.
Demikian juga halnya dengan file RouteCache.php, pastikan untuk menghapusnya terlebih dulu pada folder <ProjectFolder> / <UploadPath> / cache / supaya aplikasi web dapat mengkompilasi ulang route cache yang dimaksud.
Oh iya, satu lagi. Pastikan folder cache di atas permission-nya sudah diset untuk dapat ditulisi, ya. Supaya sistem dapat mengkompilasi sekaligus membuatkan kedua file tadi dengan sempurna.
Dani Cahya mengatakan
Maaf Bertanya dIluar konteks lagi pak mungkin bapak tau tipe seperti apakah PHPMaker ini apakah Stateless Atau Statefull, karena problem yang sebelum nya saya alami belum terpecahkan terkait aplikasi saya yang lemot saya jadi ingin mencoba menggunaka load balancer di struktur aplikasi dengan 5 Server yaitu : Server DB, Server Data/Dokumen, 2 Server App dan 1 Server Load Balancer. Terima Kasih
Masino Sinaga mengatakan
Barusan saya cari-cari di dokumentasi PHPMaker, tidak ada satu katapun di sana yang mengatakan stateful, dan hanya ada satu topik yang membahas stateless, yaitu: Authenticate User with JWT (JSON Web Token).
Mengenai Load Balancer, silahkan dicoba, kabarkan hasilnya ya. Trims.