It’s a classic Hollywood plot: the battle between two old friends who went separate ways. Often the friction begins when one pal sparks an interest in what had always been the other pal’s unspoken domain. In the programming language version of this movie, it’s the introduction of Node.js that turns the buddy flick into a grudge match: PHP and JavaScript, two partners who once ruled the internet together but now duke it out for the mind share of developers.
In the old days, the partnership was simple. JavaScript handled little details on the browser, while PHP managed all the server-side tasks between port 80 and MySQL. It was a happy union that continues to support many crucial parts of the internet. Between WordPress, Drupal, and Facebook, people can hardly go a minute on the web without running into PHP.
Then some clever kid discovered he could get JavaScript running on the server. Suddenly, there was no need to use PHP to build the next generation of server stacks. One language was all it took to build Node.js and the frameworks running on the client. “JavaScript everywhere” became the mantra for some.
Since that discovery, JavaScript has exploded. Node.js developers can now choose between an ever-expanding collection of excellent frameworks and scaffolding: React, Vue, Express, Angular, Meteor, and more. The list is long and the biggest problem is choosing between excellent options.
Some look at the boom in Node.js as proof that JavaScript is decisively winning, and there is plenty of raw data to bolster that view. GitHub reports that JavaScript is the most popular language in its collection of repositories, and JavaScript’s kissing cousin, TypeScript, is rapidly growing too. Many of the coolest projects are written in JavaScript and many of the most popular hashtags refer to it. PHP, in the meantime, has slipped from third place to fourth in this ranking and it’s probably slipped even more in the count of press releases, product rollouts, and other heavily marketed moments.
But hype fades and software can live on for decades. Most of the PHP code base isn’t going to migrate and it continues to serve up large portions of the text we read each day. By some estimates, 40 percent of the pages we view begin, in some form, with PHP. Part of this is because PHP continues to be reborn. In the last few years, the guts of the systems running PHP have been completely rewritten. It’s not the same PHP code that ran your grandparent’s website.
PHP’s zippy, just-in-time compiler is delivering answers faster than ever thanks to the same smart techniques that powered the Node.js revolution. Now PHP 7.2 and the HHVM offer many of the same clever on-the-fly optimizations that V8 brought to Chrome and Node.js. Not only that, but HHVM has Hack, a clever PHP dialect that offers full support for sophisticated programming features such as lambdas, generics, and collections. So if you need these features, you don’t need to search for a more full-featured stack.
Of course, the ending isn’t written yet. For every coder crowing about the purity and youth of Node.js and the simplicity of JavaScript everywhere, there’s another who’s happy with the deep code base and long-understood stability of PHP. Will the old codger beat back the server-side upstart? Will JavaScript topple its old friend to achieve world domination? Put another batch of popcorn in the microwave and sit back.
Where PHP wins: Mixing code with content
You’re typing along, pouring thoughts into text for your website, and you want to add a branch to the process, a little if-then statement to make it look pretty, say, depending on some parameter in the URL. Or maybe you want to mix in text or data from a database. With PHP, you open up the magic PHP tags and start writing code within seconds. No need for templates—everything is a template! No need for extra files or elaborate architectures, only programmable logistical power at your fingertips.
Where Node wins: Separating concerns
Mixing code with content is a crutch that can end up crippling you. Sure, it’s fun to mix code in with HTML the first two or three times you do it. But soon your code base becomes a tangled mess of logic. Real programmers add structure and separate the cosmetic layer from the logical layer. It’s cleaner for new programmers to understand and easier to maintain. The frameworks running on Node.js are built by programmers who know that life is better when the model, view, and controller are separate.
Where PHP wins: Deep code base
The web is filled with PHP code. The most popular platforms for building websites (WordPress, Drupal, Joomla) are written in PHP. Not only are the platforms open source, but so are most of their plugins. There’s PHP code everywhere, and it’s waiting for you to download, modify, and use for your needs.
Where Node wins: More modern features
Sure, there are thousands of great open source PHP files, but some are 12-year-old WordPress plug-ins hoping and praying that someone will download them. For every modern version of Symfony, there is a dusty, long-forgotten library that no one updates.
Who wants to spend hours, days, or weeks monkeying with code that hasn’t been updated in years? Node.js plug-ins are not only newer, they were built with full knowledge of the latest architectural approaches. They were built by programmers who understand that modern web apps should push most of the intelligence to the client.
And while JavaScript has many little idiosyncrasies that drive some mad, for the most part it is a modern language that sports a modern syntax and a few useful features like closures. You can reconfigure and extend it easily, making powerful libraries like jQuery possible. You can pass functions around like objects. Why limit yourself?
Where PHP wins: Simplicity (sort of)
There’s not much to PHP: a few variables and basic functions for juggling strings and numbers. It’s a thin layer that doesn’t do much except move the data from port 80 to the database and back. That’s what it’s supposed to do. A modern database is a magical tool, and it makes sense to leave the heavy lifting to it. PHP is the right amount of complexity for a job that’s not supposed to be complex.
Then again, if you’re a programmer who wants to do more than interact with a database and format the results, you can now do more with PHP without holding your nose. Facebook’s HHVM adds support for Hack, a complete language filled with modern features like type annotations, generics, and lambda expressions. Using this limits your code to running only on the HHVM, but that’s not the worst thing in the world. It’s very fast.
Where Node wins: Dozens of language options
If PHP users are happy to get access to Hack, they should consider moving to the world of Node.js because many major languages can be cross-compiled to run in JavaScript. There are well-known options like Java, C#, or Lisp and dozens of others like Scala, OCaml, and Haskell. There are even gifts for nostalgic lovers of BASIC or Pascal. This list of languages that compile to JavaScript from Jeremy Ashkenas is fairly comprehensive. Plus JavaScript cousins like TypeScript and CoffeeScript offer slightly different and improved approaches to the same game.
Where PHP wins: No client app needed
All of the talk about using the same language in the browser and on the server is nice, but what if you don’t need to use any language on the browser? What if you ship the data in HTML form? What if you’re building a spartan, static website to deliver strictly what is needed without the interactive bling? The browser pops it up, and there are no headaches or glitches caused by misfiring JavaScript threads that try to create a page on the browser from two dozen web service calls. Pure HTML works more often than anything else, and PHP is optimized to create that. Why bother with JavaScript on the browser? Build up everything on the server and avoid overloading that little browser on the little phone.
Where Node wins: Service calls are thinner than HTML-fat PHP calls
While AJAX-crazy HTML5 web apps can have too many moving parts, they are cool—and very efficient. Once the JavaScript code is in the browser cache, the only thing that moves along the wires is the new data. There’s not a ton of HTML markup, and there are no repeated trips to download the entire page. Only the data has changed. If you’re willing to put in the time to create a slick browser-side web app, there’s a big payoff. Node.js is optimized to deliver the data and only the data through web services. If your app is complex and data-rich, it’s a good foundation for efficient delivery.
Where PHP wins: SQL
PHP was built to co-exist with MySQL and its many variants, like MariaDB. If MySQL isn’t exactly right, there are other great SQL databases from Oracle and Microsoft. Your code can switch with a few changes to your queries. The vast SQL world doesn’t end at its borders. Some of the most stable, well-developed code will interface with an SQL database, meaning all that power can also be easily integrated into a PHP project. It may not be one perfect, happy family, but it’s a big one. Not only that, but the database world is slowly getting better as developers find ways to add more intelligence to the database so you don’t need to work as hard.
Where Node.js wins: JSON
If you must have access to SQL, Node.js has libraries to do that. But Node.js also speaks JSON, the lingua franca for interacting with many of the latest NoSQL databases. That’s not to say you can’t get JSON libraries for your PHP stack, but there’s something fluid about the simplicity of working with JSON when using JavaScript. It’s one syntax from browser to web server to database. The colons and the curly brackets work the same way everywhere. That alone will save you from hours of frustration.
Where PHP wins: Coding speed
For most developers, writing PHP for web apps feels faster: no compilers, no deployment, no JAR files or preprocessors—simply your favorite editor and some PHP files in a directory. Your mileage will vary, but when it comes to banging a project together quickly, PHP is a good tool to use.
Where Node.js wins: Application speed
Writing JavaScript code is a bit harder when you’re counting curly brackets and parentheses, but when it’s done, your Node.js code can fly. The callback mechanism is brilliant because it saves you from juggling the threads. The core is well-built and designed to do all that for you. Isn’t that what everyone wants?
Where PHP wins: Competition
The battle for the hearts and minds of PHP developers is still unfolding. The HHVM team and the Zend team are working hard to deliver fast code for everyone. Independent benchmarks are appearing, and everyone is pushing the code bases to the limit. This only means better performance.
Where Node.js wins: Solidarity
Do you really want two different code bases? Sure, competition helps, but fragmentation soon follows. What happens when your code runs on only one of the two? Competition doesn’t do any good if you have to spend weeks or months rewriting your code. While Node.js experienced its own splintering a few years back, with the launch of io.js, the Node.js universe has since reunited, giving it the kind of language solidarity that PHP developers may soon long for.
Where PHP wins: Basic apps
In the last few years, a few developers have started up web apps and found themselves frustrated by the sluggish behavior. The JavaScript that drives all of those moving pieces can be tens of thousands of bytes, sometimes hundreds of thousands. When all of the packets arrive, they must be parsed, compiled, and finally executed—all to deliver a few bytes like the temperature and the forecast.
The backlash against this rococco insanity can be found in the teams building static site generators (463 at this writing) and stripped-down webpages in the AMP format. PHP is a natural choice for any team that wants to concentrate the intelligence on the server so the client isn’t overburdened.
Where Node.js wins: Richness
Ludwig Mies van der Rohe, the architect of buildings, once said, “Less is more.” Robert Venturi, another architect, came along and retorted, “Less is a bore.” The smartphones have more power than a room full of Cray computers. The desktops have video cards with multiple fans to keep them cool during all of the processing. Why should we strip down our code and live like a Depression-era victim in a Steinbeck novel? Live it up. Big, slick websites full of JavaScript code are eye-catching, dramatic, and most of all fun. Sure it’s kind of obscene to waste that much bandwidth on a few bits of data, but bandwidth has never been cheaper. Live a little!
Where both win: Headless
The word “headless” refers to the PHP code running on the server. Recently some of the top PHP applications like Drupal have peered across the aisle and come away amazed by the sophisticated user interfaces built by the JavaScript frameworks like React, Angular, or Vue. Instead of trying to compete with them, they’re ceding control of the client and concentrating on doing a good job with the back-end on the server.
If you’ve got quite a bit invested in PHP code running on the server, this may be a way to enjoy the best of both approaches. The old, established PHP code acts as a front door to the database, double-checking the requests, cleaning up the data, and generally providing all of the business logic. The client side is a progressive web app written with the latest JavaScript framework. When it needs information, it sends off an AJAX request to the PHP code.
This may not make sense for someone starting from scratch, but if you’ve relied upon PHP for years and you want to move forward gradually, this can be a happy compromise.
Where both win: Microservices and serverless
The rising microservice or serverless paradigms offer a way for JavaScript and PHP code to cohabit the server and get along. Both solutions split the work into dozens of smaller services or functions and these can run independently and stay in their lanes. Some parts, usually the older and most stable sections of the app, can run PHP. The other parts, often the newer ones, will be written in Node.js. The language of POST
or GET
can be the lingua franca that unites them all.