php-wasm / php-wasm
A complete and mature WebAssembly runtime for PHP based on Wasmer
Installs: 152
Dependents: 0
Suggesters: 0
Security: 0
Stars: 809
Watchers: 31
Forks: 23
Open Issues: 14
pkg:composer/php-wasm/php-wasm
Requires
- ext-wasm: ^1.0.0
Requires (Dev)
- friendsofphp/php-cs-fixer: @dev
- phpdocumentor/flyfinder: @dev
- phpdocumentor/phpdocumentor: @dev
- phpunit/phpunit: @dev
Replaces
This package is auto-updated.
Last update: 2021-05-18 13:59:09 UTC
README
Wasmer PHP
Website • Docs • Slack Channel
A complete and mature WebAssembly runtime for PHP based on Wasmer.
Features
- Easy to use: The
wasmerAPI mimics the standard WebAssembly C API, - Fast:
wasmerexecutes the WebAssembly modules as fast as possible, close to native speed, - Safe: All calls to WebAssembly will be fast, but more importantly, completely safe and sandboxed.
Install
To install the library, follow the classical:
git clone https://github.com/wasmerio/wasmer-php cd wasmer-php/ext phpize ./configure --enable-wasmer make make test make install
Note: Wasmer doesn't work on Windows yet.
Examples
Procedural API
<?php declare(strict_types=1); $engine = wasm_engine_new(); $store = wasm_store_new($engine); $wasm = file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.wasm'); $module = wasm_module_new($store, $wasm); function hello_callback() { echo 'Calling back...' . PHP_EOL; echo '> Hello World!' . PHP_EOL; return null; } $functype = wasm_functype_new(new Wasm\Vec\ValType(), new Wasm\Vec\ValType()); $func = wasm_func_new($store, $functype, 'hello_callback'); wasm_functype_delete($functype); $extern = wasm_func_as_extern($func); $externs = new Wasm\Vec\Extern([$extern]); $instance = wasm_instance_new($store, $module, $externs); wasm_func_delete($func); $exports = wasm_instance_exports($instance); $run = wasm_extern_as_func($exports[0]); wasm_module_delete($module); wasm_instance_delete($instance); $results = wasm_func_call($run, new Wasm\Vec\Val()); wasm_store_delete($store); wasm_engine_delete($engine);
Object-oriented API
<?php declare(strict_types=1); use Wasm; require_once __DIR__.'/../vendor/autoload.php'; $engine = Wasm\Engine::new(); $store = Wasm\Store::new($engine); $wasm = file_get_contents(__DIR__.DIRECTORY_SEPARATOR.'hello.wasm'); $module = Wasm\Module::new($store, $wasm); function hello_callback() { echo 'Calling back...'.PHP_EOL; echo '> Hello World!'.PHP_EOL; return null; } $functype = Wasm\Functype::new(new Wasm\Vec\ValType(), new Wasm\Vec\ValType()); $func = Wasm\Module\Func::new($store, $functype, 'hello_callback'); $extern = $func->asExtern(); $externs = new Wasm\Vec\Extern([$extern->inner()]); $instance = Wasm\Module\Instance::new($store, $module, $externs); $exports = $instance->exports(); $run = $exports[0]->asFunc(); $args = new Wasm\Vec\Val(); $results = $run($args);
This example covers the most basic Wasm use case: we take a Wasm module (in its text representation form), create an instance from it, get an exported function and run it.
You can go through more advanced examples in the dedicated directories:
Supported platforms and features
Platforms
| Platform | Architecture | Status |
|---|---|---|
| Linux | amd64 |
✅ |
| Linux | aarch64 |
❌ |
| Windows | amd64 |
❌ |
| Darwin | amd64 |
✅ |
| Darwin | aarch64 |
❌ |
| PHP | Status |
|---|---|
| 8.0 | ✅ |
| 7.4 | ❌ |
| 7.3 | ❌ |
Features
Compilers and engines
| Compiler | Status |
|---|---|
| Cranelift | ✅ |
| LLVM | ❌ |
| Singlepass | ❌ |
| Engine | Status |
|---|---|
| Native | ✅ |
| JIT | ✅ |
| Object File | ❌ |
Runtime
| Object | Status |
|---|---|
| config | ✅ |
| engine | ✅ |
| store | ✅ |
Types
| Type | Status |
|---|---|
| valtype | ✅ |
| functype | ✅ |
| globaltype | ✅ |
| tabletype | ✅ |
| memorytype | ✅ |
| externtype | ✅ |
| importtype | ✅ |
| exporttype | ✅ |
Objects
| Object | Status |
|---|---|
| val | ✅ |
| frame | ✅ |
| trap | ✅ |
| foreign | ✅ |
| module | ✅ |
| func | ✅ |
| global | ✅ |
| table | 🧑💻 |
| memory | ✅ |
| extern | ✅ |
| instance | ✅ |
Misc
| Feature | Status |
|---|---|
| WAT | ✅ |
| WASI | ❌ |
| Cross Compilation | ❌ |
License
The entire project is under the MIT License. Please read the
LICENSE file.