Integration von WebAssembly und PHP: Ein praktischer Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum braucht PHP WebAssembly?



WebAssembly (Wasm) ist ein binäres Low-Level-Anweisungsformat, das die Ausführung von Code in Sprachen wie C, C++, Rust und anderen mit nahezu nativer Geschwindigkeit ermöglicht. Im Kontext von PHP eröffnet die Integration mit WebAssembly neue Möglichkeiten: von der Ausführung rechenintensiver Aufgaben auf der Serverseite bis hin zur Portierung vorhandener Bibliotheken, ohne sie in PHP neu schreiben zu müssen.



PHP ist eine Skriptsprache, die in der Leistung traditionell hinter kompilierten Sprachen zurückbleibt. Mit WebAssembly können Sie jedoch:



  • Geschwindigkeitskritische Algorithmen (Bildverarbeitung, Verschlüsselung, Parsing) in Wasm-Modulen ausführen.
  • Vorhandene C/C++-Bibliotheken in PHP-Anwendungen nutzen.
  • Die Serverlast durch optimierten Binärcode reduzieren.


In diesem Artikel betrachten wir, wie man WebAssembly praktisch in PHP integriert: vom Laden eines Moduls über die Datenübergabe bis zur Ergebnisverarbeitung.



1. Grundlagen der Arbeit mit WebAssembly in PHP



Für die Arbeit mit Wasm in PHP wird die Erweiterung wasm (oder wasmer für PHP) verwendet. Die Installation erfolgt über Composer:



composer require wasm/wasm


Nach der Installation können Sie Wasm-Module laden und ausführen. Betrachten wir ein einfaches Beispiel: ein C-Modul, das zwei Zahlen summiert.



Zunächst kompilieren wir den C-Code in Wasm:



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


Kompilierung (erfordert Emscripten oder wasi-sdk):



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


Jetzt laden wir das Modul in PHP und rufen die Funktion auf:



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

// Binärdatei laden$wasmBytes = file_get_contents('sum.wasm');$module = new Module($wasmBytes);$instance = new Instance($module);

// Exportierte Funktion add aufrufen$result = $instance->add(10, 20);echo "Ergebnis: " . $result; // 30?>


Der Code ist einfach und intuitiv: Wir erstellen eine Instanz des Moduls und rufen seine Funktionen als Methoden eines PHP-Objekts auf. Wichtig zu beachten ist, dass Wasm-Funktionen mit primitiven Typen (int, float) arbeiten, daher ist für komplexe Datenstrukturen eine zusätzliche Verarbeitung erforderlich.



2. Übergabe komplexer Daten: Zeichenketten und Arrays



WebAssembly operiert nur mit Zahlen. Für die Übergabe von Zeichenketten oder Arrays muss Speicher innerhalb des Wasm-Moduls reserviert und Zeiger übergeben werden. Betrachten wir ein Beispiel mit der Verarbeitung einer Zeichenkette.



Wir erstellen ein C-Modul, das eine Zeichenkette in Großbuchstaben umwandelt:



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


Kompilieren mit Export der Speicherfunktionen:



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


PHP-Code für den Aufruf:



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

$input = "hello webassembly";$len = strlen($input) + 1; // +1 für Nullterminator

// Speicher im Wasm-Modul reservieren$ptr = $instance->malloc($len);// Zeichenkette in den Speicher des Moduls schreiben$instance->memory->write($ptr, $input);

// Transformationsfunktion aufrufen$instance->to_upper($ptr, $len);

// Ergebnis aus dem Speicher lesen$result = $instance->memory->read($ptr, $len);echo "Ergebnis: " . trim($result); // HELLO WEBASSEMBLY

// Speicher freigeben$instance->free($ptr);?>


Dieser Ansatz erfordert manuelle Speicherverwaltung, bietet aber volle Kontrolle über die Daten. Zur Vereinfachung können Wrapper-Bibliotheken wie wasm-php-bridge verwendet werden.



3. Verar

Blogs

Buchempfehlungen