FrankenPHP: Server aplikasi PHP modern
(frankenphp.dev)- Dalam alur deployment yang ingin menjalankan aplikasi PHP tanpa PHP-FPM terpisah, FrankenPHP adalah server aplikasi berbasis Go yang menyematkan runtime PHP resmi di Caddy, sehingga aplikasi web PHP dan skrip CLI dapat dijalankan dengan satu perintah
- Mengurangi konfigurasi server dengan menggabungkan fitur bawaan seperti HTTP/1.1·HTTP/2·HTTP/3, sertifikat HTTPS otomatis, kompresi Brotli/Zstandard/Gzip, structured logging, dan metrik Prometheus
- Worker mode mem-boot aplikasi sekali lalu mempertahankannya di memori; dijelaskan bahwa pada benchmark internal aplikasi API Platform, hasilnya 3,5 kali lebih cepat daripada FPM
- Kompatibel dengan PHP 8.2+, sebagian besar ekstensi PHP, dan modul Caddy, serta mendukung ekstensi populer seperti OPcache dan XDebug secara native
- Mendukung deployment melalui image Docker, Kubernetes, platform cloud, dan binary statis mandiri, sehingga dapat menyederhanakan unit deployment aplikasi PHP
Cara menjalankan dan alur penggunaan dasar
- FrankenPHP ditujukan sebagai server aplikasi PHP modern yang ditulis dalam Go, dengan instalasi dan eksekusi server aplikasi PHP yang berpusat pada satu perintah
- Contoh instalasi dibagi menurut sistem operasi
- Linux/macOS:
curl https://frankenphp.dev/install.sh | sh - Windows PowerShell:
irm https://frankenphp.dev/install.ps1 | iex
- Linux/macOS:
- Eksekusi lokal mencakup server web dan CLI
frankenphp php-server -r public/: menyajikan direktoripublic/frankenphp php-cli script.php: menjalankan skrip PHP command-line
- Eksekusi Docker juga ditangani dengan image yang sama
- Menyajikan direktori
public/dengan imagedunglas/frankenphp - Dapat menjalankan skrip CLI seperti
php script.phpdari image yang sama
- Menyajikan direktori
- Konfigurasinya berbasis Caddy; contoh konfigurasi menyalakan kompresi di dalam blok
localhostdan memproses file PHP serta aset statis di direktori saat ini denganphp_server
Fitur server dan kompatibilitas PHP
-
Fitur server web
- Menyematkan runtime PHP resmi ke dalam Caddy
- Mendukung HTTP/1.1, HTTP/2, dan HTTP/3 secara native
- Mengotomatiskan pembuatan, pembaruan, dan pencabutan sertifikat HTTPS melalui Let’s Encrypt atau ZeroSSL
- Mendukung kompresi Brotli, Zstandard, dan Gzip secara bawaan
- Mencakup structured logging dan dukungan Prometheus
-
Lingkungan eksekusi PHP
- Kompatibel dengan PHP 8.2+, sebagian besar ekstensi PHP, dan semua modul Caddy
- Mendukung ekstensi PHP populer termasuk OPcache dan XDebug secara native
- Tidak memerlukan PHP-FPM dan menggunakan SAPI sendiri yang dibuat untuk server web Go
Worker mode dan fitur berorientasi performa
- Worker mode mem-boot aplikasi sekali lalu mempertahankannya di memori, sehingga siap memproses permintaan dalam beberapa milidetik
- Didukung secara native di Symfony, API Platform, dan Laravel
- Menggunakan superglobal PHP yang sudah ada tanpa PSR-7
- Tetap dapat menyajikan aplikasi meskipun aplikasi tidak kompatibel dengan Worker mode
- Menyediakan watcher yang otomatis me-restart worker saat ada perubahan kode
- Diperkenalkan sebagai menunjukkan performa 3,5 kali lebih cepat daripada FPM dalam benchmark internal berbasis aplikasi API Platform
Deployment dan packaging
- Dapat men-deploy aplikasi cloud native dengan image Docker
- Kompatibel dengan Kubernetes dan platform cloud modern
- Aplikasi web PHP dan tool command-line dapat dipaketkan sebagai binary statis mandiri
- Dijelaskan berjalan sebagai satu layanan dan satu binary, tanpa memerlukan layanan eksternal
Fitur platform web tambahan
- Mendukung 103 Early Hints dan diperkenalkan, berdasarkan artikel Cloudflare, sebagai fitur yang dapat meningkatkan waktu muat situs web sebesar 30%
- Melalui hub Mercure bawaan, aplikasi PHP dapat mengirim event ke browser yang terhubung, dan browser dapat langsung menerima payload sebagai event JavaScript
- Mendukung deployment tanpa downtime dengan graceful reload
1 komentar
Komentar Hacker News
Karakter gajah Frankenstein-nya aneh, jelek, tapi juga imut. Desain, warna, copy, dan animasinya rapi. Dari sudut pandang orang yang sudah lama jauh dari pengembangan PHP, nilai yang ditawarkan terlihat jelas, dan tampaknya cocok untuk mulai cepat dengan hal kecil
Saya tidak ingin menjalankan 8 container hanya untuk mengisolasi software buruk atau dependensi yang kusut. Saya juga tidak suka pendekatan melemparkan ke dunia sesuatu yang pada dasarnya membungkus “berjalan di komputer saya” alih-alih merilis software yang benar-benar bisa diinstal. Mungkin akan saya sentuh lagi karena nostalgia, tapi saya tidak yakin masih ingin menaruh hal seperti ini di lingkungan produksi
Daripada menuju arah yang butuh konfigurasi Apache agak rumit seperti LAMP dulu, bahasa ini memang seharusnya bergerak ke arah seperti ini
Saya juga berniat mencoba ini, tapi saya belum pernah mengalami bottleneck dengan nginx maupun Apache. Menyalakan salah satunya pun paling cuma butuh beberapa menit
Ini berjalan sebagai layanan tunggal seperti Apache + mod_php, menangani multiproses PHP dan bahasa lain, file statis, reverse proxy, dan bisa mengelola dirinya sendiri serta PHP lewat file atau socket runtime dalam satu konfigurasi: https://unit.nginx.org/configuration/#php
Contoh konfigurasi nyata ada di https://github.com/PrivateBin/docker-unit-alpine/blob/master..., dan image container hasilnya juga bisa dibuat cukup kecil: https://hub.docker.com/r/privatebin/unit-alpine
Selain me-restart Apache, saya bahkan tidak ingat melakukan hal lain
Cuma sekitar
LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so"danSetHandler "proxy:fcgi://127.0.0.1:9000". Ada juga contoh Nginx yang secara konsep mirip dengan cara konfigurasi Apache, termasuk pemasangan paket yang diperlukan: https://news.ycombinator.com/item?id=37443911Ada juga image container prebuilt yang bisa memberi hasil serupa, tapi kalau ingin melihat bagaimana bagian dalamnya bekerja, Anda bisa mencobanya sendiri. Jelas lebih mudah daripada mengatur Tomcat atau GlassFish secara manual seperti server aplikasi Java zaman dulu, dan walaupun satu perintah eksekusi tunggal memang lebih baik di lingkungan apa pun, LAMP tidak seburuk itu dibanding stack lain
Kalau sudah berupa biner, akan lebih mudah juga untuk dibundel ke aplikasi Electron
php -S 0.0.0.0:8000 public/index.phpTapi ini single-threaded dan lambat, jadi bukan untuk produksi. FrankenPHP terlihat menjanjikan, tetapi isu batas core/thread[2] juga tampak bisa menjadi masalah di produksi. Meski begitu, mungkin menarik untuk mencoba menerapkannya ke proyek pure-todo[1] dan melihat apakah masalah yang sama muncul. Image Docker bawaannya terlihat cukup bagus
1: https://github.com/sandreas/pure-todo
2: https://github.com/dunglas/frankenphp/discussions/294
Lihat peringatan di bagian atas halaman: https://www.php.net/manual/en/features.commandline.webserver...
Dalam konteks ini, saya juga kurang yakin adil kalau dijadikan pembanding
PHP_CLI_SERVER_WORKERSKalau untuk situs kecil dengan sedikit pengguna, saya ingin tahu apa yang akan hilang dibanding lingkungan lain yang “siap produksi”
Katanya dengan beberapa perintah saja sudah siap produksi dan 3,5x lebih cepat daripada FPM, tapi di lingkungan saya justru berjalan di sekitar 1% dari performa FPM. Saya juga mencoba file executable-nya, tapi masalahnya sama, dan untuk hello world saya berharap setidaknya 200K rps
Di sebagian besar benchmark, saat mode worker aktif, FrankenPHP biasanya jauh lebih cepat daripada FPM, kira-kira sekitar 3x. Meski begitu, ada beberapa kasus pengecualian dan sedang diperbaiki bersama para maintainer PHP
Caddy sendiri memberi performa yang sangat baik bahkan saat dipakai bersama PHP, jadi ini situasi yang cukup aneh
Saat ini ada di posisi paling bawah dengan status did not complete
Ada masalah performa. Di luar itu, ini proyek yang sangat menjanjikan
Namun saya belum menggali terlalu dalam, dan pengujiannya dilakukan di dalam Docker, bukan dengan pengaturan biasa. WordPress-nya juga hampir default, jadi bukan kondisi yang realistis karena tidak ada tema berat dan semacamnya. Tetap saja, saya ingin menguji ulang dan memahaminya dengan lebih baik
Namun, dengan 103 Early Hints, aset bisa dimuat lebih awal sehingga waktu tunda pemuatan halaman bisa dikurangi 30%. Selain itu, FrankenPHP memudahkan mengaktifkan cache HTTP di WordPress dan menyederhanakan deployment. Ada juga proyek khusus WordPress + FrankenPHP, lengkap dengan cache HTTP bawaan yang disesuaikan untuk WordPress menggunakan library Go Souin: https://github.com/StephenMiracle/frankenwp
Ini bisa sedikit menghemat memori Apache dan memberi ruang untuk menangani lebih banyak request PHP
docker run -v $PWD:/app/public -p 443:443 \ dunglas/frankenphpJika Anda ingin langsung membuat container Docker yang menyajikan aplikasinya, sepertinya perintah berikut sudah cukup untuk mengubah Debian baru menjadi container yang dibutuhkan:
apt install -y apache2 libapache2-mod-phpdan pengaturan/etc/apache2/sites-enabled/000-default.confSaya memelihara repositori yang menunjukkan proses dari nol sampai menjadi aplikasi web yang berjalan dengan beberapa bahasa dan framework populer bersama teman-teman: https://github.com/no-gravity/web_app_from_scratch
Setiap kali menyalakan xdebug, saya harus me-restart Apache setelah sesi debugging. Sejak kemarin saya mulai mengatur apache2 agar memakai php-fpm, tetapi setidaknya untuk lingkungan pengembangan, saya penasaran apakah FrankenPHP ini cocok untuk kami. Hanya saja saya tidak menemukan cara memasang ekstensi php di dokumentasinya
000-default.confbawaan mengalihkan 443 ke 80?FPM dan arsitektur tanpa berbagi miliknya dulu merupakan kunci keberhasilan PHP, tetapi pada saat yang sama rasanya juga menjadi belenggu bagi PHP