PHP入門 外部ライブラリ(Composer)

PHPでは、標準であまたの関数/クラスライブラリが用意されているというだけではありません。本家以外の開発者が拡張ライブラリをさまざまに提供しており、目的特化した機能をシンプルなコードで実装できます。

Composerは、これら拡張ライブラリ(パッケージ)をインストールするためのパッケージ管理ツールです。PHPライブラリを追加する場合、動作に必要な.phpファイルを手動で配置してもかまいませんが、パッケージ管理ツールを利用することで、次のメリットが得られます。

1、インストール/アンインストールをコマンド1つで行える

Composerを利用することで、パッケージのインストール/アップグレード/アンインストールをコマンド1つで自動化できます。パッケージよっては、動作するために他のパッケージを要求する、いわゆる依存性がある場合があります。シンプルなパッケージであればとくかく、依存性が複雑になってくると手動で解決するのは困難なため、Composerを利用することで依存性を自動的解決してくれます。さらに、アプリで利用するパッケージをあらかじめ定義ファイルとして準備しておくことで、インストールすべきパッケージが増えた場合に、まとめてインストールすることも可能です。

2、アプリ単位にパッケージを管理する

一世代前に普及していたパッケージ管理ツールとして、PEARがあります。PEARは、既定ですべてのパッケージをプラットフォーム共通で管理していました。この手法では、一度、パッケージをインストールすれば、すべてのアプリでパッケージを共有できるというメリットがあります。反面、異なるアプリで「同じパッケージの異なるバージョン」を同居させるのは困難です。特にアプリが特定のバージョンに依存しているケースでは、ライブラリ管理を煩わしいものにす原因ともなっていました。一方、Composerのパッケージ管理はアプリ単位です。よってアプリ動詞で「同じライブラリの異なるバージョン」を利用していたとしてもお互いに影響することはありません。また、アプリコードとライブラリを1つのフォルダ内でまとめて管理できるメリットもあります。

3、ライブラリの自動ローディング機能を利用できる

Composerでは、クラスの自動ロードに対応しています。これを利用することで、クラスライブラリをいちいち個別にインポートしなくても、必要に応じて自動で有効化できます。特に、プログラムから直接呼び出していないライブラリなどはわかりにくく、インポートも忘れやすいです。

4、対応するライブラリが豊富である

Composerに対応したライブラリは、30万以上にも及びます。現在、PHP界隈で利用されている主要なライブラリの大部分は、Composer経由で提供されています。

