Avvio rapido di TrueAsync Server

(PHP 8.6+, true_async_server 0.6+)

In cinque minuti: installazione dell'estensione, handler minimo e verifica della risposta.

Il server viene distribuito insieme a TrueAsync PHP in tutti i pacchetti precompilati. Se hai già TrueAsync PHP installato tramite l'installer, l'immagine Docker o lo ZIP Windows, basta abilitare l'estensione in php.ini — non serve compilare nulla. Se invece vuoi compilarla manualmente dai sorgenti (versione di PHP personalizzata, propria catena di dipendenze), consulta la sezione Compilazione dai sorgenti.

Docker

Il modo più rapido per provarlo. L'immagine pronta contiene PHP con TrueAsync e l'estensione 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

Tag disponibili:

TagDescrizione
trueasync/php-true-async:latestUbuntu 24.04 + CLI + FPM, ultima release stabile
trueasync/php-true-async:latest-alpineAlpine 3.20, lightweight
trueasync/php-true-async:0.6.7-php8.6Versione specifica

L'elenco completo dei tag e delle release storiche si trova sulla pagina di download.

Linux / macOS — installazione tramite script

Lo script scarica i sorgenti, compila TrueAsync PHP insieme all'estensione server e installa tutto in ~/.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; richiede Homebrew)
curl -fsSL https://raw.githubusercontent.com/true-async/releases/master/installer/build-macos.sh | bash

Dopo l'installazione, php --ri true_async_server mostrerà l'elenco dei protocolli e le versioni delle librerie.

Parametri (passali tramite variabili d'ambiente prima di bash o in modalità non interattiva):

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

Le opzioni e la gestione dell'installazione sono descritte nella pagina di download.

Windows — ZIP

Il pacchetto precompilato di TrueAsync PHP per Windows x64 contiene l'estensione server. Scarica lo ZIP dalle GitHub Releases (un file del tipo php-trueasync-X.Y.Z-php8.6-windows-x64.zip), estrailo, aggiungi la cartella al PATH e abilita in php.ini:

ini
extension=true_async_server

Verifica:

cmd
php --ri true_async_server

Il batching in uscita di HTTP/3 usa UDP_SEGMENT (GSO di Linux) e su Windows non c'è un equivalente. Il throughput HTTP/3 su Windows è più basso; HTTP/1.1, HTTP/2 e TLS funzionano senza penalità.

Abilitazione dell'estensione

In tutte le varianti di installazione bisogna aggiungere a php.ini:

ini
extension=true_async_server

E verificare:

bash
php --ri true_async_server

L'output mostrerà i protocolli (HTTP/1.1, HTTP/2, HTTP/3, TLS 1.2/1.3) e le versioni di OpenSSL, nghttp2, ngtcp2, nghttp3 e libuv usate a runtime.


Compilazione dai sorgenti

Se i pacchetti standard non vanno bene, puoi compilare manualmente.

Requisiti

ComponenteMinimoA cosa serveNote
PHP8.6basecompilazione dai sorgenti di TrueAsync php-src
ext-asyncultimo mainevent loop, udp_bind per HTTP/3
OpenSSL3.0 (3.5 per HTTP/3)TLS, HTTP/3HTTP/3 richiede l'API QUIC TLS di OpenSSL 3.5
libnghttp21.57HTTP/2soglia per CVE-2023-44487
libngtcp2 + libngtcp2_crypto_ossl1.22HTTP/3il backend crypto deve essere proprio _ossl
libnghttp31.15HTTP/3
libuvtramite TrueAsyncbasenon viene linkata direttamente dall'estensione
llhttp9.3.0HTTP/1.1vendored in deps/llhttp/

I pacchetti di distribuzione di OpenSSL/ngtcp2/nghttp3 sono di solito troppo vecchi. Si consiglia di compilare OpenSSL 3.5 + ngtcp2 + nghttp3 dai sorgenti in un unico prefix (/usr/local o /opt/h3) e indicarlo in PKG_CONFIG_PATH durante ./configure.

Linux

1. Dipendenze

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

OpenSSL 3.5, ngtcp2 1.22+ e nghttp3 1.15+ al momento non sono presenti nei repository della maggior parte delle distribuzioni, quindi li compiliamo sotto /usr/local:

bash
# OpenSSL 3.5 con 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 (backend crypto OpenSSL)
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. Compilazione dell'estensione

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 e HTTP/3 vengono abilitati automaticamente se sono presenti le dipendenze (libnghttp2 ≥ 1.57 per H2; libngtcp2 ≥ 1.22, libnghttp3 ≥ 1.15, OpenSSL ≥ 3.5 per H3). Per disabilitarli: --disable-http2, --disable-http3.

Flag aggiuntivi:

FlagEffetto
--enable-testscompila i test unit con libcmocka
--enable-coveragestrumentazione gcov
--without-opensslsenza TLS (disattiva anche HTTP/3)
--enable-brotliabilita Brotli (autodetect)
--enable-zstdabilita zstd (autodetect)

Restano solo da abilitare l'estensione in php.ini e verificare — vedi la sezione Abilitazione dell'estensione sopra.

Windows

Compilazione tramite l'SDK PHP standard. I .lib statici per OpenSSL 3.5, nghttp2, ngtcp2, nghttp3 devono essere disponibili in deps\ all'interno dell'albero del PHP SDK.

cmd
REM dal prompt Visual Studio x64 Native Tools
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

Il php_true_async_server.dll finito comparirà in x64\Release_TS\ (o Release\ per NTS). Copialo in ext\ e aggiungi extension=true_async_server a php.ini.

Server minimo

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();   // blocca fino a stop()

Avvio:

bash
php hello.php

Verifica:

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

Hello, World!

Prossimi passi