WebAssembly и PHP: что это и зачем? Неожиданный тандем для веба

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему PHP-разработчику стоит присмотреться к WebAssembly?

Мир веб-разработки не стоит на месте. Если вы пишете на PHP, вы наверняка привыкли к классической схеме: сервер обрабатывает запрос, генерирует HTML и отправляет его клиенту. Но что, если я скажу вам, что существует технология, которая позволяет запускать тяжелые вычисления прямо в браузере пользователя, разгружая ваш сервер? И да, это можно сделать, используя PHP и WebAssembly (Wasm).

Звучит как фантастика? Вовсе нет. WebAssembly — это низкоуровневый бинарный формат, который работает в браузере почти с нативной скоростью. А PHP, благодаря проектам вроде php-wasm и Wasmer, научился компилироваться в Wasm. В этой статье мы разберем, что это за зверь, зачем это нужно и, самое главное, как это выглядит в коде. Приготовьтесь удивляться: ваш любимый язык теперь может жить не только на сервере.

Что такое WebAssembly простыми словами?

Представьте, что браузер — это операционная система. Раньше он умел запускать только JavaScript. Теперь у него появился второй "процессор" — WebAssembly. Это не замена JS, а мощное дополнение. Wasm позволяет выполнять код на C, C++, Rust и, конечно, PHP, со скоростью, близкой к машинному коду.

Ключевые особенности Wasm:

  • Безопасность: выполняется в изолированной песочнице браузера.
  • Скорость: загрузка и компиляция занимают миллисекунды.
  • Переносимость: один и тот же бинарник работает в Chrome, Firefox, Safari и Edge.

Для PHP-разработчика это открывает дверь в мир, где ваш любимый язык может работать на фронтенде, выполнять сложную математику или обрабатывать изображения без единого запроса к серверу.

Зачем PHP и WebAssembly вместе? Три killer-сценария

1. Разгрузка сервера: вычисления на стороне клиента

Представьте, что у вас есть скрипт, который конвертирует CSV в JSON или сжимает изображения. Обычно это ложится на сервер. С Wasm вы можете отправить этот скрипт в браузер, и вся работа будет выполнена на компьютере пользователя. Сервер скажет вам спасибо, а пользователь — за скорость.

2. Запуск легаси-кода без сервера

У вас есть старая библиотека на PHP, которая работает только в определенной среде? Скомпилируйте её в Wasm и запускайте прямо в браузере. Никаких Docker-контейнеров, никаких настроек окружения. Просто файл .wasm и вызов из JavaScript.

3. Создание интерактивных инструментов

Хотите сделать онлайн-редактор кода, который выполняет PHP-скрипты прямо в браузере? Или симулятор физики на PHP? Wasm делает это реальным. Пользователь пишет код, а браузер его выполняет — без задержек на сетевые запросы.

Как это работает? Инструменты и компиляция

Чтобы превратить PHP в WebAssembly, используются специальные инструменты. Самый популярный — Emscripten, который компилирует C/C++ код в Wasm. PHP написан на C, поэтому его можно скомпилировать. Готовые сборки можно найти в репозитории php-wasm на GitHub.

Второй путь — использовать Wasmer. Это рантайм для WebAssembly, который работает не только в браузере, но и на сервере. С его помощью вы можете запускать Wasm-модули из PHP-скрипта. Да-да, PHP может вызывать код на другом языке, упакованный в Wasm!

Примеры кода: PHP + WebAssembly в деле

Давайте перейдем от теории к практике. Рассмотрим два сценария: запуск PHP в браузере и вызов Wasm из PHP.

Сценарий 1: Запускаем PHP-функцию в браузере

Допустим, у нас есть скомпилированный файл php-wasm.wasm. Мы хотим выполнить простую функцию сложения чисел. Вот как это выглядит на стороне клиента (HTML + JavaScript):

<!DOCTYPE html>
<html>
<head>
    <title>PHP в браузере через Wasm</title>
</head>
<body>
    <h3>Калькулятор на PHP в браузере</h3>
    <input type="number" id="a" value="5">
    <input type="number" id="b" value="10">
    <button onclick="runPHP()">Сложить через PHP</button>
    <p>Результат: <span id="result">...</span></p>

    <script>
        async function runPHP() {
            // Загружаем Wasm-модуль
            const wasmModule = await WebAssembly.instantiateStreaming(
                fetch('php-wasm.wasm')
            );
            const instance = wasmModule.instance;

            // Получаем значения из полей ввода
            const a = parseInt(document.getElementById('a').value);
            const b = parseInt(document.getElementById('b').value);

            // Вызываем PHP-функцию (экспортированную как 'php_add')
            const result = instance.exports.php_add(a, b);
            document.getElementById('result').innerText = result;
        }
    </script>
</body>
</html>

Важное замечание: В реальности компиляция PHP в Wasm — сложный процесс. Обычно используется готовый билд, например, от проекта wasm-php. Экспорт функций настраивается на этапе сборки. Но принцип именно такой: вы вызываете PHP-функцию как обычную нативную функцию Wasm.

Сценарий 2: Вызов Wasm из PHP на сервере (Wasmer)

А теперь обратная ситуация: у нас есть Wasm-модуль, написанный на Rust, который выполняет тяжелые вычисления. Мы хотим использовать его в PHP-скрипте. Для этого устанавливаем расширение wasmer для PHP. Вот пример:

<?php
// Устанавливаем расширение: pecl install wasmer
// Создаем экземпляр движка Wasmer
$engine = Wasmer\Engine::init();
$store = new Wasmer\Store($engine);

// Читаем Wasm-модуль
$wasmBytes = file_get_contents('heavy_compute.wasm');
$module = new Wasmer\Module($store, $wasmBytes);

// Создаем экземпляр модуля
$instance = new Wasmer\Instance($module);

// Получаем функцию 'calculate' из Wasm
$calculate = $instance->exports->get('calculate');

// Вызываем ее с параметрами
$input = 42;
$result = $calculate($input);

echo "Результат вычисления из Wasm: " . $result . PHP_EOL;
// Вывод: Результат вычисления из Wasm: 123456 (зависит от логики Wasm)
?>

Этот подход особенно полезен, когда нужно ускорить узкие места в PHP-приложении. Вы пишете критичный к производительности код на Rust или C, компилируете в Was

Блоги

Рекомендаций по книгам