開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Dockerで手軽にPHP8 RC版を試してみよう
Dockerで手軽にPHP8 RC版を試してみよう

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は対応していない新機能が多いため、警告祭りの状態です。

スクリーンショット 2020-10-16 11.42.28.png
 

Webサーバにアクセス

コンテナを立ち上げた状態で、ブラウザを開き http://localhost:8000/?name=Taro にアクセスします。

スクリーンショット 2020-10-16 11.43.29.png
 

IDEでは警告がひたすら出ますが、無事に動いていることが確認できます。この喜びはテキストエディタを使ってPHPを書いていた頃を思い出しますね!

Docker Composeにもアクセスログが出ています。

スクリーンショット 2020-10-16 11.43.22.png

 

まとめ

Docker ComposeとPHP8のビルトインサーバを使って手軽にPHP8を試す環境を構築しました。 みなさんもPHP8の新機能を試しながら、リリースを楽しみに待つというのはいかがでしょうか?

PHP8の新しいシンタックスに困惑するIDEが見られるのは今のうちだけです‼

  • posted by ナカエ
  • PHP
TOPに戻る