Compilando PHP
O pipeline de build está em um Dockerfile. Originalmente foi um fork de seanmorris/php-wasm
Em linhas gerais, esse Dockerfile:
- Instala todos os pacotes linux necessários (como
build-essential) - Baixa o PHP e as bibliotecas necessárias, por exemplo
sqlite3. - Aplica alguns patches.
- Compila tudo usando Emscripten, um substituto direto para o compilador C.
- Compila
php_wasm.c– uma API conveniente para JavaScript. - Produz um arquivo
php.wasme um ou mais carregadores JavaScript, dependendo da configuração. - Transforma a saída padrão
php.jsdo Emscripten em um módulo ESM com recursos adicionais.
Para descobrir mais sobre cada etapa, consulte diretamente o Dockerfile.
Compilando
Para compilar todas as versões do PHP, execute nx recompile-php:all php-wasm-web (ou php-wasm-node) na raiz do repositório. Você encontrará os arquivos de saída em packages/php-wasm/php-web/public. Para compilar uma versão específica, execute nx recompile-php:all php-wasm-node --PHP_VERSION=8.0 --WITH_JSPI=yes (e repita com --WITH_JSPI=no).
Extensões PHP
O PHP é compilado com várias extensões listadas no Dockerfile.
Algumas extensões, como zip, podem ser ligadas ou desligadas durante a compilação. Outras, como sqlite3, estão hardcoded.
Se você precisa desligar uma das extensões hardcoded, sinta-se à vontade para abrir uma issue neste repositório. Melhor ainda, este projeto precisa de contribuidores. Você é mais que bem-vindo para abrir um PR e criar a mudança que você precisa.
API C exposta ao JavaScript
A API C exposta ao JavaScript está no arquivo php_wasm.c. As funções mais importantes são:
void phpwasm_init()– Cria um novo contexto PHP e deve ser chamada antes de executar qualquer código PHP.int phpwasm_run(char *code)– Executa um script PHP e escreve a saída em /tmp/stdout e /tmp/stderr. Retorna o código de saída.void phpwasm_refresh()– Destrói o contexto PHP atual e inicia um novo. Chame-a após executar um script PHP e antes de executar outro.
Consulte a documentação inline em php_wasm.c para saber mais.
Configuração de build
A build é configurável atrav és do recurso --build-arg do Docker. Você pode configurá-las através do script build.js, apenas execute este comando para obter a mensagem de uso:
nx recompile-php php-wasm-web
Opções de build suportadas:
PHP_VERSION– A versão do PHP para compilar, padrão:8.0.24. Este valor deve apontar para uma branch existente do repositório https://github.com/php/php-src.git quando prefixado comPHP-. Por exemplo,7.4.0é válido porque a branchPHP-7.4.0existe, mas apenas7é inválido porque não há branchPHP-7. As versões do PHP que sabemos que funcionam são7.4.*e8.0.*. Outras provavelmente também funcionam, mas não foram testadas.EMSCRIPTEN_ENVIRONMENT–webounode, padrão:web. A plataforma para a qual compilar. Ao compilar paraweb, dois carregadores JavaScript serão criados:php-web.jsephp-webworker.js. Ao compilar para Node.js, apenas um carregador chamadophp-node.jsserá criado.WITH_LIBXML–yesouno, padrão:no. Se deve compilar comlibxml2e as extensões PHPdom,xml, esimplexml(DOMDocument,SimpleXML, ..).WITH_LIBZIP–yesouno, padrão:yes. Se deve compilar comzlib,libzip, e a extensão PHPzip(ZipArchive).WITH_NODEFS–yesouno, padrão:no. Se deve incluir a biblioteca JavaScript NODEFS do Emscripten. É útil para carregar arquivos e montar diretórios do sistema de arquivos local ao executar php.wasm do Node.js.