ππΈοΈ WebAssembly runtime for PHP
See the codeA complete and mature WebAssembly runtime for PHP based on Wasmer.
wasmer API mimics the standard WebAssembly C API,wasmer executes the WebAssembly modules as fast as possible, close to native speed,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.
<?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);
<?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:
| 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.
1,192 followers Β· starred Nov 2018
148 followers Β· starred Nov 2018
830 followers Β· starred Dec 2018
145 followers Β· starred Jan 2024
PHP
52.1%
C
44.1%
Makefile
1.8%
WebAssembly
1.1%
ππΈοΈ WebAssembly runtime for PHP
See the codeA complete and mature WebAssembly runtime for PHP based on Wasmer.
wasmer API mimics the standard WebAssembly C API,wasmer executes the WebAssembly modules as fast as possible, close to native speed,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.
<?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);
<?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:
| 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.
1,192 followers Β· starred Nov 2018
148 followers Β· starred Nov 2018
830 followers Β· starred Dec 2018
145 followers Β· starred Jan 2024
PHP
52.1%
C
44.1%
Makefile
1.8%
WebAssembly
1.1%