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 comPHP-
. Por exemplo,7.4.0
é válido porque a branchPHP-7.4.0
existe, 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
–web
ounode
, padrão:web
. A plataforma para a qual compilar. Ao compilar paraweb
, dois carregadores JavaScript serão criados:php-web.js
ephp-webworker.js
. Ao compilar para Node.js, apenas um carregador chamadophp-node.js
será criado.WITH_LIBXML
–yes
ouno
, padrão:no
. Se deve compilar comlibxml2
e as extensões PHPdom
,xml
, esimplexml
(DOMDocument
,SimpleXML
, ..).WITH_LIBZIP
–yes
ouno
, padrão:yes
. Se deve compilar comzlib
,libzip
, e a extensão PHPzip
(ZipArchive
).WITH_NODEFS
–yes
ouno
, 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.