PHP frente a Node.js

TL;RD :PHP no va a desaparecer de inmediato, pero sus posiciones se ven socavadas aún más por el naciente Node.js.

Cuando Internet explotó en la década de 2000, PHP era una cosa todos los chicos geniales hizo. Fue extremadamente revolucionario, porque:

  • Era un lenguaje interpretado a diferencia de C++ o Java que requieren la compilación del código fuente
  • Tenía la capacidad de usarse directamente con HTML mezclando dentro de sus archivos de plantilla con un <%php ... %> etiquetas de marcas
  • Tenía proveedores de alojamiento compartido baratos en servidores Apache con una pila de Linux, Apache, MySQL y PHP (LAMP)
  • Tenía una naturaleza funcional que es más fácil de aprender que la programación orientada a objetos

A lo largo de los años, PHP y sus aplicaciones se convirtieron en una tecnología monstruosa vulnerable a amenazas de seguridad (por ejemplo, inyecciones de SQL), falta de un registro de paquetes centralizado (¿Composer se inspiró en Node Package Manager?), API inconsistente y rendimiento mediocre. Hay muchas mejores alternativas a PHP, por ejemplo, Ruby on Rails y Django, sin embargo, nada es tan accesible como Node.js.

Para aquellos de ustedes que no están familiarizados con Node.js, o que han oído hablar de él pero no pueden entender el concepto, aquí está mi analogía:

Hoy en día, Node.js está ganando impulso. La plataforma utiliza JavaScript. Es funcional y su mecanismo de E/S sin bloqueo permite un mejor rendimiento. Node.js viene con una sólida solución Node Package Manager y la especificación, es decir, ECMAScript.

Debido a que Node.js es una tecnología de nivel inferior, no es comparable directamente con marcos complejos como Struts, Rails o Django.

Por lo tanto, muchas personas, ya sean ingenieros de software o empresarios, a menudo se enfrentan a la decisión de "Qué tecnología usar ” En este artículo PHP vs. Node.js, compararemos manzanas con manzanas abordando la pregunta desde diferentes ángulos, como:

  • Sintaxis
  • Cambio de contexto
  • Módulos
  • Ecosistema
  • Marcos
  • Aplicaciones en tiempo real
  • Aplicaciones de base de datos
  • Aplicaciones de servicios de terceros
  • Servidores web
  • Alojamiento
  • Rendimiento

Sintaxis

Ambas plataformas tienen acceso a la interfaz de línea de comandos a través de $ php -i y $ node .

Este fragmento imprime 'Hello World' en PHP:

echo 'Hello World'; 

Esto generará la misma frase en Node.js:

console.log('Hello World');

Nota:En JavaScript, los puntos y comas son opcionales excepto cuando están dentro del for bucles y antes de expresiones de funciones invocadas inmediatamente (IIFE).

Ejemplo de script de función de suspensión en PHP:

echo "a"."\n";
sleep(2);
echo "b"."\n";
echo "c"."\n";

El código anterior generará:

[Nota al margen]

Leer publicaciones de blog es bueno, pero ver cursos en video es aún mejor porque son más atractivos.

Muchos desarrolladores se quejaron de la falta de material de video de calidad asequible en Node. Es una distracción ver videos de YouTube y una locura pagar $ 500 por un curso de video de Node.

Visite Node University, que tiene cursos de video GRATUITOS en Node:node.university.

[Fin de la nota al margen]

a

Y luego, después de un retraso de 2 segundos:

b
c

Si intentamos volver a escribir el código en Node.js:

console.log('a')
setTimeout(function() {
  console.log('b')
 },2000)
console.log('c')

Este fragmento imprimirá:

a
c

Y con un retraso de 2 segundos, imprimirá:

b

Nota :En JavaScript, console.log() agrega automáticamente el símbolo de fin de línea.

El for el bucle en PHP podría verse así:

for ($i = 1; $i <= 10; $i++) { 
  echo $i;
} 

Son sorprendentemente similares en Node.js:

for (var i = 0; i <= 10; i++) { 
  console.log(i);
} 

Para crear una matriz en PHP:

$users = array( 
  array('name' => 'John', 'id' => 3940), 
  array('name' => 'Peter', 'id' => 8904) 
); 

Para crear una matriz en Node.js:

var users = [ 
  { name: 'John', id: 3940 }, 
  { name: 'Peter', id: 8904 } 
] 

Para iterar a través de una matriz en PHP:

