5 puntos por xguru 2025-05-31 | 3 comentarios | Compartir por WhatsApp
  • Un módulo que ejecuta aplicaciones PHP dentro de una aplicación Node.js en el mismo proceso, lo que permite la comunicación entre Node.js y PHP sin conexión de red
    • Facilita la comunicación bidireccional, las arquitecturas híbridas, el aprovechamiento de activos heredados en PHP y la migración
    • Con esto se pueden implementar diversas arquitecturas de aplicaciones web híbridas, como integrar WordPress con un frontend en Next.js
  • Soporta tanto el modo asíncrono (handleRequest) como el sincrónico (handleRequestSync) (el modo sincrónico bloquea el hilo de Node.js)
  • Da soporte prioritario a entornos x64 Linux y x64/arm64 macOS, y requiere la instalación de algunas bibliotecas del sistema relacionadas con PHP
  • Objetos HTTP como Request/Response/Headers pueden crearse y manipularse directamente desde Node.js, lo que permite una integración natural con aplicaciones PHP
  • Cómo usarlo
    // Crear una instancia de `Php` y procesar una solicitud PHP con `handleRequest()`  
    // Usar los objetos `Request` y `Response` para manejar directamente los datos HTTP de solicitud/respuesta  
    import { Php, Request } from '@platformatic/php-node'  
    
    const php = new Php()  
    const request = new Request({  
      url: 'http://example.com/foo/bar',  
      headers: { 'X-Test': ['Hello, from Node.js!'] }  
    })  
    const response = await php.handleRequest(request)  
    console.log(response.body.toString())  
    
  • Ejemplos de uso
    • Integrar un CMS basado en PHP (como WordPress) con un frontend en Node.js (como Next.js), o migrar gradualmente una app heredada en PHP hacia Node.js
    • Adecuado para implementar comunicación en memoria entre ambos entornos sin sobrecarga de red, así como para API gateways, SSR e integración con backends personalizados
  • APIs
    • Clase Php
      • new Php(config): puede incluir configuraciones como docroot
      • php.handleRequest(request): procesa solicitudes de forma asíncrona (devuelve una Promise)
      • php.handleRequestSync(request): procesamiento sincrónico (bloquea el hilo)
    • Clase Request
      • Permite definir method, url, headers y body HTTP
      • Se puede acceder directamente a cada propiedad (ej.: request.method, request.body)
    • Clase Response
      • Tiene propiedades como status, headers, body y log
      • Puede crearse manualmente (útil para pruebas y manejo de errores)
    • Clase Headers
      • Soporta varios métodos para gestionar encabezados HTTP, como set, add, get, getAll, has y delete
      • Permite procesar encabezados en lote con APIs iteradoras como entries, keys, values y forEach

3 comentarios

 
nemorize 2025-05-31

No parece una opción muy atractiva...

PHP de por sí consume bastante memoria, y el costo de inicialización también es bastante alto, así que requiere una gestión adecuada sí o sí. Dentro del mismo proceso que Node, especialmente con una estructura como la implementación actual, donde PHP está metido completo dentro de un módulo nativo, da la impresión de que la carga sería bastante grande.

Yo simplemente dejaría php-fpm como un proceso separado, y más bien escribiría el cliente FastCGI en JS para manejarlo así.

 
letaem77a 2025-05-31

¿Esta biblioteca será bien compatible con el runtime de Node.js de AWS Lambda?

Si lo fuera, parece que al final incluso se podría ejecutar PHP en AWS Lambda de forma serverless.

 
savvykang 2025-05-31

Si no hay una razón para usarlo en paralelo con Node.js, también pueden desplegar el runtime de PHP en Lambda: https://bref.sh