Integração de WebAssembly e PHP: guia prático

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course
Here is the translated HTML content from Russian to Portuguese (Português), with all HTML tags preserved and only the text content translated. ```html

Introdução: por que o PHP precisa do WebAssembly?



WebAssembly (Wasm) é um formato binário de instruções de baixo nível que permite executar código em linguagens como C, C++, Rust e outras com velocidade próxima à nativa. No contexto do PHP, a integração com WebAssembly abre novas possibilidades: desde a execução de tarefas computacionalmente complexas no lado do servidor até a portabilidade de bibliotecas existentes sem reescrevê-las em PHP.



PHP é uma linguagem de script que tradicionalmente fica atrás em desempenho em comparação com linguagens compiladas. No entanto, com o WebAssembly, você pode:



  • Executar algoritmos críticos em termos de velocidade (processamento de imagens, criptografia, parsing) em módulos Wasm.
  • Usar bibliotecas C/C++ existentes em aplicações PHP.
  • Reduzir a carga no servidor por meio de código binário otimizado.


Neste artigo, veremos como integrar WebAssembly com PHP na prática: desde o carregamento do módulo até a transferência de dados e o processamento dos resultados.



1. Fundamentos do trabalho com WebAssembly em PHP



Para trabalhar com Wasm em PHP, utiliza-se a extensão wasm (ou wasmer para PHP). A instalação é feita via Composer:



composer require wasm/wasm


Após a instalação, você pode carregar e executar módulos Wasm. Vejamos um exemplo simples: um módulo em C que soma dois números.



Primeiro, compilamos o código C para Wasm:



// sum.cint add(int a, int b) {    return a + b;}


Compilação (requer Emscripten ou wasi-sdk):



emcc sum.c -o sum.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add"]'


Agora carregamos o módulo em PHP e chamamos a função:



<?phpuse Wasm\\Instance;use Wasm\\Module;

// Carregamos o arquivo binário$wasmBytes = file_get_contents('sum.wasm');$module = new Module($wasmBytes);$instance = new Instance($module);

// Chamamos a função exportada add$result = $instance->add(10, 20);echo "Resultado: " . $result; // 30?>


O código é simples e intuitivo: criamos uma instância do módulo e chamamos suas funções como métodos de um objeto PHP. É importante lembrar que as funções Wasm trabalham com tipos primitivos (int, float), portanto, para estruturas de dados complexas, será necessário processamento adicional.



2. Transferência de dados complexos: strings e arrays



WebAssembly opera apenas com números. Para transferir strings ou arrays, é necessário alocar memória dentro do módulo Wasm e passar ponteiros. Vejamos um exemplo com processamento de string.



Criamos um módulo em C que converte uma string para maiúsculas:



// uppercase.c#include <string.h>#include <ctype.h>

void to_upper(char* str, int len) { for (int i = 0; i < len; i++) { str[i] = toupper(str[i]); }}


Compilamos com exportação das funções de gerenciamento de memória:



emcc uppercase.c -o uppercase.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_to_upper", "_malloc", "_free"]' -s ALLOW_MEMORY_GROWTH=1


Código PHP para chamada:



<?php$wasmBytes = file_get_contents('uppercase.wasm');$module = new Module($wasmBytes);$instance = new Instance($module);

$input = "hello webassembly";$len = strlen($input) + 1; // +1 para o terminador nulo

// Alocamos memória no módulo Wasm$ptr = $instance->malloc($len);// Escrevemos a string na memória do módulo$instance->memory->write($ptr, $input);

// Chamamos a função de conversão$instance->to_upper($ptr, $len);

// Lemos o resultado da memória$result = $instance->memory->read($ptr, $len);echo "Resultado: " . trim($result); // HELLO WEBASSEMBLY

// Liberamos a memória$instance->free($ptr);?>


Essa abordagem requer gerenciamento manual de memória, mas oferece controle total sobre os dados. Para simplificar, podem ser usadas bibliotecas wrapper, como wasm-php-bridge.



3. Process ```

Blogs

Book Recommendations