FrankenPHP: आधुनिक PHP ऐप सर्वर
(frankenphp.dev)- जब 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 है, और OPcache व XDebug जैसे लोकप्रिय 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 के अनुसार अलग हैं
- Linux/macOS:
curl https://frankenphp.dev/install.sh | sh - Windows PowerShell:
irm https://frankenphp.dev/install.ps1 | iex
- Linux/macOS:
- 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/frankenphpimage सेpublic/directory serve की जा सकती है- उसी image में
php script.phpजैसी CLI script भी चलाई जा सकती है
- configuration, Caddy-आधारित है, और example config में
localhostblock के भीतर 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 टिप्पणियां
Hacker News की राय
हाथी Frankenstein character अजीब, बदसूरत और cute है। Design, रंग, copy और animation भी साफ-सुथरे हैं। PHP development से काफी समय दूर रहने वाले व्यक्ति के तौर पर value proposition अच्छी तरह दिखता है, और लगता है कि छोटी चीज़ जल्दी शुरू करने के लिए अच्छा है
खराब software या उलझी dependencies को isolate करने के लिए मैं 8 containers नहीं चलाना चाहता। Installable software देने के बजाय “मेरी machine पर चलता है” को package करके दुनिया में फेंकने वाला तरीका पसंद नहीं है। Nostalgia की वजह से शायद एक बार इसे छूकर देखूँ, लेकिन ऐसी चीज़ को अब production environment में रखना चाहूँगा या नहीं, इस पर भरोसा नहीं है
पुराने LAMP जैसी कुछ complex Apache configuration की दिशा से बेहतर है कि language इसी दिशा में जाए
इसे भी एक बार आज़माने का सोच रहा हूँ, लेकिन nginx हो या Apache, मैंने कभी bottleneck नहीं देखा। दोनों को ज़्यादा से ज़्यादा कुछ मिनटों में चला सकते हैं
यह 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
Apache restart करने के अलावा कुछ और खास किया हो, याद नहीं
बस
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 के मुकाबले इतना खराब नहीं है
Binary हो तो उसे Electron app में bundle करना भी आसान हो जाता है
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
Page के ऊपर warning देखें: https://www.php.net/manual/en/features.commandline.webserver...
इस context में इसे comparison target बनाना fair है या नहीं, यह भी पक्का नहीं
PHP_CLI_SERVER_WORKERSset करें तो इसे multiple threads में चला सकते हैंअगर users कम हों और site छोटी हो, तो दूसरी “production ready” environments की तुलना में क्या चीज़ छूट जाएगी, यह जानना चाहूँगा
कहा जाता है कि कुछ commands से production ready हो जाता है और FPM से 3.5 गुना fast है, लेकिन मेरे environment में यह FPM performance के 1% के आसपास चला। Executable file भी try की, लेकिन वही समस्या रही, और hello world के लिए कम से कम 200K rps की उम्मीद थी
ज़्यादातर benchmarks में worker mode चालू होने पर FrankenPHP आम तौर पर FPM से काफी तेज़ है, लगभग 3 गुना। फिर भी कुछ edge cases हैं और उन्हें PHP maintainers के साथ मिलकर ठीक किया जा रहा है
Caddy खुद PHP के साथ इस्तेमाल करने पर भी बहुत अच्छी performance देता है, इसलिए यह काफ़ी अजीब स्थिति है
अभी यह सबसे नीचे did not complete के रूप में है
performance issue है। उसे छोड़ दें तो यह वाकई promising project है
हालांकि मैंने गहराई से जांच नहीं की और tests भी सामान्य setup में नहीं, बल्कि Docker के अंदर किए। WordPress भी लगभग default setup था, इसलिए heavy theme जैसी चीज़ें न होने से conditions realistic नहीं थीं। फिर भी मैं tests दोबारा करना और बेहतर समझना चाहता हूं
हालांकि 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
इससे 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.confconfigurationमैं दोस्तों के साथ एक repository maintain कर रहा हूं जो कई लोकप्रिय languages और frameworks में zero से चलती हुई web application तक जाने की प्रक्रिया दिखाती है: https://github.com/no-gravity/web_app_from_scratch
xdebug चालू करने पर हर debugging session के बाद Apache restart करना पड़ता है। कल से मैंने apache2 को php-fpm के साथ इस्तेमाल करने के लिए configure करना शुरू किया है, लेकिन सोच रहा हूं कि कम से कम development environment में यह FrankenPHP हमारे लिए fit होगा या नहीं। हालांकि docs में php extensions install करने का तरीका नहीं मिला
000-default.confvirtual host 443 से 80 पर redirect करता है?FPM और उसकी share-nothing architecture लंबे समय पहले PHP की सफलता की कुंजी थी, लेकिन साथ ही मुझे लगता है कि वही PHP की बेड़ियां भी रही है