ComposerとPackagistを使ってみる。

PHPって組み込み関数が豊富なのは優秀な点だと思いますが、他のライブラリ使おうと、いざPEARとかいれようとすると結構手間ですよね。レンタルサーバーではroot権限なくてなかなかうまくできなかった経験もあります。
手軽に外部モジュール使いたいなぁっていうときも、PHPは統一して管理されておらず探す手間もかかりました。
(さらに他ライブラリに依存している場合もあるし。。)

そこでComposer(パッケージ管理ツール)とPackagist(パッケージリポジトリ)をつかってみましょう。

たとえば、FTPを操作したいとします。
もちろん、PHPにはFTPを操作する関数がたくさんあります。
FTP 関数

しかし、オブジェクトとして扱えるようにするために、自前でclassを用意するのはちょっと面倒です。
ってことで、そういうクラスが落ちてないか探して、インストールしてみます。

Composer(パッケージ管理ツール)を用意する

まずはComposerを用意します。

今回の環境 : MacOSX 10.8.5, PHP 5.3
※もちろん、WindowsもCygwinやPowerShellなどを使って利用できます。

適当にディレクトリを用意し、Composerを入れてみます。

$ mkdir composer_test 
$ cd composer_test
$
$ # install
$ curl -s getcomposer.org/installer | php
$
$ # ※detect_unicode なerror が出る場合は
$ curl -s getcomposer.org/installer | php -d detect_unicode=Off 

#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/k.murahama/workspace/study/composer_test/composer.phar
Use it: php composer.phar

Composerのインストールが完了しました。

Packagist(パッケージリポジトリ)から探す

Packagistから任意のパッケージを探すことができます。
https://packagist.org/

好きなキーワードで検索してみてください。
「ftp」で検索すると早速みつけました。
https://packagist.org/packages/rjkip/ftp-php
githubへのリンクもありますし、リンク先に説明もあります。手頃そうなので使ってみます。

パッケージをインストールする

コンソールに戻り、composer.jsonを記述します。

$ vi composer.json
{
    "require": {
        "rjkip/ftp-php": "1.0.1"
    }
}

composer.jsonの記述が終わったら、早速インストールします。

$ php composer.phar install 
 
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing rjkip/ftp-php (v1.0.1)
    Loading from cache
 
Writing lock file
Generating autoload files

パッケージのインストールが完了しました。

ツリー表示するとこんな感じ

.
├── composer.json
├── composer.lock
├── composer.phar
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── ClassLoader.php
    │   ├── autoload_classmap.php
    │   ├── autoload_namespaces.php
    │   ├── autoload_real.php
    │   └── installed.json
    └── rjkip
        └── ftp-php
            ├── LICENSE
            ├── README.md
            ├── composer.json
            ├── composer.lock
            ├── example.php
            └── src
                └── FtpPhp
                    ├── FtpClient.php
                    └── FtpException.php

使ってみる

サンプルが含まれているので、サンプルを使ってみます。

$ less vendor/rjkip/ftp-php/example.php
<?php
 
require_once "vendor/autoload.php";
 
use FtpPhp\FtpClient;
use FtpPhp\FtpException;
 
try {
        $ftp = new FtpClient;
 
        // Opens an FTP connection to the specified host
        $ftp->connect("ftp.ed.ac.uk");
 
        // Login with username and password
        $ftp->login("anonymous", "example@example.com");
 
        // Download file "README" to local temporary file
        $temp = tmpfile();
        $ftp->fget($temp, "README", FtpClient::ASCII);
 
        // echo file
        echo "<pre>";
        fseek($temp, 0);
        fpassthru($temp);
 
} catch (FtpException $e) {
        echo "Error: ", $e->getMessage();
}

anonymousでFTPにログインし、READMEを取得する流れです。

実行します。

$ php vendor/rjkip/ftp-php/example.php 
 
 
University of Edinburgh users and others; it is not a free Internet
resource.  If you put files here then please send mail to the FTP server
maintainer (ftpmaster@ed.ac.uk) explaining what should be done with
them.  If notification is not received, the files will be removed.  This
directory is not readable so once files are placed here you will not be
able to see them.  You should also contact the person who you are
passing the files to and provide them with the server name and names of
all the files e.g.:
:
:

ftpで取得したデータが表示されました。

今回はひとつのパッケージのみを利用したのですが、
これが増えていくと、パッケージ管理なしにはつらいです。
依存関係の問題もあります。
Composerを使えば細かいことを気にせず、どんどんパッケージをインストールできます。

また、オートロードファイル(autoload.php)も作成されるので、
includeも

require_once "vendor/autoload.php";

これだけで済みます。

例えばCakephpもComposerからインストールが可能です。
http://book.cakephp.org/2.0/ja/installation/advanced-installation.html
そして、Cakephpでパッケージを利用するためにComposerからインストールも可能です。

個人的には悪しき ”とりあえずinclude_once(require_once)”  から抜けれるのがありがたい。

ComposerはPHP5.3以上で動作可能ですので、PHP5.3以上の環境を利用している場合はどんどん利用していきましょう。