Dockerで手軽にPHP8 RC版を試してみよう
こんにちは、ナカエです。
リリース時期が近づいてきているPHP8。JITやAttributes、Match式など新機能が盛り沢山ですね。
本記事ではPHP8の新機能をリリース前に試してみたいという方向けに、手元で簡単にPHP8を使ったWebアプリケーションを作成する方法を紹介します。
環境
普段使いしないものをホストマシンに入れるのはちょっと……ということでDockerコンテナを利用します。
- Docker Desktop for Mac (記事執筆時 2.3.0.3)
Docker ComposeのYAMLを設定
PHPのコンテナとは別にWebサーバのコンテナが必要なPHP-FPMではなく、PHP-CLI+ビルトインサーバを使って楽をします。
docker-compose.yml を下記のように記述し、
version: '3'
services:
php:
image: php:8.0.0rc1-cli
ports:
- "8000:8000"
environment:
- TZ=Asia/Tokyo
command: "php -S 0.0.0.0:8000 -t public"
working_dir: /app
volumes:
- ./:/app
composer:
image: composer:2.0
environment:
- TZ=Asia/Tokyo
volumes:
- ./:/app
working_dir: /app
コンテナを起動します。
docker-compose up
Composerで必要ライブラリをインストール
PHP8のコンテナ内でComposerを使って依存をインストールしようとするとインストールできないパッケージが多々あります。 とりあえず試すだけなのでComposerの公式コンテナ(中身がPHP7.4)で別途インストールして誤魔化すことにします。
初期化コマンドでcomposer.jsonを作成します。
docker-compose run composer init
# 対話形式で適当に設定する
HTTPメッセージ周りのライブラリを追加します。nyholm/psr7、nyholm/psr7-serverは人気のあるPSR7,PSR-15,PSR-17の実装です。
docker-compose run composer require nyholm/psr7 nyholm/psr7-server laminas/laminas-httphandlerrunner
Hello Worldを書く
public/index.phpに処理を書いていきます。 簡単なHello Worldですが、せっかくなのでPHP8の新機能を取り入れることにしましょう。
<?php
declare(strict_types=1);
require __DIR__ . '/../vendor/autoload.php';
use Laminas\HttpHandlerRunner\Emitter\SapiEmitter;
use Nyholm\Psr7\Factory\Psr17Factory;
use Nyholm\Psr7Server\ServerRequestCreator;
use Psr\Http\Message\{ServerRequestInterface, ResponseInterface, ResponseFactoryInterface, StreamFactoryInterface};
use Psr\Http\Server\RequestHandlerInterface;
/**
* リクエストハンドラ
*/
class HelloHandler implements RequestHandlerInterface
{
public function __construct(
private ResponseFactoryInterface $responseFactory, // コンストラクタプロパティプロモーション
private StreamFactoryInterface $streamFactory, // 引数の末尾カンマ
) {}
public function handle(ServerRequestInterface $request): ResponseInterface
{
$name = $request->getQueryParams()['name'] ?? 'World';
$content = htmlspecialchars("Hello, {$name}!", ENT_QUOTES);
$body = $this->streamFactory->createStream($content);
return $this->responseFactory
->createResponse(200)
->withBody($body);
}
}
$psr17Factory = new Psr17Factory();
// 名前付き引数
$creator = new ServerRequestCreator(
serverRequestFactory: $psr17Factory,
uriFactory: $psr17Factory,
uploadedFileFactory: $psr17Factory,
streamFactory: $psr17Factory
);
$request = $creator->fromGlobals();
$handler = new HelloHandler($psr17Factory, $psr17Factory);
$response = $handler->handle($request);
(new SapiEmitter())->emit($response);
なお、記事執筆時点でPhpStormは対応していない新機能が多いため、警告祭りの状態です。
Webサーバにアクセス
コンテナを立ち上げた状態で、ブラウザを開き http://localhost:8000/?name=Taro にアクセスします。
IDEでは警告がひたすら出ますが、無事に動いていることが確認できます。この喜びはテキストエディタを使ってPHPを書いていた頃を思い出しますね!
Docker Composeにもアクセスログが出ています。
まとめ
Docker ComposeとPHP8のビルトインサーバを使って手軽にPHP8を試す環境を構築しました。 みなさんもPHP8の新機能を試しながら、リリースを楽しみに待つというのはいかがでしょうか?
PHP8の新しいシンタックスに困惑するIDEが見られるのは今のうちだけです‼