WebAssembly PHP
O WordPress Playground constrói o interpretador PHP para WebAssembly usando Emscripten e um pipeline dedicado.
Construir PHP para WebAssembly é muito similar a construir PHP vanilla. A build wasm exigiu ajustar uma assinatura de função aqui, forçar uma variável de configuração ali, e aplicar alguns pequenos patches, mas há relativamente poucos ajustes envolvidos.
No entanto, builds PHP vanilla não são muito úteis no navegador. Como um software de servidor, o PHP não tem uma API JavaScript para passar o corpo da requisição, fazer upload de arquivos, ou popular o stream php://stdin
. O WordPress Playground teve que construir uma do zero. O binário WebAssembly vem com um módulo de API PHP dedicado escrito em C e uma classe PHP JavaScript que expõe métodos como writeFile() ou run().
Como cada versão do PHP é apenas um arquivo .wasm estático, o seletor de versão do PHP é na verdade bem simples. Ele simplesmente diz ao navegador para baixar, por exemplo, php_7_3.wasm
em vez de, digamos, php_8_2.wasm
.
O suporte de rede varia entre plataformas
Quando se trata de rede, os programas WebAssembly são limitados a chamar APIs JavaScript. É um recurso de segurança, mas também apresenta um desafio. Como você suporta código de rede síncrono de baixo nível usado pelo PHP com as APIs assíncronas de alto nível disponíveis em JavaScript?
No Node.js, a resposta envolve um proxy de WebSocket para socket TCP, Asyncify, e patchear internos profundos do PHP como php_select. É complexo, mas há uma recompensa. A build do PHP direcionada ao Node.js pode requisitar APIs web, instalar pacotes do composer, e até mesmo conectar a um servidor MySQL.
No navegador, a rede é suportada de duas maneiras:
- Um transporte rápido para
wp_safe_remote_get
para traduzi-los em chamadasfetch()
. - Um transporte mais lento para todas as outras chamadas de rede que analisa a transmissão TLS iniciada pelo PHP e a traduz para uma chamada
fetch()
.