4 पॉइंट द्वारा GN⁺ 2024-05-31 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • जब PHP ऐप को अलग PHP-FPM के बिना चलाने वाला deployment flow चाहिए, तब FrankenPHP, Caddy में आधिकारिक PHP runtime को एम्बेड करने वाला Go-आधारित ऐप सर्वर है, जो PHP web app और CLI script को एक ही कमांड से चलाने देता है
  • HTTP/1.1·HTTP/2·HTTP/3, automatic HTTPS certificate, Brotli/Zstandard/Gzip compression, structured logging, और Prometheus metrics जैसी सुविधाओं को डिफ़ॉल्ट रूप से साथ देकर server configuration को कम करता है
  • Worker mode ऐप को एक बार boot करके memory में बनाए रखता है, और API Platform ऐप के अपने benchmark में इसे FPM से 3.5 गुना तेज़ बताया गया है
  • PHP 8.2+, ज़्यादातर PHP extensions, और Caddy modules के साथ compatible है, और OPcacheXDebug जैसे लोकप्रिय extensions को native support देता है
  • Docker image, Kubernetes, cloud platforms, और standalone static binary deployment को support करके यह PHP app deployment unit को सरल बना सकता है

चलाने का तरीका और बुनियादी उपयोग प्रवाह

  • FrankenPHP, Go में लिखा गया आधुनिक PHP ऐप सर्वर बनने का लक्ष्य रखता है, और PHP app server की installation व execution को एक command-केंद्रित workflow में रखता है
  • installation के उदाहरण operating system के अनुसार अलग हैं
  • local execution web server और CLI दोनों को कवर करता है
    • frankenphp php-server -r public/: public/ directory serve करता है
    • frankenphp php-cli script.php: command-line PHP script चलाता है
  • Docker execution भी उसी image से किया जाता है
    • dunglas/frankenphp image से public/ directory serve की जा सकती है
    • उसी image में php script.php जैसी CLI script भी चलाई जा सकती है
  • configuration, Caddy-आधारित है, और example config में localhost block के भीतर compression चालू करके php_server से current directory की PHP files और static assets को संभाला जाता है

सर्वर फीचर्स और PHP compatibility

  • web server फीचर्स

    • आधिकारिक PHP runtime को Caddy में एम्बेड करता है
    • HTTP/1.1, HTTP/2, HTTP/3 का native support देता है
    • Let’s Encrypt या ZeroSSL के ज़रिए HTTPS certificate का creation, renewal, और revocation अपने-आप करता है
    • Brotli, Zstandard, Gzip compression का built-in support देता है
    • structured logging और Prometheus support शामिल है
  • PHP execution environment

    • PHP 8.2+, ज़्यादातर PHP extensions, और सभी Caddy modules के साथ compatible है
    • OPcache और XDebug सहित लोकप्रिय PHP extensions को native support देता है
    • PHP-FPM की ज़रूरत नहीं होती, और यह Go web server के लिए बनाए गए अपने SAPI का उपयोग करता है

Worker mode और performance-केंद्रित फीचर्स

  • Worker mode application को एक बार boot करने के बाद memory में बनाए रखता है, ताकि वह कुछ milliseconds के भीतर request process करने के लिए तैयार रहे
  • Symfony, API Platform, और Laravel में native support मिलता है
  • PSR-7 के बिना, मौजूदा PHP superglobals का उपयोग करता है
  • अगर app Worker mode के साथ compatible न भी हो, तब भी उसे वैसे ही serve किया जा सकता है
  • code change होने पर workers को अपने-आप restart करने वाला watcher देता है
  • API Platform ऐप पर किए गए अपने benchmark में इसे FPM से 3.5 गुना तेज़ बताया गया है

deployment और packaging

  • Docker image के ज़रिए cloud-native apps deploy किए जा सकते हैं
  • Kubernetes और आधुनिक cloud platforms के साथ compatible है
  • PHP web applications और command-line tools को standalone static binaries के रूप में package किया जा सकता है
  • इसे एक ही service और एक ही binary के रूप में चलाया जा सकता है, और इसमें किसी external service की ज़रूरत नहीं बताई गई है

