前期第07回 - oddmutou/jugyo-2025kyototech 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-2025kyototech/commit/26da18958291d3ebc7d087b01de05cbf886f1bab#diff-bf84bf23e13d1066e75c9cf7e93d5aaa11ebf89b6b8d81976070a7a7d2cd3069

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

vim compose.yml

https://github.com/oddmutou/jugyo-2025kyototech/commit/26da18958291d3ebc7d087b01de05cbf886f1bab#diff-bf84bf23e13d1066e75c9cf7e93d5aaa11ebf89b6b8d81976070a7a7d2cd3069

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

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-2025kyototech/commit/26da18958291d3ebc7d087b01de05cbf886f1bab#diff-c19016c3561a9c2a2baafca83a9dd052a66801138ebae1f654850b498990df1a

演習

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

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

演習問題

演習問題 1

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

画像ファイルはwgetコマンドでサーバー内にもってくるとよいです。また,その画像ファイルの場所がPHPのdockerコンテナ内から参照できる場所であるか注意しましょう。

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

実装例: https://github.com/oddmutou/jugyo-2025kyototech/commit/5fd75e3217ce70f637f282ca7b4987b0d3d5c226

演習問題 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://107.21.161.45/apcutest.php

実装例: https://github.com/oddmutou/jugyo-2025kyototech/commit/a8b0076d443c74287b5b499ed63b4c93fa470ff4

演習問題 3

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

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

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

実装例: https://github.com/oddmutou/jugyo-2025kyototech/commit/800f0ddf53d5a6e255708d7684631bac904da46c