Saltar al contenido

Introducción

Phasis es un motor JavaScript puro de PHP. Analiza léxicamente, analiza y ejecuta ECMAScript en el proceso anfitrión de PHP, sin exec('node …'), sin FFI y sin una extensión binaria personalizada. Requiere tres extensiones estándar de PHP: ext-mbstring, ext-bcmath y ext-curl (el transporte predeterminado de fetch()). ext-intl y ext-openssl son opcionales. Consulta Primeros pasos para compilaciones que omiten bcmath.

  • Integrable — incorpora un motor de JS en cualquier aplicación PHP, framework o herramienta CLI mediante la clase Phasis\Engine.
  • Conforme a la especificación — supera el conjunto oficial de pruebas test262 al 100 %, en todas las categorías y sin omisiones.
  • API web — Web Platform Pack completo (URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), Fetch Pack completo (fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, WHATWG Streams completos, navigator), además de crypto + SubtleCrypto, WebSocket, XMLHttpRequest y un bucle de eventos real. Supera el 100 % de las Web Platform Tests importadas.
  • Entorno moderno — funciones flecha, clases, async/await, Promises, generadores, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays y compatibilidad completa con módulos.
  • Interoperabilidad entre PHP y JS — pasa escalares y matrices PHP a JS (las matrices se copian), vincula clausuras PHP como funciones JS y llama funciones JS desde PHP. Los objetos PHP aún no se pueden compartir con JS; consulta Objetos compartidos.

Por qué existe Phasis

Las aplicaciones de PHP que necesitan ejecutar JavaScript proporcionado por el usuario —motores de plantillas, adaptadores para SSR del frontend, reglas de validación de datos, entornos aislados para contenido y ejecutores de pruebas sin interfaz gráfica— suelen recurrir a Node.js o prescindir de esta función. Ambas opciones añaden complejidad operativa: un segundo entorno de ejecución, un límite de serialización, una red de canales entre subprocesos y dificultades para desplegarlo de forma segura en alojamiento compartido.

Phasis resuelve ese problema. Tu código PHP puede analizar léxicamente, analizar y ejecutar JavaScript usando solo PHP 8.2+ con mbstring, bcmath y curl. El motor se distribuye como paquete Composer y ofrece una API sencilla y compacta.

Qué hace

  • Implementa toda la biblioteca estándar de ECMAScript: Array, String, Object, Math, JSON, Date, RegExp, Map, Set, Promise, Proxy, Reflect, Symbol, BigInt, TypedArray, Temporal, Intl, generadores, iteradores asíncronos y módulos.
  • Incluye las API de Web Platform que las bibliotecas reales de JS comprueban de antemano: URL, URLSearchParams, TextEncoder/TextDecoder, atob/btoa, structuredClone, performance, DOMException. Consulta API web para ver todas las funciones disponibles.
  • Incluye fetch con toda la familia Fetch: Request, Response, Headers, consumidores de cuerpos, AbortController/AbortSignal, Blob, File, FormData, EventTarget/Event y WHATWG Streams completos (ReadableStream, WritableStream, TransformStream, BYOB y estrategias de encolado). El HTTP real funciona de inmediato mediante PHP ext-curl.
  • Incluye crypto y SubtleCrypto completo (familia SHA, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2), WebSocket (RFC 6455 y transporte intercambiable) y XMLHttpRequest (basado en el mismo transporte Fetch).
  • Incluye un bucle de eventos real: setTimeout, setInterval, clearTimeout, clearInterval, queueMicrotask y Stage-3 AsyncContext para propagar valores entre límites asíncronos.
  • Admite sintaxis moderna: desestructuración, spread/rest, propiedades calculadas, encadenamiento opcional, coalescencia de nulos, literales de plantilla, plantillas etiquetadas, clases (con campos privados, bloques estáticos y decoradores) y await de nivel superior.
  • Convierte valores entre los límites de PHP y JS. Los escalares y las matrices se copian al pasar, las funciones invocables de PHP se convierten en funciones JS, y los resultados de JS vuelven como escalares y matrices PHP. Consulta Conversión de valores para conocer las reglas exactas.
  • Se ejecuta bajo el control del anfitrión. El anfitrión controla el transporte fetch y los ganchos de políticas; el bucle de eventos funciona con tiempo virtual y un límite fijo de pila de llamadas detiene la recursión descontrolada. Hay un límite de iteraciones de bucle, pero aún no se aplica a los bucles ejecutados por la VM de bytecode; tampoco hay límites de longitud de cadenas, salida o tiempo real. Consulta API: setLimit.
  • Se verifica con Node.js (V8). CI ejecuta los conjuntos de pruebas unitarias y de referencia en cada inserción en main y cada solicitud de incorporación de cambios, además de Web Platform Tests y conjuntos de pruebas de paquetes populares cuando cambia el código fuente del motor. Toda la matriz de test262 se ejecuta manualmente y su instantánea se incorpora a COMPAT.md. Consulta Compatibilidad.

Qué no es

Phasis no es un compilador JIT, sino un intérprete que recorre el árbol con una VM de bytecode oportunista. En cargas limitadas por el despacho, su tiempo de ejecución es aproximadamente 100 veces el de V8. A cambio, ofrece cero dependencias, PHP puro y ejecución controlada por el anfitrión; es ideal para integrar JavaScript en aplicaciones PHP donde la corrección y el aislamiento importan más que el rendimiento bruto.

Por dónde empezar

  • Primeros pasos — instala y ejecuta tu primer script.
  • CLI — bin/phasis para ejecutar archivos, evaluar código fuente y volcar el AST.
  • API — integra Phasis\Engine en tu aplicación PHP.
  • Interoperabilidad — pasa valores y funciones invocables de PHP a JavaScript.
  • Compatibilidad — cobertura de test262 y funciones compatibles.
  • Analizador — analiza JavaScript como AST tipado o ESTree sin ejecutarlo.
  • Formateador — formatea JavaScript, JSON y CSS con una disposición compatible con prettier.
  • Avanzado — arquitectura, VM de bytecode, pruebas de rendimiento y modelo de pruebas de referencia.