Arbeit mit WebAssembly und PHP: von A bis Z

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

Einführung in WebAssembly und PHP

\n\n

WebAssembly (Wasm) ist ein binäres Low-Level-Anweisungsformat, das in einer virtuellen Maschine mit nahezu nativer Leistung ausgeführt wird. Im Kontext von PHP eröffnet es neue Horizonte: Sie können Code in C, C++, Rust oder Go direkt aus einem PHP-Skript heraus ausführen, ohne die Serverumgebung zu verlassen. Dies ist besonders nützlich für ressourcenintensive Aufgaben wie Bildverarbeitung, Kryptographie, Datenparsing oder mathematische Berechnungen.

\n\n

In diesem Artikel behandeln wir den gesamten Arbeitsablauf: von der Kompilierung des Quellcodes in Wasm bis zum Aufruf von Funktionen aus PHP mit den Erweiterungen wasmtime und wasmer. Sie erfahren, wie Sie die Leistung von PHP-Anwendungen durch die Nutzung der Maschinencode-Leistung steigern können.

\n\n

Grundlagen von WebAssembly: Was ein PHP-Entwickler wissen muss

\n\n

Wasm-Architektur

\n\n

WebAssembly läuft in einer isolierten Sandbox. Ein Wasm-Modul hat keinen direkten Zugriff auf das Dateisystem, das Netzwerk oder den Host-Arbeitsspeicher – nur auf seinen linearen Speicher und die exportierten Funktionen. Dies gewährleistet Sicherheit, erfordert jedoch eine explizite Datenverwaltung.

\n\n

Wichtige Konzepte:

\n
    \n
  • Modul – eine kompilierte Binärdatei (.wasm)
  • \n
  • Exporte – Funktionen und Variablen, die von außen zugänglich sind
  • \n
  • Importe – Funktionen, die der Host (PHP) dem Modul bereitstellt
  • \n
  • Linearer Speicher – ein kontinuierliches Byte-Array, mit dem das Modul arbeitet
  • \n
\n\n

Werkzeuge für die Arbeit mit Wasm in PHP

\n\n

Es gibt zwei Haupterweiterungen:

\n
    \n
  • Wasmtime – von der Bytecode Alliance, die beliebteste und stabilste
  • \n
  • Wasmer – eine Alternative mit Unterstützung für mehrere Backends (Cranelift, LLVM, Singlepass)
  • \n
\n\n

Installation über Composer:

\n
composer require wasmtime/wasmtime-php\n# oder\ncomposer require wasmer/wasmer
\n\n

Außerdem muss die Systembibliothek Wasmtime oder Wasmer installiert werden. Für Ubuntu:

\n
curl https://wasmtime.dev/install.sh -sSf | bash\n# oder\ncurl https://get.wasmer.io -sSfL | sh
\n\n

Kompilierung von C/C++ in WebAssembly

\n\n

Für die Kompilierung verwenden wir Emscripten – ein Toolkit basierend auf LLVM/Clang. Installation:

\n
git clone https://github.com/emscripten-core/emsdk.git\ncd emsdk\n./emsdk install latest\n./emsdk activate latest\nsource ./emsdk_env.sh
\n\n

Beispiel: Eine Summenfunktion in C

\n\n

Erstellen wir eine Datei math.c:

\n
#include <emscripten.h>\n\nEMSCRIPTEN_KEEPALIVE\nint add(int a, int b) {\n    return a + b;\n}\n\nEMSCRIPTEN_KEEPALIVE\nint factorial(int n) {\n    if (n <= 1) return 1;\n    return n * factorial(n - 1);\n}
\n\n

Kompilieren in Wasm:

\n
emcc math.c -o math.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add","_factorial"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' -O3
\n\n

Das Flag -O3 aktiviert die maximale Optimierung. Die Datei math.wasm ist bereit zur Verwendung.

\n\n

Integration von Wasm mit PHP: Schritt-für-Schritt-Beispiele

\n\n

Szenario 1: Verwendung von Wasmtime

\n\n

Installieren Sie die Erweiterung und schreiben Sie den folgenden PHP-Code:

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Wasmtime\\Engine;\nuse Wasmtime\\Module;\nuse Wasmtime\\Store;\nuse Wasmtime\\Func;\nuse Wasmtime\\Val;\n\n// Modul laden\n$engine = new Engine();\n$module = Module::fromFile($engine, 'math.wasm');\n$store = new Store($engine);\n\n// Instanz erstellen\n$instance = new Wasmtime\\Instance($store, $module, []);\n\n// Exportierte Funktion abrufen\n$add = $instance->getExport($store, 'add');\n$factorial = $instance->getExport($store, 'factorial');\n\n// Funktionen aufrufen\n$resultAdd = $add->call($store, 5, 7);\n$resultFact = $factorial->call($store, 10);\n\necho "5 + 7 = " . $resultAdd[0]->i32() . "\\n"; // 12\necho "10! = " . $resultFact[0]->i32()                

Blogs

Buchempfehlungen