अतिरिक्त web platform फीचर्स

  • 103 Early Hints को support करता है, और Cloudflare के लेख के आधार पर इसे website load time में 30% सुधार ला सकने वाली सुविधा के रूप में पेश किया गया है
  • built-in Mercure hub के माध्यम से PHP app, connected browser को events भेज सकता है, और browser JavaScript events के रूप में payload तुरंत प्राप्त कर सकता है
  • Graceful reload के ज़रिए बिना downtime के deployment को support करता है

1 टिप्पणियां

 
GN⁺ 2024-05-31
Hacker News की राय
  • मैंने लगभग 10 साल से PHP development नहीं किया, लेकिन यह landing page देखकर लगा कि कम से कम hello world तो चला ही दूँ
    हाथी Frankenstein character अजीब, बदसूरत और cute है। Design, रंग, copy और animation भी साफ-सुथरे हैं। PHP development से काफी समय दूर रहने वाले व्यक्ति के तौर पर value proposition अच्छी तरह दिखता है, और लगता है कि छोटी चीज़ जल्दी शुरू करने के लिए अच्छा है
    • 10 साल से थोड़ा ज़्यादा पहले मैं PHP से Golang पर चला गया था, क्योंकि binary distribution बहुत अच्छा लगा था
      खराब software या उलझी dependencies को isolate करने के लिए मैं 8 containers नहीं चलाना चाहता। Installable software देने के बजाय “मेरी machine पर चलता है” को package करके दुनिया में फेंकने वाला तरीका पसंद नहीं है। Nostalgia की वजह से शायद एक बार इसे छूकर देखूँ, लेकिन ऐसी चीज़ को अब production environment में रखना चाहूँगा या नहीं, इस पर भरोसा नहीं है
    • अब तक देखे गए सबसे अच्छे landing pages में से एक है। मज़ेदार है और तुरंत समझ आता है
  • मैंने लंबे समय तक C# किया है और अब ज़्यादातर PHP 8 में code करता हूँ; जल्दी कुछ बनाने के लिए यह शानदार language है
    पुराने LAMP जैसी कुछ complex Apache configuration की दिशा से बेहतर है कि language इसी दिशा में जाए
    • PHP में 18 साल हो गए हैं, और nginx + php-fpm इस्तेमाल करें तो setup के लिए 5 मिनट काफी हैं
      इसे भी एक बार आज़माने का सोच रहा हूँ, लेकिन nginx हो या Apache, मैंने कभी bottleneck नहीं देखा। दोनों को ज़्यादा से ज़्यादा कुछ मिनटों में चला सकते हैं
    • एक और विकल्प Nginx Unit भी है: https://unit.nginx.org/
      यह Apache + mod_php की तरह single service के रूप में चलता है, PHP और दूसरी languages की multiprocessing, static files, reverse proxy संभालता है, और file या socket के जरिए runtime तरीके से अपने-आप को और PHP को एक ही configuration में manage कर सकता है: https://unit.nginx.org/configuration/#php
      असली configuration example यहाँ है: https://github.com/PrivateBin/docker-unit-alpine/blob/master..., और final container image भी काफी छोटी बनाई जा सकती है: https://hub.docker.com/r/privatebin/unit-alpine
    • मैं PHP को लगभग configure नहीं करता, लेकिन desktop reinstall करने पर हर बार जो किया था, उसकी याद के अनुसार apt-get से यह बहुत तेज़ और smooth तरीके से खत्म हो जाता था
      Apache restart करने के अलावा कुछ और खास किया हो, याद नहीं
    • मुझे लगता है, क्या Apache configuration सच में इतनी खराब है? PHP-FPM जैसी चीज़ इस्तेमाल करें तो यह काफी ठीक लगती है: https://news.ycombinator.com/item?id=40256843
      बस LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so" और SetHandler "proxy:fcgi://127.0.0.1:9000" जैसा है। Apache configure करने के तरीके से conceptually मिलता-जुलता Nginx example भी है, और इसमें जरूरी packages install करना भी शामिल है: https://news.ycombinator.com/item?id=37443911
      मिलते-जुलते result के लिए pre-built container images भी हैं, लेकिन अगर देखना है कि अंदर कैसे चलता है तो खुद करके देख सकते हैं। पुराने Java application servers में Tomcat या GlassFish को manually configure करने की तुलना में यह निश्चित रूप से आसान है, और किसी भी environment में single run command बेहतर तो है ही, फिर भी LAMP दूसरे stacks के मुकाबले इतना खराब नहीं है
    • सहमत हूँ। PostgreSQL/MySQL के बजाय SQLite पर निर्भर करने की culture जम जाए, तो पूरी server-side application एक सरल standalone binary बन सकती है
      Binary हो तो उसे Electron app में bundle करना भी आसान हो जाता है
  • Development के दौरान मैं अक्सर PHP का built-in web server इस्तेमाल करता हूँ: php -S 0.0.0.0:8000 public/index.php
    लेकिन यह single-threaded और slow है, इसलिए production environment के लिए नहीं है। FrankenPHP promising लगता है, लेकिन core/thread limit issue[2] भी production में समस्या बन सकता है। फिर भी pure-todo[1] project में इसे एक बार apply करके देख सकता हूँ कि वही समस्या है या नहीं। Default Docker image काफी अच्छी लगती है
    1: https://github.com/sandreas/pure-todo
    2: https://github.com/dunglas/frankenphp/discussions/294
    • PHP built-in server के docs में साफ लिखा है कि यह production के लिए नहीं है, सिर्फ development purpose के लिए है
      Page के ऊपर warning देखें: https://www.php.net/manual/en/features.commandline.webserver...
      इस context में इसे comparison target बनाना fair है या नहीं, यह भी पक्का नहीं
    • PHP_CLI_SERVER_WORKERS set करें तो इसे multiple threads में चला सकते हैं
    • मुझे जानना है कि production environment में न इस्तेमाल कर पाने की बात सिर्फ performance की समस्या है या नहीं
      अगर users कम हों और site छोटी हो, तो दूसरी “production ready” environments की तुलना में क्या चीज़ छूट जाएगी, यह जानना चाहूँगा
    • single-threaded और slow होने के कारण production के लिए नहीं है—मेरी समझ में यह उन specific समस्याओं को solve करता है। इसके अलावा और समस्याएँ भी शायद solve करेगा
  • मैंने खुद इस्तेमाल किया, और यह सच में slow था; ऐसा लगा core भी ठीक से इस्तेमाल नहीं कर रहा। कमज़ोर documentation काफी देर तक देखी, लेकिन solve नहीं कर पाया
    कहा जाता है कि कुछ commands से production ready हो जाता है और FPM से 3.5 गुना fast है, लेकिन मेरे environment में यह FPM performance के 1% के आसपास चला। Executable file भी try की, लेकिन वही समस्या रही, और hello world के लिए कम से कम 200K rps की उम्मीद थी
    • मैं FrankenPHP बनाने वाला हूँ। Reproducible example सच में पाना चाहूँगा

