4 poin oleh GN⁺ 2024-05-31 | 1 komentar | Bagikan ke WhatsApp
  • 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
  • Eksekusi lokal mencakup server web dan CLI
    • frankenphp php-server -r public/: menyajikan direktori public/
    • frankenphp php-cli script.php: menjalankan skrip PHP command-line
  • Eksekusi Docker juga ditangani dengan image yang sama
    • Menyajikan direktori public/ dengan image dunglas/frankenphp
    • Dapat menjalankan skrip CLI seperti php script.php dari image yang sama
  • Konfigurasinya berbasis Caddy; contoh konfigurasi menyalakan kompresi di dalam blok localhost dan memproses file PHP serta aset statis di direktori saat ini dengan php_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

 
GN⁺ 2024-05-31
Komentar Hacker News
  • Sudah hampir 10 tahun tidak mengembangkan dengan PHP, tapi setelah melihat landing page ini rasanya nyaris ingin menjalankan hello world saja
    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
    • Sedikit lebih dari 10 tahun lalu saya pindah dari PHP ke Golang, dan alasannya adalah karena distribusi biner itu sangat bagus
      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
    • Ini salah satu landing page terbaik yang pernah saya lihat. Menyenangkan dan langsung mudah dipahami
  • Sudah lama memakai C# dan sekarang kebanyakan menulis dengan PHP 8, dan ini bahasa yang luar biasa untuk membuat sesuatu dengan cepat
    Daripada menuju arah yang butuh konfigurasi Apache agak rumit seperti LAMP dulu, bahasa ini memang seharusnya bergerak ke arah seperti ini
    • Saya sudah 18 tahun memakai PHP, dan dengan nginx + php-fpm, konfigurasi cukup 5 menit
      Saya juga berniat mencoba ini, tapi saya belum pernah mengalami bottleneck dengan nginx maupun Apache. Menyalakan salah satunya pun paling cuma butuh beberapa menit
    • Opsi lain adalah Nginx Unit: https://unit.nginx.org/
      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
    • Saya hampir tidak pernah mengonfigurasi PHP, tapi dari yang saya ingat, setiap kali memasang ulang desktop, semuanya selesai sangat cepat dan mulus dengan apt-get
      Selain me-restart Apache, saya bahkan tidak ingat melakukan hal lain
    • Saya juga bertanya-tanya apakah konfigurasi Apache memang seburuk itu. Kalau memakai hal seperti PHP-FPM, kelihatannya cukup oke: https://news.ycombinator.com/item?id=40256843
      Cuma sekitar LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so" dan SetHandler "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=37443911
      Ada 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
    • Setuju. Kalau budaya yang mengandalkan SQLite alih-alih PostgreSQL/MySQL makin mapan, seluruh aplikasi server-side bisa menjadi biner mandiri yang sederhana
      Kalau sudah berupa biner, akan lebih mudah juga untuk dibundel ke aplikasi Electron
  • Saat development, saya sering memakai web server bawaan PHP: php -S 0.0.0.0:8000 public/index.php
    Tapi 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
    • Web server bawaan PHP secara eksplisit disebut bukan untuk produksi di dokumentasinya, dan hanya untuk tujuan development
      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
    • Anda bisa menjalankannya dengan beberapa thread dengan mengatur PHP_CLI_SERVER_WORKERS
    • Saya penasaran apakah ketidaklayakan untuk produksi itu cuma soal performa
      Kalau untuk situs kecil dengan sedikit pengguna, saya ingin tahu apa yang akan hilang dibanding lingkungan lain yang “siap produksi”
    • Setahu saya, masalah spesifik bahwa ini single-threaded dan lambat sehingga tidak cocok untuk produksi memang diselesaikan oleh ini. Sepertinya masalah lain juga ikut diperbaiki
  • Saya sudah mencobanya langsung dan hasilnya benar-benar lambat, dan tampaknya juga tidak bisa memanfaatkan core dengan baik. Saya membaca dokumentasi yang kurang lengkap cukup lama, tapi tidak berhasil menyelesaikannya
    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
    • Saya pembuat FrankenPHP. Saya benar-benar ingin menerima contoh yang bisa direproduksi

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

  • Jika Anda membagikan pengalaman itu, itu akan membantu menyelesaikannya: https://github.com/dunglas/frankenphp/discussions/294
    Caddy sendiri memberi performa yang sangat baik bahkan saat dipakai bersama PHP, jadi ini situasi yang cukup aneh
  • Penasaran bagaimana hasilnya di benchmark TechEmpower: https://www.techempower.com/benchmarks/#hw=ph&test=fortune&s...
    Saat ini ada di posisi paling bawah dengan status did not complete
  • Tulisan terkait: Show HN: FrankenPHP, server aplikasi untuk PHP yang ditulis dalam Go - https://news.ycombinator.com/item?id=33205282 - Oktober 2022, 83 komentar
  • https://github.com/dunglas/frankenphp/discussions/294
    Ada masalah performa. Di luar itu, ini proyek yang sangat menjanjikan
    • Jika bisa direproduksi, saya dengan senang hati akan mengambil cuti 2 minggu dari kantor untuk memperbaikinya. Belum ada yang memberi tahu cara mereproduksinya
  • Saya sudah membenchmark WordPress di FrankenPHP dan Apache Mod-PHP, tetapi belum melihat bukti bahwa FPHP menang
    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
    • Berbeda dengan Laravel dan Symfony, WordPress belum mendukung mode worker FrankenPHP, jadi keuntungan performanya tidak banyak
      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
    • Mungkin hanya karena sudah terbiasa memakai nama itu, tetapi secara standar seharusnya menggunakan proxy_fcgi di Apache
      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/frankenphp
    Jika 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-php dan pengaturan /etc/apache2/sites-enabled/000-default.conf
    Saya 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
    • Sebulan lalu saya mulai bekerja di perusahaan yang memakai mod_php, dan itu menyakitkan
      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
    • Kalau saya tidak salah paham, ini sepertinya tidak akan berjalan. Apakah virtual host Apache 000-default.conf bawaan mengalihkan 443 ke 80?
  • Senang melihat ini di halaman depan HN
    FPM dan arsitektur tanpa berbagi miliknya dulu merupakan kunci keberhasilan PHP, tetapi pada saat yang sama rasanya juga menjadi belenggu bagi PHP