FrankenPHP: Modern PHP uygulama sunucusu
(frankenphp.dev)- PHP uygulamalarını ayrı bir PHP-FPM olmadan çalıştırmayı hedefleyen dağıtım akışlarında FrankenPHP, Caddy’ye resmi PHP çalışma zamanını gömen Go tabanlı bir uygulama sunucusu olarak PHP web uygulamalarını ve CLI betiklerini tek komutla çalıştırmayı sağlıyor
- HTTP/1.1, HTTP/2, HTTP/3, otomatik HTTPS sertifikaları, Brotli/Zstandard/Gzip sıkıştırma, yapılandırılmış loglama ve Prometheus metriklerini varsayılan özellikler olarak bir araya getirerek sunucu yapılandırmasını azaltıyor
- Worker mode, uygulamayı bir kez başlatıp bellekte tutuyor; API Platform uygulamasında yapılan kendi benchmark’ına göre FPM’den 3.5 kat daha hızlı sonuç verdiğini söylüyor
- PHP 8.2+, çoğu PHP uzantısı ve Caddy modülleriyle uyumlu; OPcache ve XDebug gibi popüler uzantıları da yerel olarak destekliyor
- Docker imajı, Kubernetes, bulut platformları ve bağımsız çalıştırılabilir statik binary dağıtımını destekleyerek PHP uygulaması dağıtım birimini sadeleştirebiliyor
Çalışma biçimi ve temel kullanım akışı
- FrankenPHP, Go ile yazılmış modern bir PHP uygulama sunucusu olmayı hedefliyor ve PHP uygulama sunucusunun kurulumu ile çalıştırılmasını tek komut merkezli bir yapıda sunuyor
- Kurulum örnekleri işletim sistemine göre ayrılıyor
- Linux/macOS:
curl https://frankenphp.dev/install.sh | sh - Windows PowerShell:
irm https://frankenphp.dev/install.ps1 | iex
- Linux/macOS:
- Yerelde çalıştırma hem web sunucusunu hem de CLI tarafını kapsıyor
frankenphp php-server -r public/:public/dizinini sunarfrankenphp php-cli script.php: komut satırı PHP betiğini çalıştırır
- Docker ile çalıştırma da aynı imaj üzerinden yapılıyor
dunglas/frankenphpimajıylapublic/dizini sunulabilir- Aynı imajda
php script.phpgibi CLI betikleri de çalıştırılabilir
- Yapılandırma Caddy tabanlı; örnek yapılandırmada
localhostbloğu içinde sıkıştırma etkinleştirilipphp_serverile mevcut dizindeki PHP dosyaları ve statik varlıklar işleniyor
Sunucu özellikleri ve PHP uyumluluğu
-
Web sunucusu özellikleri
- Resmi PHP çalışma zamanını Caddy içine gömüyor
- HTTP/1.1, HTTP/2 ve HTTP/3 için yerel destek sunuyor
- Let’s Encrypt veya ZeroSSL üzerinden HTTPS sertifikalarının oluşturulmasını, yenilenmesini ve iptal edilmesini otomatikleştiriyor
- Brotli, Zstandard ve Gzip sıkıştırmasını varsayılan olarak destekliyor
- Yapılandırılmış loglama ile Prometheus desteğini içeriyor
-
PHP çalışma ortamı
- PHP 8.2+, çoğu PHP uzantısı ve tüm Caddy modülleriyle uyumlu
- OPcache ve XDebug dahil popüler PHP uzantılarını yerel olarak destekliyor
- PHP-FPM gerektirmiyor ve Go web sunucuları için geliştirilmiş kendi SAPI’sini kullanıyor
Worker mode ve performans odaklı özellikler
- Worker mode, uygulamayı bir kez başlattıktan sonra bellekte tutarak istekleri birkaç milisaniye içinde işlemeye hazır halde bekletiyor
- Symfony, API Platform ve Laravel tarafından yerel olarak destekleniyor
- PSR-7 olmadan mevcut PHP superglobal’larını kullanıyor
- Uygulama Worker mode ile uyumlu olmasa bile yine de sunulabiliyor
- Kod değişikliklerinde worker’ları otomatik yeniden başlatan bir watcher sunuyor
- API Platform uygulamasına dayanan kendi benchmark’ında FPM’den 3.5 kat daha hızlı performans gösterdiğini aktarıyor
Dağıtım ve paketleme
- Docker imajı ile cloud-native uygulamalar dağıtılabiliyor
- Kubernetes ve modern bulut platformlarıyla uyumlu
- PHP web uygulamaları ve komut satırı araçları bağımsız çalıştırılabilir statik binary olarak paketlenebiliyor
- Tek bir servis ve tek bir binary ile çalıştığını, harici servislere ihtiyaç duymadığını belirtiyor
Ek web platformu özellikleri
- 103 Early Hints desteği sunuyor; Cloudflare yazısına dayanarak web sitesi yükleme süresini %30 iyileştirebilecek bir özellik olarak tanıtılıyor
- Yerleşik Mercure hub’ı üzerinden PHP uygulamasından bağlı tarayıcılara olay gönderilebiliyor; tarayıcı da payload’u JavaScript event’i olarak anında alabiliyor
- Graceful reload ile kesintisiz dağıtımı destekliyor
1 yorum
Hacker News yorumları
Fil Frankenştayn karakteri tuhaf, çirkin ve sevimli. Tasarım, renkler, metinler ve animasyonlar da temiz. Bir süredir PHP geliştirmeden uzak kalmış biri olarak, sunduğu değer önerisi iyi aktarılıyor ve küçük bir şeyle hızlıca başlamak için uygun görünüyor
Kötü yazılımları ya da karmaşık bağımlılıkları izole etmek için 8 container ayağa kaldırmak istemiyorum. Kurulabilir yazılım sunmak yerine “benim bilgisayarımda çalışıyor” durumunu paketleyip dünyaya fırlatma yaklaşımını sevmiyorum. Nostalji için bir kurcalayabilirim ama bunu tekrar production ortamına koymak ister miyim, emin değilim
Eski LAMP tarzı, biraz karmaşık Apache ayarları gerektiren yoldan ziyade, dilin bu yöne gitmesi gerekiyor
Bunu da denemeyi düşünüyorum ama ne nginx’te ne Apache’de bugüne kadar bir darboğaz yaşadım. İkisini de en fazla birkaç dakikada ayağa kaldırabiliyorsunuz
Apache + mod_php gibi tek bir servis olarak çalışıyor; PHP ve diğer diller için multiprocessing, statik dosyalar ve reverse proxy işlerini yönetiyor; ayrıca dosya ya da socket üzerinden runtime biçiminde kendisini ve PHP’yi tek bir yapılandırmada ele alabiliyor: https://unit.nginx.org/configuration/#php
Gerçek bir yapılandırma örneği burada: https://github.com/PrivateBin/docker-unit-alpine/blob/master..., ayrıca ortaya çıkan container image da oldukça küçük olabiliyor: https://hub.docker.com/r/privatebin/unit-alpine
Apache’yi yeniden başlatmak dışında yaptığım başka bir şey hatırlamıyorum
Temelde
LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so"veSetHandler "proxy:fcgi://127.0.0.1:9000"kadar. Apache’yi yapılandırma biçimiyle kavramsal olarak benzer bir Nginx örneği de var ve gerekli paket kurulumlarını da içeriyor: https://news.ycombinator.com/item?id=37443911Benzer sonucu veren önceden derlenmiş container image’lar da var ama içeride nasıl çalıştığını görmek istiyorsanız bunu kendiniz de yapabilirsiniz. Eski Java uygulama sunucularında Tomcat ya da GlassFish’i elle yapılandırmaktan kesinlikle daha kolay; her ortamda tek bir çalıştırma komutunun daha iyi olduğu doğru olsa da, LAMP diğer stack’lere kıyasla o kadar da kötü değil
Bir binary varsa bunu Electron uygulamasına paketlemek de kolaylaşır
php -S 0.0.0.0:8000 public/index.phpAma tek iş parçacıklı ve yavaş olduğu için production ortamı için uygun değil. FrankenPHP umut verici görünüyor ama çekirdek/thread sınırı sorunu[2] da production’da problem olabilir gibi duruyor. Yine de bunu pure-todo[1] projesine bir kez uygulayıp aynı sorun var mı diye bakabilirim. Varsayılan Docker image oldukça iyi görünüyor
1: https://github.com/sandreas/pure-todo
2: https://github.com/dunglas/frankenphp/discussions/294
Sayfanın üst kısmındaki uyarıya bakın: https://www.php.net/manual/en/features.commandline.webserver...
Bu bağlamda bunu karşılaştırma noktası olarak kullanmanın ne kadar adil olduğundan emin değilim
PHP_CLI_SERVER_WORKERSayarlanırsa birden fazla thread ile çalıştırılabiliyorKullanıcısı az olan küçük bir site için, diğer “production-ready” ortamlarla kıyaslandığında neyi kaçırmış olacağımı bilmek isterim
Birkaç komutla production-ready olduğu ve FPM’den 3,5 kat hızlı olduğu söyleniyor ama benim ortamımda FPM performansının %1’i civarında çalıştı. Çalıştırılabilir dosyayı da denedim ama aynı sorunu yaşadım; hello world için en az 200K rps beklerdim
Çoğu benchmark’ta worker modu açıkken FrankenPHP genelde FPM’den çok daha hızlı, yaklaşık 3 kat kadar. Yine de bazı istisna durumlar var ve bunu PHP bakımcılarıyla birlikte düzeltiyorlar
Caddy’nin kendisi PHP ile birlikte kullanıldığında da performans açısından oldukça iyi sonuç verdiği için bu epey garip bir durum
Şu anda en altta did not complete olarak görünüyor
Performans sorunu var. Bunun dışında gerçekten umut verici bir proje
Yine de çok derine inmediğimi ve testleri standart kurulum yerine Docker içinde yaptığımı belirtmem gerekir. WordPress de neredeyse varsayılan ayarlardaydı; ağır temalar gibi şeyler yoktu, yani koşullar çok gerçekçi değildi. Yine de testi tekrar yapmak ve daha iyi anlamak istiyorum
Yine de 103 Early Hints ile varlıklar önceden yüklenerek sayfa yükleme gecikmesi %30 azaltılabilir. Ayrıca FrankenPHP, WordPress’te HTTP cache’i açmayı kolaylaştırıyor ve dağıtımı da basitleştiriyor. WordPress ve FrankenPHP’ye özel bir proje de var; Souin Go kütüphanesini kullanan, WordPress’e özel yerleşik bir HTTP cache içeriyor: https://github.com/StephenMiracle/frankenwp
Apache belleğinden biraz daha tasarruf edilmesini ve daha fazla PHP isteğinin işlenebilmesini sağlayabilir
docker run -v $PWD:/app/public -p 443:443 \ dunglas/frankenphpUygulamayı sunacak Docker container’ını kendiniz oluşturmak istiyorsanız, yeni bir Debian’ı gereken container’a dönüştürmek için aşağıdaki komut yeterli gibi görünüyor:
apt install -y apache2 libapache2-mod-phpve/etc/apache2/sites-enabled/000-default.confyapılandırmasıArkadaşlarımla birlikte, çeşitli popüler diller ve framework’lerle sıfırdan çalışan bir web uygulamasına giden süreci gösteren bir depo tutuyorum: https://github.com/no-gravity/web_app_from_scratch
xdebug’i her açtığımda, debug oturumundan sonra Apache’yi yeniden başlatmak zorunda kalıyorum. Dünden beri apache2’yi php-fpm kullanacak şekilde yapılandırmaya başladım; en azından geliştirme ortamında bu FrankenPHP’nin bize uygun olup olmayacağını merak ediyorum. Ama belgelerde php eklentilerinin nasıl kurulacağını bulamadım
000-default.confsanal host’u 443’ten 80’e yönlendirme mi yapıyor?FPM ve onun shared-nothing mimarisi, uzun zaman önce PHP’nin başarısının anahtarıydı ama aynı zamanda PHP’nin prangası da oldu diye düşünüyorum