phpのモジュール管理はcomposerにお任せ!


どうもこんばんは。早速ですが、phpでpearモジュールを使う時、どうしていますか?一般的には、pear install で 導入しますよね。このような方法でpear モジュールを導入した場合には、モジュールは、/usr/share/pear などにインストールされて、php が デフォルトでincludeするので、特に require_once などで読み込まなくても使えるようになり大変便利ですが、
少し問題があって下記のような事が考えられます。

 

  1. pear install を 行うときは、root権限必須
    インストール場所がアプリケーションの領域ではなく、/usr/shar/pear のような共有のパスにインストールされる為、rootが必要になります。
  2. /usr/share/pear にインストールされるので、依存関係が見えづらい
    自分のサービスに必要なライブラリが把握出来ず、サーバ移行などでライブラリが足りなかったり、もしくは、使っていないものまで移行先に持っていくなど、あるあるネタかと思います。
  3. モジュールのバージョンをあまり意識しなくなってしまう
    とくに何も考えなければ、その時の最新バージョンをが導入されるので、バージョンを意識することがなくなり次に同じ作業をした時、動かないなど予想外のことが発生する可能性があります。
上記のことから、pear で モジュールをインストールすると、管理が煩雑になりがちです。また、アプリケーションに依存するものはアプリケーションと一緒にバージョン管理するのが望ましいです。そうすることでアプリケーションの移植性が飛躍的に向上するでしょう。

Composer を使おう

最近流行りの、Composer を使ってモジュールを管理すると上記のような悩みが一気に解決します。

【Composer の特徴】

  • json に必要なライブラリを列挙して、インストールを実行するだけで、任意のディレクトリにモジュールを導入することができます。よくあるパターンに当てはめると下記のような構成がとれます。
    /home/user/contents/htdocs       ★DocumentRoot
    /home/user/contents/ci                ★codeignitor
    /home/user/contents/php_lib    ★ここに入れられる!
  • root権限不要でインストールできる。
  • 依存関係にあるモジュールも同時にインストールされるので依存関係の解決に苦労することもありません。
  • 任意のディレクトリにインストールすることが可能なので、モジュールごとsvn,git等でバージョン管理することができます。
    また、モジュールのバージョン管理は、2種類の方法があると思います。各自のスタイルで。
    -Composer で導入したモジュールごとバージョン管理システムで管理する。
    -json で作成した、リストのみをバージョン管理する。
  • コマンド一発でComposer の導入が可能
  • Composerで入れた複数のモジュールは、一括で読み込み可能です。
    require_once(“../php_lib/vendor/autoload.php”);
  • Pear以外のモジュールもComposerで導入できます。- packagist (https://packagist.org/)
    そもそもこれが、Composerのメインレポジトリです。- 独自のモジュールを作成可能
    svnやgitをレポジトリとして配信できます。-Composer形式に対応していないライブラリもComposerで管理可能
    zipをダウンロードしてインストールするようなモジュールなども、json で定義するとインストール可能です。

【Composerを使ったモジュールのインストール】

今回は、pear上のよさ気なモジュールを2つピックアップしてインストールして検証します。

  • pear/Services_ShortURL
    =>各短縮URLのAPIが簡単に扱えるモジュール(参考:http://blog.fff.io/2011/07/bitly.html)
  • pear/log
    =>ログファイルを簡単に作成出来るモジュール(参考:http://itpro.nikkeibp.co.jp/article/COLUMN/20070402/267131/)

1)Composerのインストール

モジュールを格納するディレクトリで、 インストールコマンドを実行します。composer.phar というファイルができれば成功です。

[user~/contents]$pwd
/home/user/contents
[user~/contents]$mkdir php_lib
[user:~/contents]$cd php_lib/
[user~/contents/php_lib]$curl -s http://getcomposer.org/installer | php
[・・・・中略・・・・]
Composer successfully installed to: /home/user/contents/php_lib/composer.phar
Use it: php composer.phar
[user~/contents/php_lib]$ls -la
total 1020
drwxrwxr-x. 2 user user 4096 Nov 21 01:52 .
drwxr-xr-x. 4 user user 4096 Nov 21 01:52 ..
-rwxr-xr-x. 1 user user 1035123 Nov 21 01:52 composer.phar
 

2)インストールするモジュールをjsonファイルに定義する

composer.pharと同じフォルダに、composer.json を作成します。内容は下記の通りです。詳細は省きますが、pear のレポジトリから、最新のバージョンを取得するという記述です。


{
"repositories": [
{
"type": "pear",
"url": "http://pear.php.net/"
}
],
"require": {
"pear-pear.php.net/Services_ShortURL" : "*",
"pear-pear.php.net/log" : "*"
}
}

3)モジュールのインストール実行

php 経由で composer.pharを実行します。下記の通り、コマンドを実行すると pear から依存関係ごと、モジュールがダウンロードされます。


