TrueAsync ServerTrueAsync Server: быстрый старт

Быстрый старт TrueAsync Server ​

(PHP 8.6+, true_async_server 0.6+)

За пять минут: установка расширения, минимальный обработчик и проверка ответа.

Сервер поставляется вместе с TrueAsync PHP во всех готовых сборках. Если у вас уже стоит TrueAsync PHP из инсталлятора, Docker-образа или Windows ZIP, достаточно включить расширение в php.ini — собирать ничего не нужно. Если же вы хотите собрать его руками из исходников (своя версия PHP, своя цепочка зависимостей), см. раздел Сборка из исходников.

Docker ​

Самый быстрый способ попробовать. Готовый образ содержит PHP с TrueAsync и расширением true_async_server:

bash
docker run --rm -p 8080:8080 \
  -v $PWD/hello.php:/app/hello.php \
  -w /app \
  trueasync/php-true-async:latest \
  php hello.php

Доступные теги:

ТегОписание
trueasync/php-true-async:latestUbuntu 24.04 + CLI + FPM, последний стабильный релиз
trueasync/php-true-async:latest-alpineAlpine 3.20, lightweight
trueasync/php-true-async:0.6.7-php8.6Конкретная версия

Полный список тегов и старых релизов см. на странице загрузки.

Linux / macOS — установка скриптом ​

Скрипт скачивает исходники, собирает TrueAsync PHP вместе с расширением сервера и кладёт всё в ~/.php-trueasync/bin/:

bash
# Linux (Ubuntu / Debian)
curl -fsSL https://raw.githubusercontent.com/true-async/releases/master/installer/build-linux.sh | bash

# macOS (Apple Silicon / Intel; требуется Homebrew)
curl -fsSL https://raw.githubusercontent.com/true-async/releases/master/installer/build-macos.sh | bash

После установки php --ri true_async_server покажет список протоколов и версии библиотек.

Параметры (передавайте через переменные окружения перед bash или в non-interactive режиме):

bash
curl -fsSL .../build-linux.sh | NO_INTERACTIVE=true bash

Опции и управление установкой описаны на странице загрузки.

Windows — ZIP ​

Готовая сборка TrueAsync PHP для Windows x64 содержит расширение сервера. Скачайте ZIP с GitHub Releases (файл вида php-trueasync-X.Y.Z-php8.6-windows-x64.zip), распакуйте, добавьте каталог в PATH и в php.ini включите:

ini
extension=true_async_server

Проверка:

cmd
php --ri true_async_server

HTTP/3 outbound batching использует UDP_SEGMENT (Linux GSO), эквивалента в Windows нет. Пропускная способность HTTP/3 на Windows ниже; HTTP/1.1, HTTP/2 и TLS работают без потерь.

Включение расширения ​

Во всех вариантах установки в php.ini нужно дописать:

ini
extension=true_async_server

И проверить:

bash
php --ri true_async_server

В выводе будут протоколы (HTTP/1.1, HTTP/2, HTTP/3, TLS 1.2/1.3) и версии OpenSSL, nghttp2, ngtcp2, nghttp3, libuv в рантайме.


Сборка из исходников ​

Если стандартные сборки не подходят, можно собрать руками.

Требования ​

КомпонентМинимумЗачемПримечание
PHP8.6базиссборка из TrueAsync php-src
ext-asynclatest mainevent-loop, udp_bind для HTTP/3
OpenSSL3.0 (3.5 для HTTP/3)TLS, HTTP/3HTTP/3 требует QUIC TLS API из OpenSSL 3.5
libnghttp21.57HTTP/2floor для CVE-2023-44487
libngtcp2 + libngtcp2_crypto_ossl1.22HTTP/3бэкенд crypto именно _ossl
libnghttp31.15HTTP/3
libuvчерез TrueAsyncбазиснапрямую расширением не линкуется
llhttp9.3.0HTTP/1.1vendored в deps/llhttp/

