Einführung in WebAssembly und PHP
\n\nWebAssembly (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\nIn 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.
Grundlagen von WebAssembly: Was ein PHP-Entwickler wissen muss
\n\nWasm-Architektur
\n\nWebAssembly 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\nWichtige 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
Werkzeuge für die Arbeit mit Wasm in PHP
\n\nEs 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
Installation über Composer:
\ncomposer require wasmtime/wasmtime-php\n# oder\ncomposer require wasmer/wasmer\n\nAußerdem muss die Systembibliothek Wasmtime oder Wasmer installiert werden. Für Ubuntu:
\ncurl https://wasmtime.dev/install.sh -sSf | bash\n# oder\ncurl https://get.wasmer.io -sSfL | sh\n\nKompilierung von C/C++ in WebAssembly
\n\nFür die Kompilierung verwenden wir Emscripten – ein Toolkit basierend auf LLVM/Clang. Installation:
\ngit clone https://github.com/emscripten-core/emsdk.git\ncd emsdk\n./emsdk install latest\n./emsdk activate latest\nsource ./emsdk_env.sh\n\nBeispiel: Eine Summenfunktion in C
\n\nErstellen wir eine Datei math.c:
#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\nKompilieren in Wasm:
\nemcc math.c -o math.wasm -s WASM=1 -s EXPORTED_FUNCTIONS='["_add","_factorial"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' -O3\n\nDas Flag -O3 aktiviert die maximale Optimierung. Die Datei math.wasm ist bereit zur Verwendung.
Integration von Wasm mit PHP: Schritt-für-Schritt-Beispiele
\n\nSzenario 1: Verwendung von Wasmtime
\n\nInstallieren 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()