for($i = 0; $i < count($users); ++$i) { 
  $users[$i]['id'] = mt_rand(000000, 999999); 
} 

Para iterar a través de una matriz en Node.js:

for (var i; i < arr.length; i++) {
    users[i] = Math.floor(Math.random()*1000000);
} 

O de manera funcional:

users.forEach(function(user, i){ 
  users[i] = Math.floor(Math.random()*1000000); 
}) 

Para declarar una función en PHP:

function hello($name) {
  echo "Hi ".$name;
}
hello("Peter"); //outputs Hi Peter

Para declarar una función en Node.js:

function hello(name) {
  console.log('Hi' + name);
}
hello('Peter'); //outputs Hi Peter

Para declarar un nuevo objeto en PHP:

class foo {
    function do_foo()  {
        echo "Doing foo."; 
    }
}

$bar = new foo;
$bar->do_foo();

Para declarar un nuevo objeto en Node.js:

var foo = function () {
  return { 
    do_foo: function () {console.log('Doing foo');}
  };
};

var bar = foo();
bar.do_foo();

Nota :no hay clases en Node.js/JavaScript, porque los objetos heredan directamente de otros objetos (herencia prototípica). Hay muchos patrones de creación de instancias, como pseudoclásico, funcional (arriba) y clásico.

Un fragmento de base de datos con la biblioteca de conexión de base de datos PDO en PHP:

$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); //<-- Automatically sanitized by PDO
$stmt->execute();

Un script de base de datos Node.js con la biblioteca Mongoskin MongoDB:

//assuming we use Connect/Express middleware for req.query
var db = require('mongoskin').db('localhost:27017/db'); 
db.collection('users').find({_id: req.query.id}).toArray(function(err, results) {
    if (err) throw err;
    console.log(results);
});

Cambio de contexto

El cambio entre diferentes entornos y lenguajes se atribuye a la caída de la eficiencia al escribir código de software. Muchas investigaciones y observaciones anecdóticas personales muestran que la interrupción afecta negativamente el rendimiento de los programadores. ¡Con menos idiomas para aprender y recordar, el flujo es más fluido y el código es mejor! Para obtener artículos más profundos sobre este tema, es posible que desee echar un vistazo a los interruptores de tareas humanas considerados dañinos y el mito de la multitarea.

PHP

Con la pila LAMP, es decir, Linux, Apache, MySQL y PHP, los desarrolladores deben dominar al menos dos lenguajes más que son PHP y SQL además del obligatorio y omnipresente HTML, CSS y JavaScript.

Node.js

Node.js es brillante al tener menos cambios de contexto, porque junto con MongoDB, esta pila puede operar solo en uno idioma:¡JavaScript!

Un ejemplo de comandos de shell de MongoDB (llamados por $ mongo ):

> db.users.find({});
> db.users.insert({name: 'Azat', email: '[email protected]'})
> db.users.update({name:'Azat'},{$set:{email:'[email protected]'}})

Módulos

PHP

Existe PEAR, un sistema veterano que instala paquetes en un servidor a nivel mundial, y un Composer alternativo mejor.

En otros casos, los desarrolladores tenían que buscar módulos, o componentes como ellos los llaman, en varios sitios web y administrarlos manualmente colocando *.php archivos en subcarpetas de sus proyectos. Desafortunadamente, todo esto no es muy kosher.

Node.js

Node.js viene con un sistema de administración de paquetes superior y confiable llamado NPM y su registro npmjs.org que es fácil de usar y publicar. Todo se administra a través del package.json archivo y versionado localmente, a menos que estemos instalando una herramienta CLI con el -g opción.

Tanto PHP como Node.js son lenguajes funcionales con una adición relativamente posterior de OOP a PHP.

Ecosistema

PHP

Esta es probablemente una de las áreas más importantes en las que PHP aún supera a Node.js. Hay increíbles aplicaciones de código abierto, por ejemplo, WordPress, toneladas de scripts gratuitos, herramientas y libros de calidad.

Node.js

Node.js está creciendo más rápido que cualquier otra plataforma/lenguaje. Esto se debe principalmente a la filosofía de mantener los módulos al mínimo y realizar solo un pequeño conjunto de tareas. Otros factores pueden incluir cosas como:

  • La enorme popularidad de JavaScript front-end entre los desarrolladores web
  • Existencia de las especificaciones y abundancia de recursos y gurús de JavaScript (como Doug Crockford) acumulados durante los muchos años de existencia del lenguaje
  • Comunidad colaborativa de código abierto de GitHub basada en un impresionante sistema de control de versiones distribuidas que no existía antes
  • Facilidad de uso de NPM, por ejemplo, para publicar un módulo de NPM, ejecute $ npm publish

