A complete and mature WebAssembly runtime for PHP based on Wasmer .
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.
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.
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
Platform
Architecture
Status
Linux
amd64
β
Linux
aarch64
β
Windows
amd64
β
Darwin
amd64
β
Darwin
aarch64
β
PHP
Status
8.0
β
7.4
β
7.3
β
Compiler
Status
Cranelift
β
LLVM
β
Singlepass
β
Engine
Status
Native
β
JIT
β
Object File
β
Object
Status
config
β
engine
β
store
β
Type
Status
valtype
β
functype
β
globaltype
β
tabletype
β
memorytype
β
externtype
β
importtype
β
exporttype
β
Object
Status
val
β
frame
β
trap
β
foreign
β
module
β
func
β
global
β
table
π§βπ»
memory
β
extern
β
instance
β
Feature
Status
WAT
β
WASI
β
Cross Compilation
β
The entire project is under the MIT License. Please read the
LICENSE
file .