WebAssebmlyを学ぶと、単にWebブラウザ上で実行できるバイナリファイル以上の価値が見えてきます。WebAssebmlyを実行できるVMがあれば、他の環境でも同じように動かせるフォーマットとなります。つまりWebブラウザに限らず、幅広い環境で動かせる共通ライブラリになり得るのです。 今回はその一端を垣間見えるphp-ext-wasmを紹介します。WebAssebmlyをPHPで実行できるソフトウェアです。

php-ext-wasmの使い方

例えば以下のようにRustファイルを作り、WebAssebmly化します。

#[no_mangle]
pub extern fn sum(x: i32, y: i32) -> i32 {
    x + y
}

そしてPHPでそのファイルを読み込んで実行します。

< ?php

declare(strict_types = 1);

require_once dirname(__DIR__) . '/vendor/autoload.php';

$instance = new WASM\Instance(__DIR__ . '/simple.wasm');

var_dump(
    $instance->sum(5, 37) // 42!
);

結果は正しくWebAssemblyの実行結果が得られます。

$ php examples/simple.php
int(42)

さらに以下のように関数を作成する例もあります。

extern {
    fn add(x: i32, y: i32) -> i32;
}

#[no_mangle]
pub extern fn sum(x: i32, y: i32) -> i32 {
    unsafe {
        add(x, y) + 1
    }
}

PHPの内容は次のようになります。add関数の内容をダイナミックに変更してPHPから実行します。

< ?php

declare(strict_types = 1);

require_once dirname(__DIR__) . '/vendor/autoload.php';

$imports = [
    'add' => function(int $x, int $y): int {
        return $x + $y + 1;
    },
];
$instance = new WASM\Instance(__DIR__ . '/imported_function.wasm', $imports);

var_dump(
    $instance->sum(5, 35) // 42
);

実行すると正しく結果が得られます。

$ php examples/imported_function.php 
int(42)

php-ext-wasmを使うことでWebAssemblyで作られたライブラリをWebブラウザはもちろんサーバサイド(PHP)でも共通化できるようになります。もちろんバイナリフォーマットなので、PHPで実行する以上に高速に結果が得られるというメリットもあります。スクリプトではないのでソースコードもそう簡単には見られないというのも利点でしょう。

php-ext-wasmはC製のオープンソース・ソフトウェア(BSD)です。

Hywan/php-ext-wasm: ?+?+?️ PHP extension to run WebAssembly binaries.