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.php
をreqire
することでクラスのオートロードが可能になります。
パッケージのインストール情報は、composer.json
というファイルに記録されます。
npm ではpackage.json
というファイル名でしたが、composer.json
はinit
せずとも自動的に作成されます。
また、グローバルでもローカルでもこの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.php
をrequire
するだけで、名前空間やクラス名からオートロードしてくれます。
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
コメント