前期第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
中身はこちら
compose.yml を書き換えましょう。
vim compose.yml
そして 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
演習
いろいろな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