10 ms·
A Built-in Web Server For PHP
- acabal 16y agoOh god... as if configuring Apache for a non-trivial site wasn't complicated enough, now we'll have the full genius of those responsible for PHP's function naming conventions writing their own web server? Is this really necessary? Why not spend the time making PHP's namespace support not suck, or working on the SPL?
- orthecreedence 16y agoAt least the web server isn't written in php...
- kingkilr 16y agoActually it's kind of sad that it needs to be in C, most sane language would implement their server in themselves.
- ErrantX 16y agoWhy? Web Applications and Web Servers are two very different things with different language requirements. Seems sensible to pick the strongest languages with which to build the whole package.
- mahmud 16y agoI guess you don't push web servers. They're "apps", not system software. Anybody who deploys non-trivial web-apps knows this. Per-app web servers, standing behind a proxy, with a shared session-db is the most ideal way to get things done. At this point in the game, Apache-class servers are glorified proxies, and occasionally dole out static data when you're not using a CDN. I have customized my web server so much, I would've had to wait for years to see the changes in Apache, nginx or lighty, if ever.
- kingkilr 16y agoBecause most sane languages aren't just for writing web apps, they're for writing programs.
- ary 16y agoCurious as to why you think PHP's namespace feature (I'll assume you mean the real one introduced in 5.3) sucks. It seems like you didn't read the whole RFC. The configuration is actually very simple (just the command line options), and not meant to be a front-facing HTTP server.
- acabal 16y agoOff the top of my head, because when I want to reference My.Namespace.MyClass.Foo(), I have to do something like: use \My\Namespace; $var = new Namespace\MyClass(); $var->Foo(); I have to remember and type the parent namespace for every imported class I want to use. In a big project this gets to be too much typing and too much for my brain to remember. Contrast with say, C#: using My.Namespace; MyClass var = new MyClass(); var.Foo(); You import a namespace, and the compiler figures out what goes where without you having to remember anything. Plus the weird exceptions required for backwards compatibility, and the global namespace: I often forget where a root \ is required and where it isn't (not when declaring a namespace, but often--not always!--when referencing one). And of course there's the monstrous choice of namespace separator. End of the world? Not really. Sucks? Yeah. And possibly a dealbreaker for me for larger projects with complicated namespaces and lots of classes. I'd love for this to be just a misunderstanding on my part, because it would make my life a lot easier if PHP namespaces where more like C# ones!
- soulclap 16y agoHaven't worked with the PHP namespaces a lot myself yet but there seem to be more convenient ways: http://www.rooftopsolutions.nl/blog/taking-advantage-of-php-namespaces-with-older-code http://www.rooftopsolutions.nl/blog/taking-advantage-of-php-... And a good read on PHP namespaces in general: http://weierophinney.net/matthew/archives/254-Why-PHP-Namespaces-Matter.html http://weierophinney.net/matthew/archives/254-Why-PHP-Namesp...
- ary 16y agoYour PHP example is possible to write in a way that is nearly identical to the C# you provided. Why are you prefixing Namespace\MyClass(); when you declared your namespace scope in 'use \My\Namespace'? Your assignment can just be: $var = new MyClass(); This brings it pretty much in line with your C# example. Have you read the PHP docs on namespaces? http://www.php.net/manual/en/language.namespaces.basics.php http://www.php.net/manual/en/language.namespaces.basics.php
- deleted 16y ago[deleted]
- jacques_chester 16y agoOuroboros has bitten its tail.
- al_james 16y agoI don't really see how this would help. Thats what FastCGI is for. You would have to be dumb to expose a php internal HTTP server to the world, and configuring a FastCGI backend is no harder than setting up a HTTP backend in apache/nigix/whatever. If its just for testing, most apache installs come with PHP by default, its just another command to learn.
- ary 16y agoThat's not exactly true. You still need an HTTP server to proxy to the FastCGI back-end. This could be useful for a number of things outside of local development instances. One could avoid having to setup Apache/nginx/whatever to pick up the HTTP request from a reverse proxy and instead just spin up PHP on its own.
- 3dFlatLander 16y agoIt's even easier now that PHP 5.3.3+ has FPM included (config option is --enable-fpm). Getting it set up with nginix is a breeze.
- X-Istence 16y agoPHP FPM is nice and all, but the issue still is that it is a FastCGI server, so you need something that can route to it. This php -S proposal doesn't have that requirement.
- Toucan 16y agoThe idea isn't to open the server to the world. The RFC states that it's meant to be used in a similar way to django's manage.py runserver, for development and internal testing. Django phrase it in their tutorial as: "We've included this with Django so you can develop things rapidly, without having to deal with configuring a production server -- such as Apache -- until you're ready for production. Now's a good time to note: DON'T use this server in anything resembling a production environment. It's intended only for use while developing. (We're in the business of making Web frameworks, not Web servers.)" As long as the PHP documentation includes similar caveats and guidance, an HTTP server isn't a bad thing.
- chrisallnutt 16y agoI feel this is trying to solve a problem where there isn't one. You can easily install MAMP or XAMP and have access to a full stack if your developing on your local machine. There are so many other higher priority items for PHP to address.
- soulclap 16y agoGuess you could say the same about Ruby's WEBrick and it's still nice to have, even if it's just to get absolute beginners up and running in no time.
- jarin 16y agoIt's not just for absolute beginners. I tried the vaunted "running Passenger locally" method of Rails development but I didn't really like having to configure it and all that (even PassengerPane was a pain). Much easier just to cd into the project directory and type "rails server".
- blutonium 16y agoPassenger works as a standalone server with Nginx now - http://www.modrails.com/documentation/Users%20guide%20Standalone.html http://www.modrails.com/documentation/Users%20guide%20Standa...
- code_duck 16y agoI'm trying to help a friend get started with PHP and she is thoroughly confused by XAMPP for some reason (I wish she was using Linux or a Mac!). A server like this will be useful for beginners who have a lot to think about before HTTP or database servers.
- voidfiles 16y agoNot true. I have developed in python, and php for many years. PHP has always suffered from the problem of having to install MAMP, or XAMP. When using django, you just have to install django using something like pip. Then from your project folder you can launch a dev server without need to configure apache. As Steve Jobs would say, 'it just works'. Projects like Drupal would benefit immensely from something like this.
- TamDenholm 16y agoI know its kinda useless for anything other than "just because i can" but anyone can code their own webserver in for PHP using PHP. Just saying. Might be useful for development on your own machine or something.
- soulclap 16y agoI guess no one really needs this bad but if someone's up to build it, why not? If it's kept as simple as the RFC suggests, it should be stable real soon and there are definitely scenarios where I'd choose this over launching Apache or even installing it, depending on the task and environment.
- jerf 16y agoGive it some time to burn in first. Always give any new webserver time to burn in first. I'm not sure that anyone has yet successfully produced a web server that does not ship with the trivial directory traversal vulnerability on day one, for instance. I don't say this because it's PHP particularly either. Nobody seems to be able to avoid really trivial and massive vulnerabilities in new web servers. I've lost track of the number of times I've seen it. I'd link to a search of osvdb.org for "directory traversal web server" but it seems to be down.
- jamesgeck0 16y agoOne thing the Symfony2 framework does that I sort of appreciate is limiting access to the page to calls from localhost only by default. It seems like that might mitigate some of the (no doubt gaping) security issues.
- josephmoniz 16y agoNodePHP anyone? heh, afraid that would be a little more then just a SAPI implementation though, we'd have to throw out a good chunk of the standard library and very few if any extensions were coded for asynchronous execution. An interesting thought though.
- jsdalton 16y agoSeems like this would be useful for development. It'd be great to be able to print to the console for debugging purposes etc. while working on something.
- there 16y agoi use error_log() for that and just tail apache's error log. for dumping arrays and things, i use an error_log_r() which just does print_r to the error log: function error_log_r($obj) { ob_start(); print_r($obj); $lines = explode("\n", ob_get_clean()); foreach ($lines as $line) error_log($line); }
- shaunxcode 16y agoHey, rather than using ob_start and ob_get_clean you can do: $lines = explode("\n", print_r($obj,1)); Or better yet if we're playing golf: array_map('error_log', explode("\n", print_r($obj, 1)));
- there 16y agoah, i must have written that a very long time ago when the return parameter to print_r() wasn't available. thanks, i've updated my local implementation.
- X-Istence 16y agoWhile tail'ing apache's error log is how I debug PHP as well, it is not nearly as nice as the possibility to get full debugging within PHP much like Python does. Also, this would make it easier to use Xdebug or something like that as it wouldn't require that to be installed in a possibly production system. Also, most beginners using PHP start off with some shared hosting somewhere and get the directory include stuff wrong and now have live bad code on the web. At my university that was a big issue, but it is the only way these beginners had to test their website.
- xiongchiamiov 16y agoWhen working in Django (which uses a similar builtin webserver for development), I can do a `import pdb; pdb.set_trace()` in the middle of my code to drop me down into a Python shell. If you're used to working in a REPL, it's insanely helpful.
- litek 16y agoCouldn't one simply write a php script opening up a socket and routing the request as fit? Is there a need for this in the core?
- jonursenbach 16y agoIt's unnecessary to have to write that every time you want this feature though. Would be nice, and certainty more efficient, for it to be in the core.
- jarin 16y agoHopefully this will end the long-standing practice of novice PHP developers writing code and pushing it to production to test it (or worse, editing code on the production server). Yes, I know you can set up Apache and mod_php or whatever, but starting a server from the command line is just awesomer. You'll see, guys!
- Ixiaus 16y agoThis is probably the biggest potential win for this feature as long as said developers understand the difference between the inbuilt webserver and the production server (the difference between python paste and apache/mod_wsgi).
- julianz 16y agoI like this idea. It would be handy on dev machines, and I would use it.
- seldo 16y agoI really hate this idea. Coupling the server to the language seems like a weakness in both django and rails to me, since it means deployment becomes more of a scary hurdle, with possible changes in environment between your dev server and production. One of the strengths of PHP has always been for me that your development and production environments are pretty much the same, and deployment is just a matter of finding a way to copy the files over (and you can be as simple or clever about that part as you like). Teaching a newbie how to run the PHP server is not that much less complicated than getting a default apache install running (especially with all the LAMP and WAMP installers out there to do it for you), and then you'd have to teach them about apache anyway before they pushed to prod.
- andrewvc 16y agoI think that advice flies in the face of best practices. 1. Your dev box isn't supposed to be very similar to production, this is why you have staging servers. My dev boxes have weird tooling and debug tools. They also run all services on a single box rather than distributed. Don't pretend dev is at all like prod, this assumption will disappoint you. 2. App servers, which generally speak HTTP and use a standard interface (in ruby Rack, in Python WSGI) and speak HTTP to a load balancer (probably nginx). Are simple and just work. They're less pain than setting up apache. `cd myproject && rails server` is nice. 3. There are about 10 billion things you can get wrong with setting up a production server. If you can't figure out how to proxy requests to an app server you have no business setting up a server in the first place. You've probably already lost.
- calloc 16y agoI have to say that php-fpm does FCGI very nicely and works well with Lighttpd and Apache (even on the same host). It basically sets up a separate instance that runs PHP and requests are shuttled to the backend. Unfortunately there is no way to talk to it directly like there would be with rails and django's built in Python servers.
- seldo 16y ago1. My dev system is a series of VMs that mirror that same box deployments we have in production, the only difference being that systems we duplicate for redundancy in production are singular in dev. I've found that this prevents accidental dependencies between libraries and processes that would otherwise complicate deployments and scaling. 2. For me, "apt-get install apache" once is much simpler and cleaner than running a dev server every single time, but I have been doing it this way for more than a decade, so perhaps you are right and I am just set in my ways. 3. If you can't set up a production environment you can't set up a production environment, and it doesn't matter which architecture is involved.
- sdfgyhjty 16y agoClick on our website: ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ Website wholesale various fashion shoes, such as Nike, Jordan, prada, also includes the jeans, shirt, bags, hats and decoration. Personality manufacturing execution systems (Mes) clothing, Grab an eye bag coat + tide bag Air jordan(1-24)shoes $30 Handbags(Coach l v f e n d i d&g) $35 Tshirts (Polo ,ed hardy,lacoste) $15 Jean(True Religion,ed hardy,coogi) $30 Sunglasses(Oakey,coach,gucci,A r m a i n i) $15 New era cap $12 Bikini (Ed hardy,polo) $20 accept paypal and free shipping ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯ ╭══════════════╮ http://simurl.com/voblec http://simurl.com/voblec ╰══════════════╯
- Supermighty 16y agoThe best argument for PHP having it's own web server is to allow novice developers an easy way to code and test their sites. I'll go out on a limb and say I don't think the lack of a built in web server has hurt PHP's adoption in the past. And a built in web server would only be good for the novice tinkerer. I don't see entrenched PHP shops switching, nor new applications being written specifically for the build in server when Apache w/mods, nginx or LigHTTPD offer better solutions (mature solutions) that are available now.
- nir 16y agoWhat's the deal with the negative comments? You basically get this feature as a gift. If you don't use it, you won't be affected by it in any way. If you do, you get to enjoy the author's labor for free. Where's the problem here? Any idiot can write a snarky comment about PHP. Very few get to write code that has anywhere near the impact it had.
- illumin8 16y agoThe problem is that this encourages lazy development. Many developers love the ability of tools like Tomcat that allow you to run your web app inside of the application server itself, rather than having to configure a pesky Apache server. The problem this creates is that once a developer has it running on their own machine inside Tomcat (or now this PHP built-in webserver) the app is probably coded in such a way that it will ONLY run inside this server, and will never scale. What's more, they often turn it into a production application with real customers depending on it, and blame you if you can't make it scale to handle hundreds or thousands of users. This is the problem with using "built in" webservers. It encourages developer laziness, and encourages people to kick bad code over the fence to the operations team who has to make it reliable and run in production. Never mind that a built in PHP webserver will never scale to meet the needs of more than a few users.
- michaelbuckbee 16y agoWhile I take your point, the major factor at play here isn't what webserver you are using for development it is the fact that you (as the developer) are the only one hitting the server.
- hartror 16y agoSounds more like a procedural issue being created by poor programmers and bad management. Not testing it on a production-like environment is a capital offense whether you are using a development server or apache/lighttpd/nginx.
- wisty 16y ago
- cagenut 16y agoAs much as I'm not so sure about the overall idea, it had never occurred to me to look at cli php from this angle before. Rather than homegrow the listener/invoker there I wonder how hard it would be to do this with xinetd. Then there's the apc cache question, there would have to be some way of persisting/sharing it. Full blown goofy, but a little fun to ponder.
- c00p3r 16y agoIt must be ported to JVM! Is there any implementation of PHP for JVM? Everything must run under JVM! ^_^
- psaintla 16y agono
- dhotson 16y agoI've already done something like this. I've implemented a Rack style web server in PHP: http://github.com/dhotson/kelpie http://github.com/dhotson/kelpie I also wrote an extension for the mongrel HTTP parser, but you could probably get away with a half-assed pure PHP HTTP parser. http://github.com/dhotson/httpparser-php http://github.com/dhotson/httpparser-php It sounds crazy but it actually works pretty well. :-)
- bluesnowmonkey 16y agoThis is nice for a PHP cloud PaaS. Imagine the instructions for testing an app locally before deploying it to the cloud. Instead of trying to coach the user on setting up Apache (or whatever) in a way that mirrors your platform, you just point them to "php -S".
- snissn 16y agoIf they mean for it to only be used for development and not production, it would be funny if they hard coded a specific set of 'normal' ports that it would not work on!
- bergie 16y agoWe've been using a web/application server written in PHP for quite a while now: https://github.com/indeyets/appserver-in-php https://github.com/indeyets/appserver-in-php
- hdragomir 16y agoI applaud this! Django has this built in, Rails too. PHP went a step further and put this in the core language and that makes sense because PHP in itself is meant for the web, and is not a framework over some other language.
- BerislavLopac 16y agoActually, it is. PHP is a Web framework for C, except it uses its own syntax. Or to be more precise, PHP is a templating engine for C, only it got out of control.
- indeyets 16y agoThis is a great addition to php's toolset. And for those, who want greater flexibility, https://github.com/indeyets/appserver-in-php https://github.com/indeyets/appserver-in-php is a Ruby-Rack/Python-WSGI style solution which gives you possibility to initialise objects, open db-connections, pre-warm caches, etc. before serving requests. Provides HTTP, SCGI and Mongrel2 interfaces
- bergie 16y agoHere is how we use the PHP AppServer in Midgard Create. Very easy setup: http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/#5ef787a743aaa025fb1edb5f7086eab1 http://bergie.iki.fi/blog/introducing_the_midgard_create_use...
- sberder 16y agoI don't really get it as the RFC clearly compares two different things. Web servers included in frameworks to ease the development (django/ror and others like web.py) and a web server included in a cli interpreter which is more or less the engine itself. For me there is a huge difference and mind gap I'm not ready to do. I genuinely think that php is a convenient language for a lot of things but implementing a simple class (like SimpleHTTPServer) looks more natural to me than adding a server directly inside the cli.
- Purefan 16y agoI would agree if the webserver was a functional replacement for apache in a production machine. What I mean is that, if the built in server is more efficient than apache and it can be used with performance gain (lets skip the middle man)