Pular para o conteúdo principal

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.wasm e um ou mais carregadores JavaScript, dependendo da configuração.
  • Transforma a saída padrão php.js do 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 com PHP-. Por exemplo, 7.4.0 é válido porque a branch PHP-7.4.0 existe, mas apenas 7 é inválido porque não há branch PHP-7. As versões do PHP que sabemos que funcionam são 7.4.* e 8.0.*. Outras provavelmente também funcionam, mas não foram testadas.
  • EMSCRIPTEN_ENVIRONMENTweb ou node, padrão: web. A plataforma para a qual compilar. Ao compilar para web, dois carregadores JavaScript serão criados: php-web.js e php-webworker.js. Ao compilar para Node.js, apenas um carregador chamado php-node.js será criado.
  • WITH_LIBXMLyes ou no, padrão: no. Se deve compilar com libxml2 e as extensões PHP dom, xml, e simplexml (DOMDocument, SimpleXML, ..).
  • WITH_LIBZIPyes ou no, padrão: yes. Se deve compilar com zlib, libzip, e a extensão PHP zip (ZipArchive).
  • WITH_NODEFSyes ou no, 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.