😽

【PHP】HTTP サーバーの FrankenPHP を使う

2024/05/05に公開

FrankenPHP は Go の Caddy サーバーをもとにした HTTP/1/2/3 サーバーである。実行ファイルが配布されているのでダウンロードする

curl -OL https://github.com/dunglas/frankenphp/releases/download/v1.1.4/frankenphp-linux-x86_64
mv frankenphp-linux-x86_64 frankenphp
comod 700 frankenphp

PATH が通っているディレクトリに設置する。筆者の場合、いろいろなツールの導入に使っている asdf と同じ場所に設置した

mv frankenphp $HOME/.asdf/bin

PHP ファイルを用意する

index.php
<?php

echo "Hello\n";

起動させてみる

./frankenphp php-server --listen localhost:3000

停止は Ctrl-Z である

PHP コマンドツールとしても使える

./frankenphp php-cli index.php

FrankenPHP の実装には PHP の embed SAPI が使われている。これは C 言語のライブラリとして PHP 内部の API を利用できるようにするものである。使い方は php-src/sapi /embedREADME に記載されている

FrankenPHP のソースコードには frankenphp.cfrankenphp.h などの C 言語のソースコードも含まれる。go から C 言語のソースコードを扱うには cgo を使う

frankenphp.go では PHP スクリプト実行のコードは次のようなコードになっている

frankenPHP を利用する上で起きる問題は Known Issues のページにまとまっている。

Fiber の引数のコールバックのなかで echo を使ったコードはクラッシュするという

$fiber = new Fiber(function() {
    echo 'In the Fiber'.PHP_EOL;
    echo 'Still inside'.PHP_EOL;
});
$fiber->start();

代わりに Fiber::suspend を使い、echo はコールバックの外で使うべきだという

$fiber = new Fiber(function() {
    Fiber::suspend('In the Fiber'.PHP_EOL));
    Fiber::suspend('Still inside'.PHP_EOL));
});
echo $fiber->start();
echo $fiber->resume();
$fiber->resume();

Discussion