【PHP】GunTLS バックエンドの curl 拡張で HTTP/3 を利用する

に公開

はじめに

PHP の curl 拡張で HTTP/3 を使いたい場合、実は php-curl が使う libcurl が HTTP/3 に対応している必要があります。Debian 系ディストリビューション(例: Chromebook の Linux 環境)では、デフォルトの libcurl では HTTP/3 をサポートしていないため、自前でビルドする必要があります。

本記事では、以下の構成で HTTP/3 対応の PHP 環境を作る手順をまとめます。

  • Chromebook(Debian Bookworm、bookworm-backports のリポジトリを利用)
  • PHP 8.4(Sury パッケージ)
  • HTTP/3 対応 libcurl(GnuTLS + ngtcp2 + nghttp3)
  • curl 拡張を手動でビルドしてリンク

curl のビルド

詳細はこちらの記事を参照してください。インストール先は $HOME/.local とします。「HTTP3」が含まれていれば OK です。

$HOME/.local/bin/curl --version

Sury のリポジトリ導入

sudo apt update
sudo apt install -y apt-transport-https curl lsb-release ca-certificates gnupg2

Sury GPG キー追加

curl -fsSL https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /usr/share/keyrings/sury-php.gpg

APT リポジトリ追加

echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ bookworm main" | sudo tee /etc/apt/sources.list.d/sury-php.list

PHP 8.4 のインストール

PHP 8.4 パッケージをインストールします。

sudo apt update
sudo apt install php8.4 php8.4-cli php8.4-dev php8.4-common

PHP curl のビルド

$HOME/.local の libcurl をもとに php curl をビルドします。

ビルドに必要なツールをインストールします。

sudo apt install php8.4-dev php-pear build-essential autoconf pkg-config git

PHP ソースを取得します。

mkdir ~/php-src && cd ~/php-src
git clone --branch PHP-8.4 --depth 1 https://github.com/php/php-src.git
cd php-src/ext/curl

ビルドします。

phpize8.4
./configure \
  --with-php-config=/usr/bin/php-config8.4 \
  --with-curl=$HOME/.local \
  CPPFLAGS="-I$HOME/.local/include" \
  LDFLAGS="-L$HOME/.local/lib"
make -j$(nproc)
sudo make install

php.ini に curl 拡張を登録します。

echo "extension=curl.so" | sudo tee /etc/php/8.4/cli/conf.d/20-curl.ini

LD_LIBRARY_PATH を登録します。libcurl を $HOME/.local/lib に置いているため、PHP 実行時に環境変数でパス指定が必須です。

export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH

または .bashrc に追加して恒久化します:

echo 'export LD_LIBRARY_PATH=$HOME/.local/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

動作確認

<?php
$ch = curl_init("https://cloudflare-quic.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if (defined('CURL_HTTP_VERSION_3')) {
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_3);
}
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
print_r($info);

まとめ

Debian 環境で libcurl を自前ビルドすると HTTP/3 が使える

php-curl 拡張もリンクし直せば PHP から HTTP/3 通信が可能

LD_LIBRARY_PATH の指定が必須なので注意


おまけ:PHP-FPM で使う場合

# /etc/systemd/system/php8.4-fpm.service.d/env.conf
[Service]
Environment="LD_LIBRARY_PATH=/home/yourname/.local/lib"

Discussion