Como resultado, algunas personas predicen que Node.js superará a otros idiomas en el número absoluto de contribuciones.

Marcos

Es importante tener herramientas completas y bibliotecas comprobadas a nuestra disposición.

PHP

Me vienen a la mente CakePHP y Zend, y para más opciones hay una lista extensa.

Node.js

El campo de juego está relativamente nivelado, siendo Express.js la opción más popular, y los frameworks MVC de pila completa Meteor y Derby muestran el camino hacia el futuro.

Aplicaciones en tiempo real

PHP

Para PHP, todavía hay Elephant.io dependiente de Node.js y algunos otros enfoques. El problema con PHP nativo y websockets es que Apache e ISS, donde PHP generalmente se ejecuta como un módulo, en realidad no se crearon teniendo en cuenta la conexión persistente. Por lo tanto, los desarrolladores deben usar procesos independientes como:Apache WebSocket o Ratchet.

Node.js

La creación de aplicaciones en tiempo real es muy sencilla con la pila Node.js de la biblioteca Socket.IO, el marco Express.js y el motor de plantillas reactivas Handlebars. En los proyectos Meteor y Derby, la creación de aplicaciones en tiempo real se lleva un paso más allá al combinar bases de código de front-end y back-end con la capa de persistencia que reduce la complejidad y acelera el desarrollo de manera espectacular.

Aplicaciones de base de datos

PHP

PHP tiene una larga y fructífera historia con bases de datos tradicionales/relacionales como MySQL, de ahí el nombre de la pila LAMP:Linux, Apache, MySQL y PHP.

Node.js

Node.js es natural con bases de datos NoSQL como MongoDB.

Los rendimientos de las bases de datos son algo comparables entre sí según los casos de uso según los artículos de referencia de rendimiento MySql vs MongoDB (MySQL), Prueba simple:MongoDB vs MySQL (MongoDB) y MongoDb vs MySql – Fight!!! (MongoDB). Sin embargo, MongoDB es superior para bases de datos distribuidas y es altamente escalable. La ventaja añadida es que sin un esquema fijo, las bases de datos NoSQL son perfectas para la informática en la nube, la creación de prototipos y proyectos ágiles.

Aplicaciones de servicios de terceros

PHP

Como es el caso con muchos lenguajes tradicionales, el flujo de PHP está bloqueado hasta que el servidor remoto responde, de ahí la necesidad de subprocesos múltiples.

Nota :Algunos lenguajes brindan esta característica cuando se usan bibliotecas/marcos especiales como EventMachine para Ruby o Twisted para Python. Sin embargo, son muy complejos y no se construyeron desde cero con la plataforma.

Node.js

Por el contrario, debido a una E/S sin bloqueo, Node.js puede manejar múltiples solicitudes y hacer múltiples solicitudes como cliente a servicios de terceros (por ejemplo, Twitter, Amazon) con solo un hilo de ejecución.

Servidores web

PHP

Desde PHP 5.4 y superior, hay un servidor de desarrollo integrado con el que podemos empezar:

$ php -S localhost:8000

Asumiendo que tenemos index.php en esa carpeta:

<?php
  echo 'Hello World';
?>

Para las versiones anteriores a la 5.4, existen herramientas "todo en uno" como MAMP y XAMPP.

En cuanto al entorno de producción, PHP no se puede ejecutar solo. Una de las tecnologías más populares utilizadas con PHP son Apache y nginx, donde PHP es solo un módulo del servidor web Apache. Mi experiencia personal con Apache es que tiene una curva de aprendizaje pronunciada y, si bien es muy configurable, por defecto esas configuraciones son propensas a filtraciones de seguridad.

Node.js

Node.js se creó desde cero para las aplicaciones de red y hay un conjunto de módulos principales para escribir servidores web.

Para iniciar un servidor Node.js:

$ node .

Asumiendo que nuestro archivo index.js en esta carpeta tiene:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

En producción, Node.js se puede ejecutar en SmartOS o Linux (como Ubuntu) como un servicio.

Nota :Los subprocesos múltiples son absolutamente posibles en Node.js con clústeres y/o módulos externos.

Alojamiento

PHP

