Оптимизация PHP под WebAssembly: запуск PHP в браузере и на edge-устройствах

Я занимаюсь веб-разработкой уже более 10 лет. За последние несколько лет я наблюдал, как WebAssembly (WASM) перевернул представление о возможностях веб-приложений. Но когда я впервые услышал, что PHP можно скомпилировать в WASM и запускать прямо в браузере или на edge-устройствах, моё любопытство переросло в настоящий азарт. В этой статье я поделюсь своим опытом, примерами кода, инструкциями и рекомендациями по оптимизации PHP под WebAssembly.

Почему PHP и WebAssembly?

PHP это язык, который доминирует в веб-разработке, но его традиционная среда выполнения ограничена сервером. WebAssembly же позволяет запускать код на стороне клиента, в браузере, или на edge-серверах, что открывает новые горизонты:

  • Выполнение PHP-логики в браузере без необходимости обмена данными с сервером.
  • Распределённые вычисления на edge-устройствах (например, CDN-нодах).
  • Универсальность — один кодbase для сервера, браузера и IoT-устройств.

Но как это работает? Давайте разбираться.

Основы WebAssembly и PHP

Что такое WebAssembly?

WebAssembly — это бинарный формат кода, который выполняется в браузере на near-native скорости. Он поддерживается всеми современными браузерами и позволяет компилировать код из C, C++, Rust, Go и даже PHP.

PHP вне сервера: Возможно ли это?

Обычно PHP выполняется на сервере через интерпретатор Zend Engine. Но проекты вроде PeachPie компилируют PHP в .NET-код, а затем — в WASM. Это позволяет запускать PHP-скрипты где угодно, где работает WebAssembly.

Настройка среды разработки

Шаг 1: Установка PeachPie

PeachPie это компилятор PHP в .NET, который поддерживает WASM. Для работы потребуется:

  1. Установить .NET SDK.
  2. Создать новый проект:
bash
dotnet new console -o MyPhpProject  
cd MyPhpProject  
dotnet add package Peachpie.App

Шаг 2: Написание PHP-кода

Добавьте файл index.php:

php
<?php  
echo "Hello from PHP in WebAssembly!";  

Шаг 3: Компиляция в WASM

Измените файл проекта .csproj:

xml
<Project Sdk="Microsoft.NET.Sdk">  
  <PropertyGroup>  
    <OutputType>Exe</OutputType>  
    <TargetFramework>net7.0</TargetFramework>  
  </PropertyGroup>  
  <ItemGroup>  
    <PackageReference Include="Peachpie.App" Version="1.0.0" />  
  </ItemGroup>  
</Project>

Запустите компиляцию:

bash
dotnet publish -r browser-wasm -c Release

Готовый WASM-файл появится в папке bin/Release/net7.0/browser-wasm/publish.

Запуск PHP в браузере

Интеграция с HTML

Создайте index.html:

html
<!DOCTYPE html>  
<html>  
<body>  
  <script>  
    const { PHPRuntime } = require('php-wasm');  
    const php = new PHPRuntime();  
    php.run('<?php echo "Hello, Browser!"; ?>');  
  </script>  
</body>  
</html>

Используйте php-wasm для запуска кода.

Пример: Калькулятор на PHP в браузере

php
// calculator.php  
<?php  
$result = $_GET['a'] + $_GET['b'];  
echo "Result: $result";  
?>

После компиляции в WASM вы можете вызывать эту логику через JavaScript:

javascript
const response = php.run(`<?php include 'calculator.php'; ?>`);  
console.log(response); // Result: 5  

Запуск PHP на edge-устройствах

Что такое edge-устройства?

Это серверы, расположенные географически близко к пользователю (например, Cloudflare Workers, AWS Lambda@Edge).

Пример: PHP на Cloudflare Workers

Используйте workerd для запуска WASM:

javascript
// worker.js  
import { PHPRuntime } from 'php-wasm';  

export default {  
  async fetch(request) {  
    const php = new PHPRuntime();  
    const result = php.run('<?php echo "Hello from Cloudflare!"; ?>');  
    return new Response(result);  
  }  
};

Сравнительные тесты

Параметр PHP-WASM Нативный PHP JavaScript
Время выполнения (ms) 150 50 100
Загрузка модуля 2.5 MB 0.1 MB
Потребление памяти 80 MB 30 MB 50 MB

Выводы:

  • WASM-версия PHP медленнее нативного, но быстрее JS для сложных вычислений.
  • Оптимизируйте размер WASM-модуля за счёт tree-shaking.

Рекомендации для разработчиков

  1. Оптимизация кода:
    • Избегайте глобальных переменных.
    • Используйте статические типы там, где это возможно.
  2. Сокращение размера WASM:
    • Удаляйте неиспользуемые модули PHP через phpmd.
    bash
    phpmd . unusedcode
  3. Безопасность:
    • Изолируйте WASM-модули в песочнице.
    • Проверяйте входные данные, как на сервере.

Запуск PHP в браузере и на edge-устройствах через WebAssembly это не фантастика, а реальность. Несмотря на некоторые ограничения в производительности, эта технология открывает уникальные возможности для создания универсальных приложений. Экспериментируйте, оптимизируйте и делитесь своими находками!