Intégration de WebAssembly et PHP : guide pratique

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi PHP a-t-il besoin de WebAssembly ?



WebAssembly (Wasm) est un format d'instructions binaires de bas niveau qui permet d'exécuter du code écrit en C, C++, Rust et d'autres langages à une vitesse proche du natif. Dans le contexte de PHP, l'intégration avec WebAssembly ouvre de nouvelles possibilités : de l'exécution de tâches computationnellement complexes côté serveur au portage de bibliothèques existantes sans les réécrire en PHP.



PHP est un langage de script qui traditionnellement est moins performant que les langages compilés. Cependant, avec WebAssembly, vous pouvez :



  • Exécuter des algorithmes critiques en termes de vitesse (traitement d'images, chiffrement, parsing) sur des modules Wasm.
  • Utiliser des bibliothèques C/C++ existantes dans des applications PHP.
  • Réduire la charge sur le serveur grâce à un code binaire optimisé.


Dans cet article, nous verrons comment intégrer WebAssembly avec PHP en pratique : du chargement du module à la transmission des données et au traitement des résultats.



1. Bases du travail avec WebAssembly en PHP



Pour travailler avec Wasm en PHP, on utilise l'extension wasm (ou wasmer pour PHP). L'installation se fait via Composer :



composer require wasm/wasm


Après l'installation, vous pouvez charger et exécuter des modules Wasm. Regardons un exemple très simple : un module en C qui additionne deux nombres.



Commençons par compiler le code C en Wasm :



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


Compilation (nécessite Emscripten ou wasi-sdk) :



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


Chargeons maintenant le module en PHP et appelons la fonction :



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

// Chargement du fichier binaire$wasmBytes = file_get_contents('sum.wasm');$module = new Module($wasmBytes);$instance = new Instance($module);

// Appel de la fonction exportée add$result = $instance->add(10, 20);echo "Résultat : " . $result; // 30?>


Le code est simple et intuitif : nous créons une instance du module et appelons ses fonctions comme des méthodes d'un objet PHP. Il est important de se rappeler que les fonctions Wasm travaillent avec des types primitifs (int, float), donc pour les structures de données complexes, un traitement supplémentaire est nécessaire.



2. Transmission de données complexes : chaînes et tableaux



WebAssembly ne manipule que des nombres. Pour transmettre des chaînes ou des tableaux, il faut allouer de la mémoire à l'intérieur du module Wasm et passer des pointeurs. Regardons un exemple avec le traitement d'une chaîne.



Créons un module en C qui convertit une chaîne en majuscules :



// 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]); }}


Compilons en exportant les fonctions de gestion de la mémoire :



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


Code PHP pour l'appel :



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

$input = "hello webassembly";$len = strlen($input) + 1; // +1 pour le caractère nul de fin

// Allocation de mémoire dans le module Wasm$ptr = $instance->malloc($len);// Écriture de la chaîne dans la mémoire du module$instance->memory->write($ptr, $input);

// Appel de la fonction de transformation$instance->to_upper($ptr, $len);

// Lecture du résultat depuis la mémoire$result = $instance->memory->read($ptr, $len);echo "Résultat : " . trim($result); // HELLO WEBASSEMBLY

// Libération de la mémoire$instance->free($ptr);?>


Cette approche nécessite une gestion manuelle de la mémoire, mais offre un contrôle total sur les données. Pour simplifier, on peut utiliser des bibliothèques d'encapsulation, comme wasm-php-bridge.



3. Trait

Blogs

Book Recommendations