PHP debe su popularidad principalmente a la facilidad y el bajo costo de las soluciones de alojamiento compartido que se ofrecen. Es cierto que es difícil encontrar uno sin la pila LAMP. Esta mercantilización a veces conduce a fallas de seguridad y a un tiempo de inactividad menos que aceptable debido a que los proveedores de alojamiento venden en exceso y otros consumidores usan código malicioso.

La plataforma como servicio es una mejor alternativa y se encuentra en algún lugar entre el servidor dedicado completo y el alojamiento compartido. La mayoría de los proveedores de PaaS son compatibles con PHP desde el principio.

Node.js

Node.js funciona muy bien en PaaSs, con Heroku y Nodjitsu liderando la lista. Además, la empresa de infraestructura en la nube Joyent (mantenedora de Node.js), desarrolló un potente sistema operativo SmartOS que permite ráfagas de rendimiento, implementación sencilla y depuración de DTrace.

Rendimiento

No hace falta decir que el rendimiento es importante. Este recurso muestra diferentes pruebas comparativas:¿Qué programas son más rápidos?.

PHP

PHP es relativamente rápido, pero debido a su cuello de botella en el sistema de archivos, la base de datos y las solicitudes de terceros, falla estrepitosamente en comparación con Node.js y su superrápido motor Goolge Chrome V8.

Por ejemplo, cuando Facebook alcanzó sus límites de escalabilidad con PHP, escribieron una biblioteca C++ extremadamente rápida y una máquina virtual a la que llamaron HipHop VM, pero conservaron la API de PHP.

Node.js

Node.js es extremadamente rápido debido a su mecanismo de E/S sin bloqueo y a la tecnología del motor Google Chrome V8. Incluso escuché que Joyent comenzó a reescribir algunos de sus módulos C++ en Node.js.

Conclusión

PHP fue una tecnología sobresaliente en sus días. Su éxito y popularidad provinieron de:

  • Su facilidad de aprendizaje y uso
  • alojamiento económico y sencillo en su mayoría compartido LAMP
  • Abundancia de secuencias de comandos, aplicaciones y bibliotecas de código abierto

Al mismo tiempo, estas mismas cosas ahora conducían a su anochecer. Las contribuciones al núcleo de los programadores principiantes metamorfosearon la API de manera inconsistente, mientras que la falta de OOP/clases y sistemas de administración de módulos inhibió el crecimiento de la comunidad de código abierto. Ausencia de un marco líder (Ruby on Rails viene a la mente como un ejemplo de dominio único) o un paradigma que también ayudó a producir una gran cantidad de código incorrecto que dependía en gran medida de la combinación de código PHP y HTML sin ningún tipo de MVC. Por otro lado, hay muchos buenos productos e infraestructura para PHP que están aquí para quedarse.

Node.js es relativamente joven con solo tres años desde su primera confirmación, pero ya es la plataforma de más rápido crecimiento por el ritmo de las contribuciones (el número absoluto superará a otros idiomas en unos pocos años). El hecho de que el lenguaje JavaScript sea el lenguaje más popular del mundo y tenga, por supuesto, la mayor internación en tiempo de ejecución atribuida a eso. Muchas herramientas se migran a Node.js con poca o ninguna modificación del entorno del navegador. Además, los grandes libros sobre los fundamentos de JavaScript (por ejemplo, JavaScript:The Good Parts y Eloquent JavaScript) experimentaron un aumento en la popularidad nuevamente.

Node.js es muy eficiente y excelente para crear sistemas escalables y orientados a NoSQL en tiempo real.

Descargo de responsabilidad

Trabajé con muchas tecnologías, incluidas Ruby on Rails, Python, Java/J2EE, VB, ASP, Perl y, por supuesto, PHP. Uno de mis proyectos PHP más complejos fue openList.co, que implicó el uso del patrón MVC con motores de plantilla, clases, capa de abstracción de base de datos y .htaccess cambio de ruta Sin embargo, mi enfoque durante los últimos dos años se ha dedicado únicamente a Node.js y los marcos de JavaScript front-end como Backbone.js. Así que mi opinión puede estar sesgada, comente su experiencia con proyectos reales tanto en PHP como en Node.js.

Si desea obtener más información sobre Node.js, eche un vistazo a mi libro artesanal Rapid Prototyping with JS:Agile JavaScript Development, el programa Node de capacitación en línea premium (enlace de Udemy) y el asombroso curso intensivo de codificación de tiempo completo en HackReactor.