⛳
【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