Introduction
Phasis est un moteur JavaScript pur en PHP. Il analyse lexicalement, analyse et exécute ECMAScript dans le processus hôte PHP — sans exec('node …'), sans FFI et sans extension binaire personnalisée. Il nécessite trois extensions standard PHP : ext-mbstring, ext-bcmath et ext-curl (le transport fetch() par défaut). ext-intl et ext-openssl sont facultatives. Consultez Prise en main pour les compilations qui omettent bcmath.
- Intégrable — ajoutez un moteur d'exécution JS à toute application PHP, tout framework ou outil CLI avec la classe
Phasis\Engine. - Conforme aux spécifications — réussit la suite officielle test262 à 100 %, dans toutes les catégories, sans exception.
- API Web — Web Platform Pack complet (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), Fetch Pack complet (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, WHATWG Streams complets, navigator), plus
crypto+SubtleCrypto,WebSocket,XMLHttpRequestet une véritable boucle d'événements. 100 % des Web Platform Tests importés réussissent. - Fonctionnalités modernes — fonctions fléchées, classes, async/await, Promises, générateurs, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, prise en charge complète des modules.
- Interopérabilité PHP↔JS — transmettez des scalaires et tableaux PHP à JS (les tableaux sont copiés), liez des fermetures PHP comme fonctions JS et appelez des fonctions JS depuis PHP. Les objets PHP ne peuvent pas encore être partagés avec JS ; voir Objets partagés.
Pourquoi Phasis existe
Les applications PHP qui doivent exécuter du JavaScript fourni par l'utilisateur — moteurs de templates, adaptateurs SSR frontend, règles de validation de données, environnements de contenu isolés, lanceurs de tests headless — font généralement appel à Node.js ou renoncent à cette fonctionnalité. Dans les deux cas, la complexité opérationnelle augmente : un second moteur d'exécution, une frontière de sérialisation, des flux de sous-processus en réseau et un déploiement compliqué sur un hébergement partagé.
Phasis comble cette lacune. Votre code PHP peut analyser lexicalement, analyser et exécuter JavaScript avec seulement PHP 8.2+ et mbstring, bcmath et curl. Le moteur est fourni sous forme de package Composer et expose une petite surface API unique.
Fonctionnalités
- Implémente la bibliothèque standard ECMAScript complète :
Array,String,Object,Math,JSON,Date,RegExp,Map,Set,Promise,Proxy,Reflect,Symbol,BigInt,TypedArray,Temporal,Intl, générateurs, itérateurs asynchrones, modules. - Fournit les API Web Platform que les bibliothèques JS du monde réel vérifient au préalable :
URL,URLSearchParams,TextEncoder/TextDecoder,atob/btoa,structuredClone,performance,DOMException. Consultez API Web pour la surface complète. - Fournit
fetchavec toute la famille Fetch —Request,Response,Headers, consommateurs de corps,AbortController/AbortSignal,Blob,File,FormData,EventTarget/Eventet WHATWG Streams complets (ReadableStream,WritableStream,TransformStream, BYOB, stratégies de mise en file). Une véritable HTTP fonctionne immédiatement viaext-curlde PHP. - Fournit
cryptoetSubtleCryptocomplet (famille SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2),WebSocket(RFC 6455 et transport interchangeable) etXMLHttpRequest(superposé au même transport fetch). - Fournit une véritable boucle d'événements :
setTimeout,setInterval,clearTimeout,clearInterval,queueMicrotask, ainsi queAsyncContextStage 3 pour la propagation des valeurs entre les opérations asynchrones. - Prend en charge la syntaxe moderne — déstructuration, spread/rest, propriétés calculées, chaînage optionnel, coalescence des valeurs nulles, littéraux de template, templates balisés, classes (avec champs privés, blocs statiques, décorateurs), await au niveau supérieur.
- Convertit les valeurs à la frontière PHP↔JS. Les scalaires et tableaux sont copiés, les appelables PHP deviennent des fonctions JS et les résultats JS reviennent sous forme de scalaires et tableaux PHP. Consultez Conversion des valeurs pour connaître les règles précises.
- Fonctionne sous le contrôle de l'hôte. L'hôte gère le transport
fetchet les hooks de politique, la boucle d'événements s'exécute en temps virtuel et une limite fixe de pile d'appels arrête la récursion incontrôlée. Une limite du nombre d'itérations de boucle existe, mais n'est pas encore appliquée aux boucles exécutées par la VM à bytecode ; il n'y a pas de limites de longueur de chaîne, de sortie ou de temps réel. Voir API : setLimit. - Est vérifié avec Node.js (V8). L'intégration continue exécute les suites de tests unitaires et oracle à chaque push sur
mainet à chaque pull request, ainsi que les Web Platform Tests et les suites de packages populaires lorsque le code source du moteur change ; la matrice test262 complète est exécutée à la main et son instantané est validé dansCOMPAT.md. Consultez Compatibilité.
Ce que ce n'est pas
Phasis n'est pas un compilateur JIT. C'est un interpréteur qui parcourt l'arbre, doté d'une VM à bytecode opportuniste. Pour les charges de travail limitées par la distribution, prévoyez un temps d'exécution d'environ 100× celui de V8. En contrepartie : aucune dépendance, PHP pur et exécution contrôlée par l'hôte — idéal pour intégrer JavaScript dans des applications PHP où la correction et l'isolation comptent davantage que le débit brut.
Par où commencer
- Prise en main — installez et lancez votre premier script.
- CLI —
bin/phasispour exécuter des fichiers, évaluer du code source et afficher l'AST. - API — intégrez
Phasis\Enginedans votre application PHP. - Interopérabilité — transmettez des valeurs et fonctions PHP à JavaScript.
- Compatibilité — couverture test262 et fonctionnalités prises en charge.
- Analyseur — analysez JavaScript en AST typé ou ESTree sans l'exécuter.
- Formateur — formatez JavaScript, JSON et CSS avec une mise en page compatible avec prettier.
- Avancé — architecture, VM à bytecode, benchmarks et modèle de tests oracle.