【パッケージ管理】Composerの使い方

Composerでパッケージ管理する上でおさえておきたい知識について取り上げます。

Composerは、PHP向けのパッケージ(ライブラリ)管理ツールです。かつては、ライブラリ管理としてPEARがよく使われてきましたが、現在ではComposerが一般的に利用されています。

PEARはシステム全体でパッケージが適用されるので複数のプロジェクトを同一環境で扱うとパッケージが共有されてしまいます。それに対し、Composerはプロジェクトごとにパッケージを管理することができます。

Composerをインストール

curlでダウンロードできます。

$ curl -sS https://getcomposer.org/installer | php

ダウンロード後、以下のようにバージョン確認できます。

$ php composer.phar -V
Composer version 1.7.3 2018-11-01 10:05:06

どのディレクトリからでもcomposerを利用できるようにしておきます。

$ sudo mv composer.phar /usr/local/bin/composer
$ 
$ composer -V
Composer version 1.7.3 2018-11-01 10:05:06

設定ファイル作成

composer.json という設定ファイルを作成し、そのファイル内に利用したいパッケージ情報を記述します。

ここでは、以下のように記述しました。

$ cat composer.json 
{
    "require": {
        "pear/log": "*"
    }
}

pear/logというパッケージの最新バージョンを利用したいという意味になります。

バージョン指定方法

一般的なサフィックスは以下のようになります。

サフィックス 概要
-dev 開発中
-rc 公開前
-stable 安定版

バージョンの指定方法などは、下記サイトで詳しく説明してくださっています。
[初心者向け] composerのバージョン指定方法

パッケージの検索方法

利用したいパッケージの名称がわからないときは、https://packagist.org/にアクセスして検索します。

requireとrequire-devの違い

requireは必ず必要なパッケージを指定します。
require-devは開発用だけで必要なパッケージを指定(phpunitなど)します。

パッケージインストール

composer.json が存在するディレクトリで以下コマンドを実行します。

$ composer install

すると、パッケージのインストールが始まり、composer.lockvendorフォルダ が作成されました。

$ ls
composer.json  composer.lock  vendor

composer.lock

composer.lockには、インストールしたパッケージ情報が記載されてます。

composer installを実行するとcomposer.lockに基づいてパッケージをインストールします。初回はcomposer.lockがないので、composer.jsonに基づいてcomposer.lockが作成されたうえでパッケージがインストールされます。

今後、composer.jsonにパッケージを追加した際には、composer updateを実行させます。追加したパッケージがインストールされcomposer.lockも更新されます。

composer installcomposer.lockから判断してパッケージをインストールするので、composer.jsonを更新してもcomposer installですと新規インストールはされない点に気をつけます。

vendorフォルダ

vendorフォルダにはインストールしたパッケージが格納されます。

$ ls vendor/
autoload.php  composer  pear

vendorフォルダ配下にあるautoload.phpをプログラムで読み込むだけでライブラリを利用することができます。

パッケージの利用

Composerでインストールしたパッケージを読み込んでプログラムを実行させてみます。
index.php を作成します。処理は以下のようにします。

$ cat index.php 
<?php   
require_once(realpath(__DIR__) . '/vendor/autoload.php');
 
$filename = realpath(__DIR__) . '/app.log';
$logFile = Log::factory('file', $filename, 'test'); 
$logFile->log('エラー', PEAR_LOG_ERR);

実行すると、app.logというファイルが生成され、pear/logが利用できていることを確認できます。

$ php index.php 
$ ls
app.log  composer.json  composer.lock  index.php  vendor
$ cat app.log 
Nov 25 11:28:07 test [error] エラー

本番環境への配布

今回は、開発環境でcomposer installを実行してパッケージをインストールしました。

本番環境に設置するには、下記2つの方法が考えられます。

  1. 今回作成したvendorフォルダをそのままアップ。
  2. composer.json を本番環境にアップ後、本番環境上でcomposer installを実行する。

通常、2の方法で本番環境に設置します。

開発環境のみで利用するパッケージをrequire-devで指定している場合は、2の方法でインストールする場合に注意が必要です。

composer installはオプションなしですと、requirerequire-devの両方ともインストールしてしまいます。本番環境では、require-devで指定しているパッケージは必要ないのでcomposer install –no-devとオプションをつけてインストールします。

オートロード機能

Composerは、オートロード機能(自動でクラスファイルを読み込む機能)を提供しています。オートロード機能には、psr-4 classmap filesといった方法があります。

名前空間 | PSR-4

psr-4では、「名前空間」と「composer.jsonの存在するディレクトリからの相対パス」の対応付けを行います。

下記例では、Appから始まる名前空間のクラスへアクセスした際に、appディレクトリ配下から対応するクラスファイルを探してロードします。

"autoload": {
    "psr-4": {
        "App\\": "app/"
    }
},

なお、autoloadセクションを編集した場合、下記コマンドを実行して変更を反映させる必要があります。

$ composer dump-autoload

PHPバージョン指定

本番環境のPHPバージョンと違う環境でインストールしたい場合、以下のように設定します。

{
  "config": {
    "platform": {
      "php": "5.5.9"
    }
  }
}

上記指定によって、どの環境でも5.5.9としてインストールしてくれます。

トラブルシューティング

self-update

Composerを利用していると下記のように警告が表示されるときがあります。

Warning: This development build of composer is over 60 days old. It is recommended to upda
te it by running "C:\ProgramData\ComposerSetup\bin\composer.phar self-update" to get the l
atest version.

60日以上アップデートしていないという警告です。composer self-updateを実行しcomposer自体を最新にアップデートします。

ローカルキャッシュ削除

インストールされずに、vendor配下に空のリポジトリフォルダだけできるときがあります。

このようにうまく動作しないときには、ローカルキャッシュを削除すると解決される場合があります。
キャッシュは以下コマンドで削除できます。

$ composer clear-cache

途中で止まる

OOM(Out Of Memory) Killerによって、プロセスが強制終了された可能性があります。OOM Killerは、メモリもスワップも枯渇したとき、適当にプロセスを選んで,強制終了させます。

下記情報など参考にしてみてください。
teratail | Composer – パッケージをインストールしている最中に止まる件です

パッケージ取得が遅い

調査方法

パッケージ取得時に、profileオプションを利用すると、タイムとメモリ使用量が表示されます。

$ composer update --profile

対策 日本国内のミラーサーバからインストールする

hirakさんが作成した日本国内のサーバーからインストールするようにします。

// 確認
$ composer config --list|grep packagist.org.url
[repositories.packagist.org.url] https?://packagist.org
 
// packagistを変更
$ composer config -g repos.packagist composer https://packagist.jp
 
// 反映されたか確認
$ composer config --list|grep packagist.org.url
[repositories.packagist.org.url] https://packagist.jp

元に戻す場合、以下のようにします。

$ composer config -g --unset repos.packagist

対策 prestissimoを利用して並列ダウンロード

同じく、hirakさんが作成したprestissimoを利用するとさらに速くなります。並列ダウンロードしてくれるようです。

$ composer global require hirak/prestissimo