BookinglyTech News
Software

PHP 8.4.25 corre nativo en ESP32: el intérprete completo, sin sistema operativo

El proyecto php-baremetal lanza la v1.0.0 de su port: compila el Zend engine sin modificar para ESP32-S3 y P4. Ejecuta el mismo index.php que en un servidor.

3 min de lecturaDev.to0 vistas

Si escribes index.php, ya sabes programar un microcontrolador. No es una metáfora: el proyecto php-baremetal acaba de publicar la v1.0.0 de su intérprete PHP para ESP32. Toman el Zend engine sin tocar, el mismo que se descarga de php.net, lo cruzan con el compilador del chip (riscv32-esp-elf para el P4, xtensa-esp32s3-elf para el S3) y lo ejecutan directamente sobre el hardware: sin sistema operativo, sin transpilador, sin recortes. El mismo script, los mismos opcodes, el mismo array_map, preg_match y json_encode. Porque es el mismo código C, compilado para la CPU del chip.

El motor completo viaja dentro del firmware: lexer, parser, compilador de opcodes, VM, ejecutor, recolector de basura y el modelo de objetos/excepciones. Un echo 1 + 1; recorre el mismo camino que en un servidor: fuente → tokens → AST → opcodes → ejecución. No hay emulación: los opcodes se ejecutan en la CPU del ESP32. La integración usa el SAPI embed oficial, la misma interfaz que cualquier programa en C usa para alojar PHP. La librería estándar viene incluida: ext/standard, PCRE, JSON, hash, SPL, reflexión y CSPRNG. Extensiones opcionales se añaden por proyecto.

Las pruebas se hicieron en una placa ESP32-S3-Zero "Super Mini" (2 MB PSRAM a 80 MHz, CPU a 160 MHz) con PHP 8.4.25 y sin OPcache (aunque el propio OPcache está portado, sin JIT, en modo estático). El repositorio incluye un benchmark que compara el bucle GPIO: escribir 100.000 veces en el GPIO 2 tarda 3229 ns por escritura en PHP (unas 309.687 escrituras por segundo), nueve veces más lento que el C nativo (357 ns/escritura, 2,8 millones por segundo). El espacio libre tras compilar un script de 167 líneas era de 22,4 KB de PSRAM.

El clásico LED parpadeante en PHP

El ejemplo de "hola mundo" embebido es encender un LED. La función setup() corre una vez y loop($tick) se llama continuamente (estilo Arduino, el bucle vive en C para que el watchdog no salte). El código usa una extensión nativa para GPIO:gpio_mode, gpio_write, gpio_read y delay. echo sale por la consola serie. Tres líneas de PHP moviendo un pin físico.

Servidor web y frameworks en el chip

En placas con red, el firmware puede levantar un servidor HTTP y pasar cada petición a una ejecución fresca de PHP, como haría Apache o PHP-FPM. Se rellenan $_SERVER, $_GET, $_POST, cookies y sesiones por petición, y lo que el script imprime es el cuerpo de la respuesta. Con el ESP32-P4 (32 MB PSRAM), cargan Laravel y Symfony sin recortes. Y como cada ESP32-S3 lleva WiFi en el silicio, la placa puede crear su propia red y servir una página sin router ni cable. Uno de los ejemplos, wifi-ap-s3-rgb-manage, arranca un punto de acceso WiFi y sirve una página PHP que controla el LED RGB desde el móvil. Todo en PHP, sin nube ni broker MQTT.

Qué necesitas para que cualquiera de esto funcione

Dos requisitos de hardware: PSRAM externa (el heap del runtime se mide en megabytes) y al menos 8 MB de flash (el firmware ocupa unos 3 MB). La arquitectura del núcleo da igual: el VM se compila tanto para Xtensa como para RISC-V. La familia soportada incluye ESP32-S3 (Xtensa) y ESP32-P4 (RISC-V de doble núcleo). Para grabar el firmware usan una herramienta llamada phpflash. Los proyectos se configuran con un .env que se hornea en el firmware.

El proyecto es abierto y está en GitHub; la documentación explica las diferencias entre S3 y P4. Es un avance curioso para quien venga del desarrollo web: el mismo intérprete que corre en tu servidor ahora también controla pines. Pero ojo: no esperes rendimiento de servidor. Es una opción más para prototipos o proyectos donde el hardware y la lógica de negocio comparten el mismo lenguaje. La licencia y el mantenimiento a largo plazo son cosas que aún están por ver.