前期第07回 - oddmutou/jugyo-2026kyototech GitHub Wiki

今日の目標

  • 任意の拡張(PHP Extension)をインストールしたdockerコンテナを作れるように

PHPの拡張モジュール

PHPには「拡張モジュール」という概念があります。PHPだけで作ろうとすると大変な機能を,他の言語(例えばC言語など)で実装して組み込むためのものが多いです。

もちろん自分で拡張を作ることもできますが,他の人が作ってくれた拡張モジュールをインストールすることによって簡単にいろいろな機能を使うことが出来ます。

実際にPHPでウェブアプリケーションを作っていく際は,PHPの拡張モジュールを必要な分だけインストールしていきます。

※ 使わないもの拡張モジュールまで大量にインストールしているとディスク容量をどんどん食って重くなるので気をつけましょう。

PHP公式マニュアルに掲載されている拡張モジュールの一覧はこちら

https://www.php.net/manual/ja/extensions.php

PHPの拡張モジュールを使ってみよう

例として,cURL拡張をインストールしてみましょう。

https://www.php.net/manual/ja/book.curl.php

Dockerfileの作成

いままでは,DockerHubにある,php:8.4-fpm-alpine という公式で用意されたイメージをそのまま利用しdockerコンテナを作ってそこでPHPプログラムを動かしていました。

今回から,dockerコンテナ内の環境をカスタマイズしていくため,独自にイメージをビルドし,コンテナを作っていきます。

まずはカレントディレクトリに Dockerfile を作成しましょう。

vim Dockerfile

中身はこちら

https://github.com/oddmutou/jugyo-2026kyototech/blob/5ffcef1664ab9aaaabf031df939553588c24992c/zenki_07/Dockerfile

compose.yml を書き換えましょう。

vim compose.yml

https://github.com/oddmutou/jugyo-2026kyototech/blob/5ffcef1664ab9aaaabf031df939553588c24992c/zenki_07/compose.yml

そして docker compose build したのち docker compose up をしなおすと,PHPプログラムのなかでcURL拡張の関数を使うことが出来ます。

docker compose build を行った際に、buildxのエラーが出た場合は、こちらの手順を試してください→ https://github.com/oddmutou/jugyo-2026kyototech/wiki/%E5%89%8D%E6%9C%9F%E7%AC%AC04%E5%9B%9E#buildx-%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

cURL拡張に関して詳しくは公式マニュアルを読んでください。

https://www.php.net/manual/ja/book.curl.php

例として techcのサイト( https://www.tech.ac.jp/ ) のトップページのhtmlを引っ張ってエスケープして出力するページを作ってみましょう。

vim public/curltest.php

https://github.com/oddmutou/jugyo-2026kyototech/blob/5ffcef1664ab9aaaabf031df939553588c24992c/zenki_07/public/curltest.php

演習

いろいろなPHP拡張をインストールし,自分で使い方を調べ,使ってみましょう。

Dockerfile を編集したあとは,必ず docker compose build を行ったうえで,docker compose upしなおしてください。

演習問題

演習問題 1

Exif https://www.php.net/manual/ja/book.exif.php を導入して,サーバー内にある適当な画像ファイルの形式を表示するWebページを作ってみましょう。

EXIF情報は、写真データだと撮影日時やカメラの情報等がたくさん入っています。何らかの写真データを、前期第5回授業で示した方法で、EC2インスタンスに持ってきましょう。

その画像ファイルの場所がPHPのdockerコンテナ内から参照できる場所であるか注意しましょう。

動作例: http://3.82.66.232/exiftest.php

実装例: https://github.com/oddmutou/jugyo-2026kyototech/commit/f2eab141f51c2177b61131ede2a3b3c44b26c0bd

演習問題 2

APCu https://www.php.net/manual/ja/book.apcu.php を導入して,揮発性のあるアクセスカウンタを作ってみましょう。

「揮発性のある」 ... サーバーの再起動、Dockerコンテナの再起動等で値がリセットされること。

alpine linux において PHP8用の APCu は docker-php-ext-install だけでインストールすることができません。pecl でインストールしたうえで, docker-php-ext-enable を使う必要があります。また,別の異なるパッケージを apk でインストールする必要があります。自分で調べてチャレンジしてみましょう。

APCuは,複数のリクエストでまたがって何らかの値を共有することができます。何らかの計算結果や外部のDBに取りに行っていたような値を複数リクエストで共有させて計算リソースの節約やサーバーの応答速度向上に貢献します。PHPのプロセスがオンメモリで値を持つ(ディスクアクセスが無い)ので非常に高速ですが,PHPの終了時に全てリセットされる・空になるという特性を持ちます。今回はそれ利用し,本来の用途とは異なりますが,揮発性のあるアクセスカウンタのようなものを作ってみましょう。

動作例: http://3.82.66.232/apcutest.php

実装例: https://github.com/oddmutou/jugyo-2026kyototech/commit/cd98aff8ae1becbdcd0d074a7194ece36a91e0b4

演習問題 3

GD https://www.php.net/manual/ja/book.image.php を導入し,フォームで入力されたHTMLカラーコードで塗りつぶされた画像を出力するWebページを作ってみましょう。

GDの導入も docker-php-ext-install だけでは完了しません。一度コンテナ内の docker-php-ext-install gd してみて,その結果のエラーメッセージを自分で確認してそれをもとに調査しチャンレンジしてみてください。

動作例: http://3.82.66.232/gdtest.php

実装例: https://github.com/oddmutou/jugyo-2026kyototech/commit/315254f1287a4314ab0e96d7f298a656df551062