He visto muchas peticiones últimamente, sobre cómo ejecutar PHP en Node.js. Algunas peticiones han sido porque la gente no sabe cómo hacer las mismas cosas en Node.js que las que hacen fácilmente en PHP, y otras peticiones han sido porque necesitan trabajar junto con otros equipos que sólo programan en PHP.
En todos los casos he visto la respuesta, que no se puede hacer. Lo cual es objetivamente inexacto. Dado que se puede ejecutar PHP en la línea de comandos, y Node.js puede ejecutar fácilmente programas a través de la línea de comandos, es muy posible.
¿Cuáles son los beneficios?
- Fácil colaboración entre equipos con diferentes conocimientos
- PHP es realmente bueno para lanzar scripts rápidos
- No es necesario ejecutar varios servidores si se necesita tanto Node.js como PHP
¿Cuáles son los inconvenientes?
- Más posibilidades de fallos de seguridad
- No tiene muy buen rendimiento
- Es fácil pegarse un tiro en el pie
- Si ya conoces PHP y estás aprendiendo node, probablemente tendrás tendencia a programar las cosas «difíciles» en PHP, con lo que no aprenderás la forma de hacer de node.
Por supuesto, probablemente hay más inconvenientes y beneficios, pero vamos a escuchar sobre ellos en los comentarios 😉
Básicamente este artículo es un paso 1. No es una solución completa. Es sólo para mostrar que se puede hacer y cómo.
Comencemos
Omitiré decirte cómo instalar Node. Hay un montón de tutoriales sobre eso.
Lo primero que tienes que hacer es instalar PHP (si no lo has hecho ya).
Sólo tienes que seguir las instrucciones estándar en http://php.net/manual/en/install.php y deberías estar bien.
Además, en este ejemplo uso Express. No tienes que usar Express para ejecutar PHP en Node.js, pero vamos con ello por ahora.
npm install express – save
Ahora echemos un vistazo a webserver.js que será el primer archivo de nuestro proyecto.
Como puedes ver, hemos hecho un servidor web bastante simple. Si has trabajado con Express antes, ya sabes lo que hace la mayor parte del ejemplo.
Lo que no has visto antes es el requerimiento del «execphp.js» que es donde haremos el parsing de PHP.
También estamos definiendo una ruta que recibe todas las peticiones *.php, y las ejecuta a través de la clase execPHP.
Note: Change the variable execPHP.phpFolder to wherever you want to put your own php files.
Ahora echemos un vistazo a «execphp.js» que será el segundo archivo de nuestro proyecto.
Como puedes ver, este archivo contiene una clase, ExecPHP, con un único método, parseFile. Este método básicamente toma un archivo, ejecuta la línea de comandos PHP y llama al callback pasado con el resultado.
Note: Change the variable this.phpPath to wherever you have PHP installed.
Ahora hagamos un archivo PHP simple. Lo he llamado «test.php» y lo he puesto en la carpeta «phpfiles» (la que has editado en webserver.js).
Como puedes ver este es un ejemplo muy simple.
Ahora vamos a ejecutar el webserver.
node – use_strict webserver.js
Y visitemos http://localhost:3000/test.phpen nuestro navegador.
Woohoo, con suerte, deberías obtener el resultado del archivo php.
Hello worldA simple counter:
0
1
2
3
4
5
6
7
8
9
Algunos problemas más, los dejaremos como ejercicios para el lector.
Si sólo usas este script sin editarlo, rápidamente te encontrarás con limitaciones. Por ejemplo $_GET, $_REQUEST, etc. no está configurado. Si quieres usar esto, probablemente tendrías que hacer que Node.js escriba algunas variables de configuración de PHP falsas a lo que quieras que sean, y procesar eso antes del archivo en sí.
Generalmente buenas ideas para el desarrollo futuro:
- Hacer del execPHP un express-middleware en sí mismo.
- Santificar el nombre del archivo para asegurarse de que la gente no está escribiendo cosas como ../../../evilfile.php para acceder a cosas que no deberían.
- Manejar $_GET, $_SERVER, $_REQUEST, .etc. automáticamente en la clase execPHP, para que estén disponibles en los scripts php.
Escrito por Martin Mouritzen.