ज़्यादातर benchmarks में worker mode चालू होने पर FrankenPHP आम तौर पर FPM से काफी तेज़ है, लगभग 3 गुना। फिर भी कुछ edge cases हैं और उन्हें PHP maintainers के साथ मिलकर ठीक किया जा रहा है

  • अपना अनुभव साझा करेंगे तो इसे हल करने में मदद मिलेगी: https://github.com/dunglas/frankenphp/discussions/294
    Caddy खुद PHP के साथ इस्तेमाल करने पर भी बहुत अच्छी performance देता है, इसलिए यह काफ़ी अजीब स्थिति है
  • TechEmpower benchmark में यह कैसा निकलेगा, जानने की उत्सुकता है: https://www.techempower.com/benchmarks/#hw=ph&test=fortune&s...
    अभी यह सबसे नीचे did not complete के रूप में है
  • संबंधित लेख: Show HN: FrankenPHP, Go में लिखा PHP के लिए app server - https://news.ycombinator.com/item?id=33205282 - अक्टूबर 2022, 83 comments
  • https://github.com/dunglas/frankenphp/discussions/294
    performance issue है। उसे छोड़ दें तो यह वाकई promising project है
    • अगर इसे reproduce किया जा सके, तो मैं खुशी-खुशी कंपनी से 2 हफ्ते की छुट्टी लेकर इसे ठीक कर दूंगा। किसी ने भी reproduce करने का तरीका नहीं बताया
  • मैंने WordPress को FrankenPHP और Apache Mod-PHP पर benchmark किया, लेकिन FPHP के जीतने का कोई आधार नहीं दिखा
    हालांकि मैंने गहराई से जांच नहीं की और tests भी सामान्य setup में नहीं, बल्कि Docker के अंदर किए। WordPress भी लगभग default setup था, इसलिए heavy theme जैसी चीज़ें न होने से conditions realistic नहीं थीं। फिर भी मैं tests दोबारा करना और बेहतर समझना चाहता हूं
    • Laravel और Symfony के उलट, WordPress अभी FrankenPHP के worker mode को support नहीं करता, इसलिए performance benefit ज़्यादा नहीं है
      हालांकि 103 Early Hints से assets को पहले से load करके page load latency को 30% घटाया जा सकता है। फिर भी FrankenPHP WordPress में HTTP cache चालू करना आसान बनाता है और deployment भी सरल करता है। WordPress और FrankenPHP के लिए dedicated project भी है, जिसमें Souin Go library का इस्तेमाल कर WordPress के लिए customized built-in HTTP cache शामिल है: https://github.com/StephenMiracle/frankenwp
    • हो सकता है कि परिचित होने की वजह से वही नाम इस्तेमाल किया जा रहा हो, लेकिन standard तौर पर Apache में proxy_fcgi इस्तेमाल करना चाहिए
      इससे Apache memory थोड़ी और बच सकती है और ज़्यादा PHP requests handle करने की गुंजाइश बन सकती है
  • docker run -v $PWD:/app/public -p 443:443 \ dunglas/frankenphp
    अगर आप app serve करने के लिए अपना Docker container सीधे बनाना चाहते हैं, तो नए Debian को जरूरी container में बदलने के लिए नीचे वाला command काफी लगता है: apt install -y apache2 libapache2-mod-php और /etc/apache2/sites-enabled/000-default.conf configuration
    मैं दोस्तों के साथ एक repository maintain कर रहा हूं जो कई लोकप्रिय languages और frameworks में zero से चलती हुई web application तक जाने की प्रक्रिया दिखाती है: https://github.com/no-gravity/web_app_from_scratch
    • एक महीने पहले मैंने ऐसी कंपनी में काम शुरू किया है जो mod_php इस्तेमाल करती है, और यह दर्दनाक है
      xdebug चालू करने पर हर debugging session के बाद Apache restart करना पड़ता है। कल से मैंने apache2 को php-fpm के साथ इस्तेमाल करने के लिए configure करना शुरू किया है, लेकिन सोच रहा हूं कि कम से कम development environment में यह FrankenPHP हमारे लिए fit होगा या नहीं। हालांकि docs में php extensions install करने का तरीका नहीं मिला
    • अगर मैं गलत नहीं समझ रहा, तो यह शायद काम नहीं करेगा। क्या default Apache 000-default.conf virtual host 443 से 80 पर redirect करता है?
  • HN के front page पर इसे देखकर अच्छा लगा
    FPM और उसकी share-nothing architecture लंबे समय पहले PHP की सफलता की कुंजी थी, लेकिन साथ ही मुझे लगता है कि वही PHP की बेड़ियां भी रही है