[user:~/contents/php_lib]$php composer.phar install
Loading composer repositories with package information
Initializing PEAR repository http://pear.php.net
Installing dependencies (including require-dev)
- Installing pear-pear.php.net/net_url2 (2.1.0)
Downloading: 100%
- Installing pear-pear.php.net/xml_util (1.2.3)
Downloading: 100%
- Installing pear-pear.php.net/console_getopt (1.3.1)
Downloading: 100%
- Installing pear-pear.php.net/structures_graph (1.0.4)
Downloading: 100%
- Installing pear-pear.php.net/archive_tar (1.3.13)
Downloading: 100%
- Installing pear-pear.php.net/pear (1.9.5)
Downloading: 100%
- Installing pear-pear.php.net/http_request2 (2.2.1)
Downloading: 100%
- Installing pear-pear.php.net/services_shorturl (0.3.1)
Downloading: 100%
- Installing pear-pear.php.net/log (1.12.8)
Downloading: 100%
Writing lock file
Generating autoload files

インストールが完了すると、 ファイルが増えているのが確認出来ます。

composer.lock …
インストールしたモジュール名前やバージョンなどの情報がjson形式で記載されています。今後 install コマンドを実行しても、インストールされるバージョンはcomposer.lock に記載されたバージョンに固定されます。全てのパッケージを最新にするには、composer updateを利用します。

vendor …
インストールされたモジュール群が格納されているディレクトリです。


[user~/contents/php_lib]$ls -la
total 1040
drwxrwxr-x. 3 user user 4096 Nov 21 19:16 .
drwxr-xr-x. 4 user user 4096 Nov 21 01:52 ..
-rw-r--r--. 1 user user 310 Nov 21 16:45 composer.json
-rw-rw-r--. 1 user user 11045 Nov 21 16:47 composer.lock
-rwxr-xr-x. 1 user user 1035123 Nov 21 01:52 composer.phar
drwxrwxr-x. 5 user user 4096 Nov 21 16:47 vendor

【モジュールを使ってみよう】

Composerでインストールしたモジュールを利用して、GETで短縮したいURLを渡せば変換して返してくれ、処理の結果をログに残す単純なアプリを作って説明します。要は、なにがいいたいかというと、?require_once で?autoload.php を呼ぶと、それだけで簡単にモジュール使えるってことです。

<?php

  //Composerでインストールしたモジュール群の呼び出しはこれ一発!
  require_once(dirname(__FILE__).'/../php_lib/vendor/autoload.php');

  //[pear/log]ログの吐き出し先の定義
  $file = &Log::factory('file', dirname(__FILE__).'/../logs/shorturl.log', 'ShortURL');

  //URLをgetで受け取る
  $longUrl = empty($_GET['url']) ? false  : htmlspecialchars($_GET['url']);

  //URLのチェック
  if ( !$longUrl OR !preg_match('/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $longUrl) ){
        //URL形式が不正な場合は、ログ吐いて終了
        $file->log('[False] '.'pram error');
        echo "err:pram";
        exit ;
  }

  //[pear/Services_ShortURL]URL短縮モジュール使ってみる。(超簡単!ふふふw)
  $api      =  Services_ShortURL::factory('Googl');
  $shortUrl =  $api->shorten($longUrl);

  //短縮後のURLチェック
  if ( $shortUrl AND preg_match('/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/', $shortUrl) ){
      //短縮URLを表示して 成功ログを吐く
      echo $shortUrl."\n";
      $file->log('[Success] '.$longUrl."\t=>".$shortUrl);
  }else{
      //変換に失敗した場合はURL形式が不正な場合は、ログ吐いて終了
      echo "err:service faild";
      $file->log('[False] '.$longUrl);
      exit ;
  }

実行例)

[user:~]$curl http://ishii.local.mfro.net/sturl.php?url=http://yahoo.co.jp/
http://goo.gl/c9pN

無事動きました!


[user:~/contents/logs]$cat shorturl.log
<pre>Nov 21 20:03:44 ShortURL [info] [False] pram error
Nov 21 20:03:48 ShortURL [info] [Success] http://yahoo.co.jp/ =>http://goo.gl/c9pN

ログも出力されました!

 

以上、でcomposerの基本的な使い方の説明を終わりますですが、AWSのSDKもComposer経由でインストールが可能です。また、Peclモジュールは、コンパイルが必要なので、composerではインストール出来ません。インフラもコードで管理しようという時代。モジュールインストールもコード化するのが管理上ベターでしょう。

【参考サイト】

モジュールの更新方法など、上記では語り切れなかった内容は、下記のようなサイトが大変役に立ちます。ご確認ください。

○AWSのSDKインストール方法参考
http://docs.aws.amazon.com/aws-sdk-php/guide/latest/installation.html

○Composerの基本的な使い方
http://kohkimakimoto.github.io/getcomposer.org_doc_jp/doc/01-basic-usage.html

○PHPパッケージ管理ツール「Composer」入門 第1回
http://codezine.jp/article/detail/7827?p=2