6 ms·
Long time C# dev, now I primarily code in PHP8 which is a great language to quickly get things done. This is the kind of direction the language needs to go in,
by jslaby 2y ago
Long time C# dev, now I primarily code in PHP8 which is a great language to quickly get things done. This is the kind of direction the language needs to go in, instead of the older LAMP which can require somewhat complex Apache configuration.
- hparadiz 2y agoPHP dev of 18 years here. Use nginx with php-fpm. It takes 5 minutes to configure. Edit: I'm gonna give this thing a try too but I've never had any bottlenecks with either nginx or Apache. They both take a few minutes to get going at most.
- lordofgibbons 2y ago>It takes 5 minutes to configure Is that because you have 18 years of experience, or would it be as easy for a new developer?
- hparadiz 2y agoI just have the right config for both Apache2 and nginx from hundreds of sites. The config itself is only 50 lines. You can find a good one and stick with it.
- troupo 2y agoYup. The process of finding alone will take more than 5 minutes. And is likely to not work for your particular circumstance.
- donatj 2y agoI think it would be roughly that easy for anyone with basic nginx experience. Nginx includes a php fast-cgi snippet that you just `include` from your server block. It really is very easy.
- chrisandchris 2y agoI was a long-time PHP dev and then moved on to C#. I was close to writing this nginx/fpm setup lookss very complex compared to "dotnet run". But then I remembered, in ASP.NET you have a Program with 50 lines of code that must have an exact order, otherwise thinks work except they don't. So I would say, knowing these two languages, PHP really is that easy to setup.
- neonsunset 2y agoThis has not been true for a long time.
- njovin 2y agoYou can have a a ~20 line docker-compose.yml file that only requires you to `docker compose up` and you're up and running. It's gotten insanely easy to run php-fpm + nginx + [whateverdb] in a set of docker services that require virtually no configuration.
- troupo 2y agoAnd who is going to write that ~20 line compose file with "no configuration"? A newbie?
- cess11 2y agoWhen you're configuring Internet facing Linux services you're kind of out of the newbie area. A newbie is more likely to use the built-in development server and then SFTP a 'git archive' to a shared host.
- troupo 2y agoThe original comment was about newbies. Everyone is a newbie at one point. Just last year I tried a blog engine written in PHP. 24 years programming experience, but I haven't touched PHP for 10 years, and I haven't touched configuring it for 15+ years. It took me half a day to make it work.
- cess11 2y agoWhat blog engine? Usually with PHP applications you clone the repo, copy .env boilerplate, enter database credentials, run Composer to fetch dependencies and do some setup tasks, then boot the application.
- troupo 2y agoI really wish people would maintain conversation context for at more than a single reply.
- 2y ago
- hluska 2y agoYou won’t find this answer very satisfying, so feel free to ask questions. But it depends on what you’re trying to accomplish. If you’re sticking with defaults, it’s very easy - it’s less than ten minutes of work or seconds if you’re comfortable working with Docker. On the other hand, let’s say that you’re running into problems scaling to handle more requests. You’ll end up having to tweak the max_workers setting. That takes a bit of experience or it can be a lot of ‘fun’ (in the Dwarf Fortress sense). So yes and no. But a lot of people have been through this, have all the trauma you would receive and tend to be quite helpful. You can do it!
- n3storm 2y agoI agree. Having separated php processing and http processing brings good practices and helps further scalation.
- francislavoie 2y agoJust as a reminder, you can use Caddy + php-fpm as well (with vanilla Caddy, no plugins). What this does is give you a way to run your webserver + PHP as a single process, or single Docker container (instead of the traditional 2-container approach), and it also unlocks the ability to run PHP in a worker mode, where you have long-running PHP processes that have your framework loaded in memory ready to serve requests, instead of booting the framework on every request (so, much lower request latency).
- hparadiz 2y agoCaddy uses more RAM and has no inherent benefit when running a project in production professionally. Caddy is easier for self hosted cause it automatically handles HTTPS where Nginx does not. Related reading: https://blog.tjll.net/reverse-proxy-hot-dog-eating-contest-caddy-vs-nginx/ https://blog.tjll.net/reverse-proxy-hot-dog-eating-contest-c...
- mholt 2y ago> has no inherent benefit when running a project in production professionally Tell that to Stripe and Framer and numerous other businesses using it very seriously and very much professionally! ;)
- m_sahaf 2y agoCiting that particular blog post isn't making the point you think it makes. To quote: > The most striking piece of new knowledge for me was learning about failure modes. Nginx will fail by refusing or dropping connections, Caddy will fail by slowing everything down. Do you want your clients failing to load your website at all? Is this the best approach to serving users?
- jeroenhd 2y ago> Do you want your clients failing to load your website at all? Is this the best approach to serving users? There are good reasons for picking either. Large services under sudden load sometimes implement queueing, which is just failing but stylish. For my blog posts, I'd rather throw an error than have people wait for thirty seconds. The contents aren't that important and the end result will probably look bad because of missing CSS anyway. For API services, I'd want things to slow down rather than fail, unless failure is explicitly documented in the API and can be handled somewhat gracefully.
- anonzzzies 2y agoFew seconds with docker. There are fully loaded compose ones that include everything so you don’t need to add anything. It’s lovely. For prod it’s better to only leave the needed extensions etc of course but for dev it’s so easy to get going. And to be honest, for small personal, company internal and less than $1000/mo rev saas, we just use the fully loaded in prod as well.
- tommica 2y agoHow does your production one look like if I may ask?
- ofrzeta 2y agoApache with mod_php actually takes just "apt install libapache2-mod-php8.2" to work.
- ihateolives 2y agoWhy use mod-php when you have fcgi and fpm?
- netol 2y agoIt's simple and there is less overhead. Since PHP runs directly within the Apache process, there is no need for inter-process communication (no TCP, no sockets), reducing the overhead. This can lead to lower latency for individual requests.
- cholmon 2y agomod_php does give you better response times for individual requests, but at the expense of being able to handle a higher load of traffic; you'll run out of memory and/or experience timeouts on mod_php way before you do with php-fpm. With mod_php, every Apache process has the PHP engine embedded in it, even if PHP isn't needed, e.g., to serve a request for a .css file. When Apache gets a bunch of requests for flat files, it forks all those processes and fills up RAM with copies of the PHP engine that aren't used. That's not only wasteful, but it dramatically increases the chances that you'll run out of memory. You can limit the number of Apache children of course, but you'll see timeouts sooner when you get a traffic spike. By having Apache proxy over to php-fpm for PHP requests, you can configure Apache to use mpm_event for serving static files, which allows for much leaner Apache workers (memory-wise) since they aren't carrying PHP around on their backs. While you're at it, you can use haproxy on the same machine for TLS termination, then you can disable mod_ssl thus making Apache workers even lighter.
- netol 2y ago> With mod_php, every Apache process has the PHP engine embedded in it, even if PHP isn't needed, e.g., to serve a request for a .css file. When Apache gets a bunch of requests for flat files, it forks all those processes and fills up RAM with copies of the PHP engine that aren't used. That's not only wasteful, but it dramatically increases the chances that you'll run out of memory. You can limit the number of Apache children of course, but you'll see timeouts sooner when you get a traffic spike. Yes, that is true. But most high-traffic websites will cache static files such as CSS files and images, using a reverse proxy (e.g. Varnish, a CDN, or usually both). So I don't think this is a real problem, most of the time (99.9%?), a request for a static file will not hit Apache. I'm not saying mod_php is better for all scenarios, of course, but I think it can be ok.
- codegeek 2y agoIt takes 5 minutes to configure with the defaults. But once you need to optimize PHP-FPM to handle more requests, you now find yourself fiddling with pm.max_children etc settings and need to know what you are doing. I love working with PHP and Go both btw. But PHP configurations can be a pain if you do anything other than defaults.
- lelanthran 2y ago>This is the kind of direction the language needs to go in, instead of the older LAMP which can require somewhat complex Apache configuration. I hardly every set up PHP (once each time I reinstall my desktop, which was last in ... 2018?) but I recall it being very quick and smooth using apt-get. I don't recall doing anything else other than restarting apache.
- KronisLV 2y ago> ...instead of the older LAMP which can require somewhat complex Apache configuration. Is it really that bad? The Apache configuration seems decent with something like PHP-FPM: https://news.ycombinator.com/item?id=40256843 https://news.ycombinator.com/item?id=40256843 LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so" <FilesMatch \.(php|phar)$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> Here's a more full example of Nginx that's quite conceptually similar to how one would configure Apache, with installing the prerequisite packages: https://news.ycombinator.com/item?id=37443911 https://news.ycombinator.com/item?id=37443911 There are also prebuilt container images that you can use to achieve similar results, this is just in case you want to do it yourself and have a look at what's under the hood a bit more. In my eyes, that's certainly easier than configuring the Java app servers of old, like doing manual Tomcat or GlassFish configuration or whatever people spent time on back then. A single run command will usually be better regardless of the environment, but LAMP isn't all that bad either, when compared to the other stacks out there.
- pathartl 2y agoI cut my teeth as a WordPress dev and left the scene for .NET when it was still popular to use Vagrant to setup your dev environment. While I'm glad things have progressed since then, I have a trauma response to those days. The amount of hours spent getting a proper config with XDebug setup (oh god, what an absolute backwards-ass nightmare) was substantial.
- El_RIDO 2y agoAnd to add one more option to the comments (beyond [frontend] + php-fpm): Nginx Unit https://unit.nginx.org/ https://unit.nginx.org/ - like Apache + mod_php runs as a single service, handles the multiprocessing of php (and other languages), static files, reverse proxy and even lets you configure both itself and php via a single configuration (either as a file or dynamically at runtime, via a socket): https://unit.nginx.org/configuration/#php https://unit.nginx.org/configuration/#php Here is an IRL config example: https://github.com/PrivateBin/docker-unit-alpine/blob/master/conf.json https://github.com/PrivateBin/docker-unit-alpine/blob/master... The resulting container image can be pretty small: https://hub.docker.com/r/privatebin/unit-alpine https://hub.docker.com/r/privatebin/unit-alpine
- augustohp 2y agoI agree. If we can start a culture of relying on SQLite instead of PostgreSQL/MySQL, a whole server-side application can be a simple standalone binary. Also, having a binary makes it easy to bundle in an Electron app.
- francislavoie 2y agoLaravel is defaulting to SQLite now (mainly for ease of development). Also FrankenPHP has SQLite included by default. Going that route is less scalable though, obviously, unless you use one of those third party SQLite cluster solutions.