Packagist(https://packagist.org/)から確認することができます。

Packagistのトップページ
Packagistのトップページ
PHPのライブラリは、大きくC言語、PHPいずれで記述されているかで分類できます。関数/クラスライブラリは、基本的にC言語ベースのライブラリです。C言語で書かれたライブラリは動作が高速である反面、自分でライブラリを作成したい、既存ライブラリのコードを読み解きたいといった場合にハードルが高いという難点があります。近年では、PHPそのもののパフォーマンスが向上していることもあり、拡張ライブラリの大部分はPHPベースで提供されています。C言語ベースのライブラリとしては、古くから提供されているPECL(https://pecl.php.net)が有名です。

Composerのインストール

Windows環境

ダウンロードページ(https://getcomposer.org/download/)の[Windows Installer]からComposer-Setup.exeをダウンロードし、入手したファイルをダブルクリックします。

インストーラーが起動し、インストールモードを訊かれるので「Install for all users(recommended)」(すべてのユーザー向けのインストール)をクリックします。

Composerインストール画面

「ユーザーアカウント制御」ダイアログが表示された場合は、「はい」を選択します。

InstallationOptionsダイアログで「Developer mode」にチェックした場合は、アンインストーラーがインストールされないため、チェック付けずにインストールします。

Composerインストール画面

Settings Checkダイアログでは、Composerで利用するphp.exeへのパスを指定します。

Composerインストール画面

Proxy Settingsダイアログでは、プロキシサーバーを使用している場合のみ、「Use a proxy」にチェックを付けてアドレスを指定します。

Composerインストール画面

Installボタンをクリックします。

Composerインストール画面

Nextボタンをクリックします。

Composerインストール画面

「Finish」ボタンをクリックします。

Composerインストール画面

VSCodeを利用している場合は、VSCodeを再起動します。

Composerのインストールを確認する

以下のコマンドでComposerが正しくインストールされているか確認します。

>composer -v
Composerのバージョンを確認。

ライブラリのインストール

個別のライブラリ「Guzzle」をインストールしてみます。

composer require guzzlehttp/guzzle "~7.3.0"

「guzzlehttp/guzzle」はライブラリ名、「~7.3.0」はバージョン番号です。ライブラリ名は、Packagistから確認できます。バージョン番号は「7.3.0」のように決め打ちでもかまいまぜんが、「~以上~未満」のような幅を持たせることもできます。「~」であれば「7.3.0以上7.4.0未満」の範囲で最新バージョンをインストールしなさいという意味になります。

バージョン表記で利用できる記号

利用例意味
~1.2.01.2.0以上、1.3.0未満
^1.2.01.2.0以上、2.0.0未満
1.2.*1.2.0以上、1.3.0未満
*現在の最新バージョン
Composerでは、セマンティックバージョニングと呼ばれるルールでバージョン番号を管理することが推奨されています。
バージョン番号は「メジャーバージョン.マイナーバージョン.バッチ番号」で表現
バッチ番号は、バグフィックスなどの微小な変更で、機能追加はありません。マイナーバージョンアップは、機能追加を伴いますが、互換性は維持されます。メジャーバージョンアップは互換性が保たれない可能性がある破壊的な変更を意味します。

たくさんのフォルダ/ファイルが生成されますが、利用にあたってこれらを意識する必要はありません。というもの、Composerでは/vendorフォルダ配下にautoload.phpをインクルードするだけで、あとは必要なファイルを自動ロードしてくれます。

アプリで扱うライブラリ情報を管理する(composer.json)

composer.jsonはパッケージ定義ファイルと呼ばれ、現在のアプリで利用するライブラリの情報が記録されています。composer requireコマンドを実行した時に自動で生成されます。

composer.json

composer.jsonを編集することも可能です。例えば、HTML Purifierを追加した例です。

composer.json

次のコマンドでライブラリ更新(不足分は追加する)することができます。

composer update
composer update

composer.jsonを利用することで、異なるコンピューターでも即座にライブラリをインストールできます。composer.jsonをアプリルートに配置した状態、次のコマンドを実行します。

composer install

これで、composer.jsonに定義されたライブラリ情報に基づいて、必要なライブラリを一括でインストールしてくれます。

composer.lockの役割

composer.jsonによく似たファイルで、composer.lockがあります。

composer.json
composer.json
composer.json
composer.lock

composer.lockとは、インストールのタイミングでcomposer.jsonの内容を解析し、実際にインストールされたバージョンを管理しています。Composerによって管理されるファイルなので、開発者が編集することはありません。

composer.lockがある場合にはその情報に基づいて、ない場合はcomposer.jsonを見てライブラリをインストールします。つまり、特定のタイミングでインストールされたライブラリを忠実に再現します。一方、composer updateコマンドはcomposer.jsonの記述を優先します。つまり、「^」「~」「*」などのバージョン表記がある場合には、以前インストールしたよりも新しいバージョンがインストールされる可能性があります。そのため、インストールすべきライブラリのバージョンを完全に再現したい場合は、composer.json/composer.lockの双方を共有して、composer installコマンドを利用したほうがよいでしょう。

composerコマンドのその他のサブコマンド

composerコマンドでは、require/install/updateの他に次のようなサブコマンドが用意されています。

composerコマンドの主なサブコマンド

コマンド概要
composer require –dev package指定されたライブラリpackageを開発専用としてインストール
composer self-updateComposer自身を更新
composer validatecomposer.jsonに誤りがないか検証
composer search name指定された名前nameにマッチするライブラリの情報を取得
composer show -iインストール済みライブラリpackageの情報を表示
composer show -pプラットフォームパッケージ(PHP拡張)の情報を表示
composer show package指定されたライブラリpackageの情報を表示

composer requireコマンドの–devオプションは、開発時にだけ利用するライブラリをインストールするために利用します。–devオプション付きでインストールされたライブラリは、composer.jsonでもrequire-devキー配下で管理されます。

composer.json

このように開発向けライブラリと実行向けライブラリを区別しておくことで、あとで別環境でインストールする際に開発向けライブラリだけを除外するということが可能になります。具体的には、次のコマンドを実行します。

>composer install --no-dev