😽
【PHP】HTTP サーバーの FrankenPHP を使う
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 /embed
の README に記載されている
FrankenPHP のソースコードには frankenphp.c
や frankenphp.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