- Un module qui permet d’exécuter une application PHP dans le même processus qu’une application Node.js, rendant possible une communication entre Node.js et PHP sans connexion réseau
- Cela facilite la communication bidirectionnelle, les architectures hybrides, la réutilisation des actifs PHP legacy et les migrations
- Cela permet de mettre en œuvre diverses architectures d’applications web hybrides, comme l’intégration de WordPress avec un frontend Next.js
- Prend en charge à la fois le mode asynchrone (
handleRequest) et le mode synchrone (handleRequestSync) (le mode synchrone bloque le thread Node.js)
- Prend en charge en priorité les environnements x64 Linux et x64/arm64 macOS, avec installation requise de certaines bibliothèques système liées à PHP
- Les objets HTTP comme Request/Response/Headers peuvent être créés et manipulés directement dans Node.js pour une intégration naturelle avec l’application PHP
- Utilisation
// Après avoir créé une instance de `Php`, traiter une requête PHP avec `handleRequest()`
// Utiliser les objets `Request` et `Response` pour manipuler directement les données de requête/réponse HTTP
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())
- Exemples d’usage
- Intégrer un CMS PHP (comme WordPress) à un frontend Node.js (comme Next.js), ou migrer progressivement une application PHP legacy vers Node.js
- Convient à la communication en mémoire entre les deux environnements sans surcharge réseau, ainsi qu’aux API gateways, au SSR et à l’intégration de backends personnalisés
- APIs
- Classe
Php
new Php(config) : peut inclure des paramètres comme docroot
php.handleRequest(request) : traitement asynchrone d’une requête (retourne une Promise)
php.handleRequestSync(request) : traitement synchrone (bloque le thread)
- Classe
Request
- Permet de définir la méthode HTTP, l’URL, les headers et le body
- Accès direct à chaque propriété possible (ex. :
request.method, request.body)
- Classe
Response
- Contient des propriétés comme
status, headers, body, log, etc.
- Peut être créée manuellement (utile pour les tests et la gestion des erreurs)
- Classe
Headers
- Prend en charge diverses méthodes de gestion des headers HTTP comme
set, add, get, getAll, has, delete
- Permet un traitement groupé des headers via les API d’itérateur comme
entries, keys, values, forEach
3 commentaires
Ce n’est pas une option très séduisante...
PHP consomme déjà pas mal de mémoire par défaut, et son coût d’initialisation est aussi assez élevé, donc il faut absolument une gestion adaptée. Dans le même processus que Node, surtout avec une structure comme l’implémentation actuelle où PHP est embarqué en bloc dans un module natif, la charge me paraît devenir assez importante.
À ma place, je laisserais simplement
php-fpmdans un processus séparé, et j’écrirais plutôt un client FastCGI en JS pour le gérer.Cette bibliothèque serait-elle bien compatible avec le runtime Node.js d’AWS Lambda ?
Si oui, on pourrait peut-être au final faire tourner PHP en mode serverless sur AWS Lambda.
S’il n’y a pas de raison de l’utiliser en parallèle avec Node.js, vous pouvez aussi déployer un runtime PHP sur Lambda : https://bref.sh