PHP のライブラリ管理ツール Composer とは

フレームワークプログラミング

Composer とは、PHP 関連のパッケージやライブラリを管理し、インストールを楽にするコマンドラインツールです。
パッケージの依存関係を管理し、必要な他のパッケージをまとめてインストールしてくれます。
仕組み自体はほぼ npm と同様ですが、クラスのオートロードまで管理してくれるため非常に便利です。

Composer で管理されているパッケージの一覧は、Packagist という公式サイトで確認することができます。
もちろん誰でも自身のパッケージを公開することが可能です。

参考: Node.js のパッケージ管理ツール npm とは

Composer のインストール
公式サイトに詳しいインストール手順がありますので、そちらをご覧ください。

Download Composer
https://getcomposer.org/download/
※PHP がすでにインストールされている必要があります。

Windows ではインストーラが用意されていますので、そちらを利用するのが良いでしょう。
ちなみに CentOS では、yumでもインストール可能です。
以下は、PHP 7.3 系の場合のコマンド例です。

# Remi Repositoryは適宜指定してください
>yum install --enablerepo=remi,remi-php73 php-pecl-zip composer
>dnf install php-pecl-zip composer # CentOS8


インストール後、カレントディレクトリにcomposer.pharというファイルが作成されます。
こちらが Composer のコマンドファイルになるので、PATHの通っているディレクトリに移動(および変名)します。

>mv composer.phar /usr/local/bin/composer
>composer -V

Composer のバージョン等が表示されれば、インストール完了です。


グローバルインストールとローカルインストール
Composer も npm のようにグローバルインストールとローカルインストールがあります。
Composer の作業ディレクトリは基本的にはカレントディレクトリになりますが、グローバルインストールの場合はCOMPOSER_HOME環境変数によって作業ディレクトリを固定化することができます。

>export COMPOSER_HOME=/home/myProject

パッケージのインストールは以下のコマンドです。

>composer [global] require [パッケージ名]

作業ディレクトリにcomposer.jsonおよびcomposer.lockファイルが生成され、vendorディレクトリ配下にパッケージ本体がインストールされます。
プログラム上でvendor配下にあるautoload.phpreqireすることでクラスのオートロードが可能になります

パッケージのインストール情報は、composer.jsonというファイルに記録されます。
npm ではpackage.jsonというファイル名でしたが、composer.jsoninitせずとも自動的に作成されます。
また、グローバルでもローカルでもこのcomposer.jsonは作成され、これを共有することで同等の環境をすばやく再現できます。
(npm のグローバルインストールでは、package.jsonにパッケージ情報が蓄積されません)

環境の再現方法は、composer.jsonが存在するディレクトリでcomposer installするだけです。

>composer [global] install # 新規インストール
>composer [global] update # 既存環境のアップデート


バージョンを固定するロックファイルcomposer.lockもあります。
このファイルが存在していれば同一のバージョンがインストールされます。

その他、主なコマンドオプションは以下の通りです。

>composer [global] init # composer.json を生成
>composer [global] update [パッケージ名] # インストール済のものより新しいものをインストール
>composer [global] remove [パッケージ名] # パッケージを削除します(composer.json も更新)
>composer [global] show # インストール済のパッケージ一覧
>composer [global] update --dry-run [パッケージ名] # 依存パッケージを確認
>composer self-update # composer自体をアップデート


開発者用パッケージの分離
Composer でも npm と同様に開発者用のパッケージを区別させることができます。

>composer [global] require 開発者用パッケージ名  --dev

--devオプションを使用してインストールしたパッケージはcomposer.json内で別々に管理されます。

{
	"require": { // 本番用パッケージ
		"sendgrid/sendgrid": "^7.8",
	},
	"require-dev": { // 開発用パッケージ
		"phpunit/phpunit": "^5.3",
		"phpspec/phpspec": "~2.1"
	}
}

通常、このcomposer.jsonを別環境に持ってきてcomposer installするとすべてのパッケージがインストールされます。
本番環境のみ構築したい場合は、--no-devオプションを使用することで開発者用のパッケージをインストールしなくてすみます。


オートロード
Composer はオートロードをサポートします。
プログラム側でvendor配下のautoload.phprequireするだけで、名前空間やクラス名からオートロードしてくれます。

require_once 'vendor/autoload.php';

このautoload.phpを利用して自身の作成したクラスもオートロードさせることができます。
方法としては、composer.jsonにオートロードの設定を記述し、以下のコマンドを実行して記述した内容をautoload.phpに反映させます。

>composer dumpautoload


以下、composer.jsonのオートロードの設定方法を下記のようなディレクトリ構成にある場合を例示して説明します。

├ composer.json
│
├ vendor/
│  ├ composer/
│  └ autoload.php
│
├ misc/
│  ├ foo1.php
│  └ foo2.php
│
└ src/
    ├ cmn
    │  ├ bar1.php
    │  └ bar2.php
    │
    └ util/
        ├ hoge1.php
        └ hoge2.php


名前空間のオートロード
namespaceを利用したオートロードです。
namespace名とディレクトリの対応を設定します。

{
	"autoload": {
		"psr-4": {
			"Sample\\apl\\": "misc",
			"cmn\\": "src/cmn",
			"util\\": "src/util"
		}
	}
}

“psr-4”: {
オートロードのルールの名称です。
固定値です。

“Sample\\apl\\”: “misc”,
namespace Sample/apl;miscディレクトリから探し出します。
起点となるディレクトリはvendorの親ディレクトリです。

“cmn\\”: “src/cmn”,
namespace cmn;のクラスをsrc/cmnディレクトリから探し出します。

“util\\”: “src/util”
namespace util;のクラスをsrc/utilディレクトリから探し出します。


クラスのオートロード
当該クラスを探しに行くディレクトリ(ファイル)を列挙する形で設定します。

{
	"autoload": {
		"classmap": {
			"misc/",
			"src/cmn/",
			"src/util/",
			"src/util/hoge2.php" # ファイル名も指定可能
		}
	}
}

“classmap”: {
クラスマップの名称です。
固定値です。
ここに羅列されたディレクトリの中からクラスを探し出します。
ファイル名を直接指定もできます。


メモリーエラーが発生する場合
Composer を利用したパッケージのインストール時、あるいは Composer 自身をインストールする際に以下のエラーが発生する場合があります。

Installation failed, reverting ./composer.json to its original content.
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details
  [ErrorException]
  proc_open(): fork failed - Cannot allocate memory

メモリーの割り当てに失敗しています。
swap を作成しましょう。

>free # freeコマンドで確認
              total        used        free      shared  buff/cache   available
Mem:        1006900      206032       79520        1064      721348      649532
Swap:             0           0           0

>dd if=/dev/zero of=/swapfile bs=1M count=2048 # 2GB(1MB x 2048)のswap割り当て
2048+0 レコード入力
2048+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 31.5494 秒、 68.1 MB/秒

>chmod 600 /swapfile
>mkswap /swapfile # スワップファイル作成
スワップ空間バージョン 1 を設定します。サイズ = 2 GiB (2147479552 バイト)
ラベルはありません, UUID=06dd086c-f672-409d-b89c-f9ffa3dfb02d

>swapon /swapfile # スワップファイル有効
>swapon -s # 確認
ファイル名                              タイプ          サイズ  使用済み 
優先順位
/swapfile                               file            2097148 0       -2

>free # 確認
              total        used        free      shared  buff/cache   available
Mem:        1006900      192792       81824        1000      732284      662660
Swap:       2097148           0     2097148

コメント