Дистрибутивные пакеты OpenSSL/ngtcp2/nghttp3 обычно слишком старые. Рекомендуется собрать OpenSSL 3.5 + ngtcp2 + nghttp3 из исходников под единый префикс (/usr/local или /opt/h3) и указать его в PKG_CONFIG_PATH при ./configure.

Linux ​

1. Зависимости ​

bash
sudo apt-get install -y \
    build-essential autoconf bison re2c pkg-config \
    libcmocka-dev   # для --enable-tests

OpenSSL 3.5, ngtcp2 1.22+ и nghttp3 1.15+ на момент написания отсутствуют в репозиториях большинства дистрибутивов, поэтому собираем под /usr/local:

bash
# OpenSSL 3.5 с QUIC
git clone --branch openssl-3.5 https://github.com/openssl/openssl
cd openssl && ./Configure --prefix=/usr/local && make -j$(nproc) && sudo make install
sudo ldconfig

# ngtcp2 (OpenSSL crypto бэкенд)
git clone --recursive https://github.com/ngtcp2/ngtcp2
cd ngtcp2 && autoreconf -i \
  && ./configure --prefix=/usr/local --with-openssl --with-libnghttp3 \
                 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig \
  && make -j$(nproc) && sudo make install

# nghttp3
git clone --recursive https://github.com/ngtcp2/nghttp3
cd nghttp3 && autoreconf -i \
  && ./configure --prefix=/usr/local && make -j$(nproc) && sudo make install

2. Сборка расширения ​

bash
git clone https://github.com/true-async/server true-async-server
cd true-async-server
phpize
./configure \
    --enable-http-server \
    --with-php-config="$(which php-config)" \
    PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
make -j$(nproc)
sudo make install

HTTP/2 и HTTP/3 включаются автоматически при наличии зависимостей (libnghttp2 ≥ 1.57 для H2; libngtcp2 ≥ 1.22, libnghttp3 ≥ 1.15, OpenSSL ≥ 3.5 для H3). Чтобы отключить: --disable-http2, --disable-http3.

Дополнительные флаги:

ФлагЭффект
--enable-testsсборка unit-тестов с libcmocka
--enable-coverageинструментирование gcov
--without-opensslбез TLS (выключает и HTTP/3)
--enable-brotliвключить Brotli (autodetect)
--enable-zstdвключить zstd (autodetect)

Дальше остаётся включить расширение в php.ini и проверить — см. раздел Включение расширения выше.

Windows ​

Сборка через стандартный PHP-SDK. Статические .lib для OpenSSL 3.5, nghttp2, ngtcp2, nghttp3 должны быть доступны под deps\ в дереве PHP-SDK.

cmd
REM из Visual Studio x64 Native Tools prompt
phpsdk_buildtree phpdev
git clone https://github.com/true-async/php-src.git
cd php-src
git clone https://github.com/true-async/server ext\true_async_server

buildconf.bat
configure.bat ^
    --disable-all ^
    --enable-cli ^
    --enable-async=shared ^
    --enable-http-server=shared ^
    --with-openssl=shared

nmake

Готовый php_true_async_server.dll появится в x64\Release_TS\ (или Release\ для NTS). Скопируйте его в ext\ и добавьте extension=true_async_server в php.ini.

Минимальный сервер ​

php
<?php
// hello.php

use TrueAsync\HttpServer;
use TrueAsync\HttpServerConfig;

$server = new HttpServer(
    (new HttpServerConfig())
        ->addListener('0.0.0.0', 8080)
);

$server->addHttpHandler(function ($request, $response) {
    $response
        ->setStatusCode(200)
        ->setHeader('Content-Type', 'text/plain')
        ->setBody('Hello, World!');
});

$server->start();   // блокирует до stop()

Запуск:

bash
php hello.php

Проверка:

bash
curl -i http://localhost:8080/
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 13

Hello, World!

Дальше ​