[HN Gopher] Show HN: FrankenPHP, an app server for PHP written i... ___________________________________________________________________ Show HN: FrankenPHP, an app server for PHP written in Go Author : kdunglas Score : 240 points Date : 2022-10-14 15:59 UTC (7 hours ago) (HTM) web link (frankenphp.dev) (TXT) w3m dump (frankenphp.dev) | green-salt wrote: | I'll have to try this out! | abrztam wrote: | What is the difference between this and Roadrunner? It seems to | do the same stuff. | | https://github.com/roadrunner-server/roadrunner | kdunglas wrote: | The approach isn't the same: | | Roadrunner executes php-cli and connects it to its web server | through GRPC; FrankenPHP uses an ad-hoc SAPI, it is more like | Apache's mod_php, the Go code uses the PHP interpreter as a | library, it's all in the same process. | | RoadRunner only has a worker mode, and can only work with | compatible apps; FrankenPHP has a "standard" mode compatible | with all existing applications, and a worker mode that requires | some code changes (like RR). | | RoadRunner runner uses PSR-7 HTTP messages; FrankenPHP uses | plain old superglobals and streams (both in normal and in | worker modes), they are reset after each handled request. | | RoadRunner is battle-tested and production ready; FrankenPHP is | experimental and not yet ready for production use. | | FrankenPHP can also be used as a Go library to integrate PHP | into any Go program or server (theoretically, it should be | possible to integrate FrankenPHP into Traefik or the local | Symfony web server, which are written in Go). | bogdanu wrote: | Since it's not using PSR-7, does it mean that you could even | run WordPress? | kdunglas wrote: | I haven't tested it yet, but yes it's a stated goal. | floppydisc wrote: | no. 1 feature: goofier branding | nobleach wrote: | I've been watching how Go and Rust tooling has been finding its | way into the JavaScript ecosystem. I've been out of the PHP realm | for about 10 years but I did find RoadRunner for PHP at one | point. That's also an app server written in Go I believe. I | wonder how this compares. | fideloper wrote: | My understanding is RoadRunner is more like FrankenPHP's | "worker mode" (RoadRunner only makes sense in context of | Laravel Octane), where as FrankenPHP can run "normally" as | well. | jedisct1 wrote: | Don't forget Zig, with Bun. | jeffersonheard wrote: | If this isn't pronounced Frankenphip I will be disappointed. | tiffanyh wrote: | I might be missing the obvious but why would you add extra | complexity to your infrastrucutre setup when PHP can be run | natively from within caddy, apache, nginx via fastcgi. | mholt wrote: | With this you don't need FastCGI. FrankenPHP _is_ simpler and | less complex: just run it directly from your Caddy web server. | CoolCold wrote: | Short answer would be: sole solo developer experience (DX). | | Longer answer: avoiding infrastructure setup - for those who | has infrastructure it makes no sense, for those who knows how | to run things in Docker and not need much beyond it - | eliminates the need of getting familiar with Docker Compose. | | Having php stay in memory should make performance benefits [and | make sense for the project], but that's different story. | fideloper wrote: | Removing php-fpm + nginx from a container sounds AMAZING to me. | If I can just have one thing in a container (plus a code base), | that would be a LOT simpler than: | | nginx, php-fpm, some init system, and the convoluted | configuration needed to get logs out via Docker's logging | mechanism. | PlutoIsAPlanet wrote: | I've recently changed our nginx/php-fpm containers to | caddy/php-fpm | | Caddy has a supervisor plugin, so can start php-fpm itself | and the containers entrypoint can be Caddy, which achieves | similar objectives here that Caddy becomes a PHP application | server. | francislavoie wrote: | FrankenPHP will perform better than php-fpm though, in | worker mode, because it doesn't need to bootstrap fully on | every request. In the conference slides, Kevin showed php- | fpm had a 12ms request latency, whereas FrankenPHP had 3ms. | | But yes, the supervisor plugin is definitely nice to be | able to wrap up Caddy + php-fpm in a single container. | Makes shipping it easier, especially with the PHP code | (because both Caddy and php-fpm need access to the code; | Caddy so it can serve static files and check for the | existence of PHP files, and php-fpm to actually run your | code). | waynesonfire wrote: | [deleted] | treahauet wrote: | Congratulations! This looks neat! | seabrookmx wrote: | So.. it's like gunicorn (pre-fork web server) but for PHP and | built on top of Caddy? | | Looks neat! | 0xbadcafebee wrote: | So it's mod_php for Caddy, in reverse? | | The traditional idea is to build a plug-in for the parent | webserver. By essentially "making a fork" of Caddy, if you want | to add other plugins to Caddy and then incorporate them into | FrankenPHP, it's a lot more work. If instead you ship a PHP | plugin to Caddy, you can manage Caddy instead and mix and match | different functionality in one place. | | But I guess it's heretical to suggest somebody use plugins in Go, | if the whole idea is everything is a static binary. | mike_d wrote: | Early Hints breaks a lot of the common APIs (like FastCGI/FPM) | where you are expected to have one request and one response. I | don't know how Caddy specifically works, but I suspect that may | be the reason for the fork. | mholt wrote: | Early Hints support was added to Caddy's proxy by Kevin | Dunglas, the author of FrankenPHP. No fork required for Early | Hints! | mholt wrote: | I don't think this forks Caddy. Rather, it is a Caddy plugin: | https://github.com/dunglas/frankenphp/blob/main/caddy/caddy.... | | It uses mainline Caddy: | https://github.com/dunglas/frankenphp/blob/main/caddy/go.mod | 0xbadcafebee wrote: | Can I use an officially released build of Caddy and have that | official Caddy executable load FrankenPHP? | kdunglas wrote: | Definitely! (using xcaddy and compiling PHP yourself, for | now) | [deleted] | chrsig wrote: | go does have some support for dynamically loaded shared | libraries. I haven't used it, so I can't speak to how good it | is, or any pitfalls. | | https://pkg.go.dev/plugin | tomcam wrote: | I love the idea but as far as I can tell there isn't a portable | way to do plug-ins in go that works with windows, is there? | francislavoie wrote: | If you're talking about Caddy, its plugins are cross- | platform, because Go (as long as you don't use CGO, or at | least that your plugin that needs CGO also works on Windows). | Read about Caddy's architecture here: | https://caddyserver.com/docs/architecture | password4321 wrote: | PHP in .NET: https://www.peachpie.io | [deleted] | pbowyer wrote: | Good. PHP-FPM needs a challenger as anyone who has tried to debug | it or its pools knows. Or to tune it (so many modes, so many | configuration options). | | Litespeed's PHP LSAPI [1] shows how good performance can be with | other setups. It'll be great if FrankenPHP gets to the same | state. | | 1. https://www.litespeedtech.com/open-source/litespeed-sapi/php | apocalyptic0n3 wrote: | PHP-FPM can be so unreliable too. It'll just go down randomly | without any warning or logs at all. As you said, it's | impossible to debug what happens there and all you can really | do is setup monitoring to detect it went down and automatically | restart it. | xorcist wrote: | That's interesting, in my experience php-fpm has been very | dependable even in demanding situations where we migrate over | to new backends without missing a request. PHP applications | can be a different story, but php-fpm provides enough knobs | to restart problematic applications on demand. It's probably | that last part of a PHP stack I'd want to replace. | | Debugging application servers in production comes with its | own set of difficulties, but I don't see how this one is | worse than others. If anything, the ability to start new | sockets without restarting the process is a plus. | jijji wrote: | PHP-FPM is very easy to debug. It's as simple as setting it | up to use a listening socket in www.conf (located in i.e. | /etc/php/8.1/fpm/pool.d) and then running a packet sniffer | (i.e. ngrep) to listen on that socket, all messages back and | forth are visible at that point. | amq wrote: | PHP-FPM has been extremely reliable in my experience. | timw4mail wrote: | So after looking at the slidedeck on the authors blog, I'm rather | confused. How does FrankenPHP keep the code in memory if each | request is in a separate memory space? | marcofatica wrote: | They're probably using PHP's built in opcache or something they | rolled themselves OPcache improves PHP | performance by storing precompiled script bytecode in shared | memory | | https://www.php.net/manual/en/intro.opcache.php | chx wrote: | opcache is definitely on https://github.com/dunglas/frankenph | p/blob/f97f56d45a403342b... | kingkool68 wrote: | See Preloading which landed in PHP 7.4 | https://stitcher.io/blog/preloading-in-php-74 | simlevesque wrote: | Felicitation ! | | Do you have any success story with this application server ? | francislavoie wrote: | Kinda early for that, isn't it? It's still in the experimental | phase. | codegeek wrote: | I see a bit of C as well ? Also, do we need to use Docker ? I am | very interested in trying but wanted to check. | | If it is Go, can I not just compile the binary and execute ? | TheRealPomax wrote: | When do things ever "just compile"? I assume the Docker image | is because this is a pre-alpha and the docker image ensures | that no one needs to go through hours of dependency/config hell | because the docker image is set up with everything necessary | already, letting you focus on alpha-testing this and reporting | bugs. | calvinmorrison wrote: | typically I find CMake would do this, or Make, to verify | dependencies. | | Coupled with a packaging system, like debian gives you, this | is all pretty straightforward. | | I ran into this yesterday, and turns out I don't want to | install docker just to build a program... | TheRealPomax wrote: | Right, but there are as many setups as there are potential | users, so even if Debian works, that doesn't mean other | linux flavours will work as easily, or flavours of BSDs, | and then also Macs, and even WSL, or _even_ just plain old | Windows. | | Having an "everyone gets the same thing, so no one wastes | time on bootstrapping" solution is a perfect use-case for | Docker. And then once the bugs have been found and fixed, | and the code is production-ready, you can focus on | documenting and scripting the setup procedures for the | various operating systems. | andirk wrote: | As an aside, may I ask what people's opinion of running | docker containers in prod is? The joke "But it works on | my local--" "Then ship your local". | francislavoie wrote: | The big win of Docker for me is parity between dev and | prod. I absolutely run on Docker in prod. It is not just | a dev tool. | francislavoie wrote: | C is necessary because PHP is written in C. So CGO is used to | interface with PHP directly from Go, from a Caddy plugin. | | Docker is definitely not necessary, but it is the easiest way | to ship something that _just works_. Since you need a bunch of | build dependencies to compile PHP, the installation steps are | different for every distro to pull those in with whatever 's | your package manager. | k__ wrote: | PHP is already FrankenPerl, and Perl FrankenAwk? | | What happened to the times where some crazy person would simply | slap together an interpreter and call it a language? | | Somehow, language creation got more and more sophisticated these | days. | [deleted] | mhd wrote: | Really? Aren't there a lot of slapped together LLVM frontends | these days? | chx wrote: | Looking at the forked PHP source https://github.com/php/php- | src/compare/master...dunglas:php-... I do not expect | compatibility issues. | [deleted] | nonoesp wrote: | It'd be great to see how a Laravel app could run on FrankenPHP | and see if there are speed gains. | | My current setup is a DigitalOcean Droplet with Nginx and php- | fpm. | some_developer wrote: | Try Octane, it's the app server we were longing for. ___________________________________________________________________ (page generated 2022-10-14 23:00 UTC)