4 puan yazan GN⁺ 2024-05-31 | 1 yorum | WhatsApp'ta paylaş
  • 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
  • Yerelde çalıştırma hem web sunucusunu hem de CLI tarafını kapsıyor
    • frankenphp php-server -r public/: public/ dizinini sunar
    • frankenphp 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/frankenphp imajıyla public/ dizini sunulabilir
    • Aynı imajda php script.php gibi CLI betikleri de çalıştırılabilir
  • Yapılandırma Caddy tabanlı; örnek yapılandırmada localhost bloğu içinde sıkıştırma etkinleştirilip php_server ile 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

 
GN⁺ 2024-05-31
Hacker News yorumları
  • Neredeyse 10 yıldır PHP geliştirmedim ama bu landing page’i görünce neredeyse hello world bile çalıştırasım geldi.
    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
    • 10 yıldan biraz fazla süre önce PHP’den Golang’e geçtim; çünkü binary dağıtımı çok iyiydi.
      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
    • Şimdiye kadar gördüğüm en iyi landing page’lerden biri. Eğlenceli ve anında anlaşılıyor
  • Uzun süre C# kullandım ve şu an ağırlıklı olarak PHP 8 ile kod yazıyorum; hızlıca bir şeyler üretmek için harika bir dil.
    Eski LAMP tarzı, biraz karmaşık Apache ayarları gerektiren yoldan ziyade, dilin bu yöne gitmesi gerekiyor
    • 18 yıllık PHP geliştiricisiyim; nginx + php-fpm kullanırsanız ayarları yapmak 5 dakika sürer.
      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
    • Bir başka seçenek olarak Nginx Unit de var: https://unit.nginx.org/
      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
    • PHP’yi neredeyse hiç yapılandırmıyorum ama masaüstünü her yeniden kurduğumda bir kez yaptığım kadarıyla, apt-get ile çok hızlı ve sorunsuz bitiyordu.
      Apache’yi yeniden başlatmak dışında yaptığım başka bir şey hatırlamıyorum
    • Apache yapılandırması gerçekten o kadar kötü mü, emin değilim. PHP-FPM gibi bir şey kullanırsanız gayet iyi görünüyor: https://news.ycombinator.com/item?id=40256843
      Temelde LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so" ve SetHandler "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=37443911
      Benzer 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
    • Katılıyorum. PostgreSQL/MySQL yerine SQLite’a dayanan bir kültür yerleşirse, tüm server-side uygulama basit bir bağımsız çalıştırılabilir binary hâline gelebilir.
      Bir binary varsa bunu Electron uygulamasına paketlemek de kolaylaşır
  • Geliştirme sırasında PHP’nin yerleşik web sunucusunu sık kullanıyorum: php -S 0.0.0.0:8000 public/index.php
    Ama 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
    • PHP’nin yerleşik sunucusunun belgelerde açıkça production için olmadığı, sadece geliştirme amaçlı olduğu yazıyor.
      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_WORKERS ayarlanırsa birden fazla thread ile çalıştırılabiliyor
    • Production’da kullanılamamasının sadece performans meselesi olup olmadığını merak ediyorum.
      Kullanı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
    • Bildiğim kadarıyla, tek iş parçacıklı ve yavaş olduğu için production’a uygun olmamasına neden olan belirli sorunları bu çözüyor. Bunun dışında başka sorunları da çözüyor gibi görünüyor
  • Bizzat denedim; gerçekten çok yavaştı ve çekirdekleri de düzgün kullanamıyor gibiydi. Eksik dokümantasyonu epey inceledim ama çözemedim.
    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
    • FrankenPHP’nin geliştiricisiyim. Yeniden üretilebilir bir örneği gerçekten almak isterim

Ç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

  • Bu deneyimi paylaşmanız, bunu çözmeye yardımcı olur: https://github.com/dunglas/frankenphp/discussions/294
    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
  • TechEmpower benchmark’larında nasıl sonuç vereceğini merak ediyorum: https://www.techempower.com/benchmarks/#hw=ph&test=fortune&s...
    Şu anda en altta did not complete olarak görünüyor
  • İlgili yazı: Show HN: FrankenPHP, Go ile yazılmış PHP uygulama sunucusu - https://news.ycombinator.com/item?id=33205282 - Ekim 2022, 83 yorum
  • https://github.com/dunglas/frankenphp/discussions/294
    Performans sorunu var. Bunun dışında gerçekten umut verici bir proje
    • Yeniden üretilebilirse, memnuniyetle iş yerinden 2 hafta izin alıp düzeltirim. Kimse nasıl yeniden üretileceğini söylemedi
  • WordPress’i FrankenPHP ve Apache Mod-PHP üzerinde benchmark ettim ama FPHP’nin kazandığına dair bir kanıt görmedim
    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
    • Laravel ve Symfony’nin aksine WordPress henüz FrankenPHP’nin worker modunu desteklemiyor, bu yüzden performans avantajı çok büyük değil
      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
    • Alışkanlıktan o ismi kullanıyor olabilirsiniz ama standart olan Apache’de proxy_fcgi kullanmaktır
      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/frankenphp
    Uygulamayı 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-php ve /etc/apache2/sites-enabled/000-default.conf yapı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
    • Bir aydır mod_php kullanan bir şirkette çalışmaya başladım ve oldukça acı verici
      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
    • Yanlış anlamadıysam bu çalışmayacak gibi. Varsayılan Apache 000-default.conf sanal host’u 443’ten 80’e yönlendirme mi yapıyor?
  • Bunu HN ana sayfasında görmek güzel
    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