A complete and mature WebAssembly runtime for PHP based on Wasmer .
Features
Easy to use : The wasmer
API mimics the standard WebAssembly C API,
Fast : wasmer
executes 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 .