Composerを使ってみた

PHP版のBundlerみたいなもの。
最近この類の異常に目にするようになりました。
AWSの入門記事でも書きましたが、Composerに関する部分だけ抜粋してまとめます。
なので重複する文面が多いです。

Composerのインストール

curl -sS http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /var/www/aws/s3/composer.phar
Use it: php composer.phar

ここで composer.phar がカレントに作成されます。

composer.json の作成

jsonファイルを作成します。Gemfileみたいなものです。

{
"require": {
"aws/aws-sdk-php": "*"
}
}

Composerで依存パッケージのインストール

ここで composer.json に記述された依存パッケージがインストールされる。
カレントディレクトリの vendor ディレクトリにインストールされます。 .gitignorecomposer.phar とか vendor/ は外したほうがいいかもしれませんね。

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.4.0)
Loading from cache
- Installing guzzle/guzzle (v3.7.4)
Loading from cache
- Installing aws/aws-sdk-php (2.4.11)
Loading from cache
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

不足しているシステムパッケージがあったらyumとapt-getを使ってインストールします。

さらにパッケージ追加

今度はlog4phpを使いたくなったとしましょう。
composer.json は以下のようになります。

{
"require": {
"aws/aws-sdk-php": "*",
"apache/log4php": "2.3.0"
}
}

bundle installみたいな感覚でやってみましたが

$ php composer.phar install
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files

lockファイルと一致しないと怒られてしまいました。
こういうときはupdateしないといけないみたいです。
ただ、

php composer.phar update

とするとバージョンがロックされたものについてまでアップデートがかかってしまうので、今回はlog4phpに関係するものだけインストールしてほしいので以下の様な感じにします。

php composer.phar update apache/log4php
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing apache/log4php (2.3.0)
Cloning 8c6df2481cd68d0d211d38f700406c5f0a9de0c2
Writing lock file
Generating autoload files

実際にアプリで使ってみる

ここでは追加でインストールしたlog4phpを使っています。
AWS SDKは使っていません。ゴメンなさい。
カレントディレクトリに vendor ディレクトリがあることを確認してください。

<?php
// composer.json に記述されたパッケージがインストールされた
// Vendorディレクトリの中身をロードするおまじない
require 'vendor/autoload.php';
$log = Logger::getLogger("hogehoge");
$log->info("Hello, World!");

実行してみます。
今回はコマンドラインです。

$ php hello_composer.php
INFO - Hello, World!

参考サイト

  1. gist:7838085
  2. Composer: how can I install another dependency without updating old ones? – Stack Overflow
  3. PHP – composer の「Warning: The lock file is not up to date ~」 – Qiita [キータ]
  4. Composer

AWS SDK for PHP 2 入門(Composer編)

今年の春頃に無料枠で契約してそのままになってたAWSをもう少し本格的に習得してみようと最近しこしこと本やらネットやらで勉強していました。
バックアップとかスケールアウト、障害対応であまり頭を悩ませなくて良さそうなので最近とても魅力的に見える。
インフラまわりの管理は意外と大変なんですよね・・・。

とりあえずAWS Management ConsoleからEC2のインスタンスを立ち上げたり、S3にファイルをアップロードしたり、Route53でDNSゾーンを管理したりしてみてそれっぽく使うことはできるようになったけど、どうも何かが違う気がする。
機能が多すぎて使いどころや、定石みたいなのがわからないので体系的な知識を得るために本を購入してみました。
こういうのから基本的な考え方を吸収していけるのはいいね。

やっぱりAWSの着目すべき点はインフラに統合されたAPIが提供されているところにあるんですかね。
実際にS3のAPI叩いてみたけど、少しずつ面白さがわかってきた。少しだけね。

躓いたところ

さて、一番最初のサンプルを作成しようと思って、一番最初に躓いたのですが、本書ではAWS SDK for PHPをインストールするように言われているのですが、どこからダウンロードしたらいいのかよくわかりませんでした。

ここで aws.phar というファイルがダウンロードできるのですが、これをどうしたらいいのかわからない・・・。

こちらも aws.phar。pharという拡張子はPHP Archiveの略のようなのですが、どうもこのファイルをインクルードして使うようです。

いろいろ試行錯誤してやっとネットに掲載されていた簡単なサンプルが動くようになったのですが、どうも本のサンプルと書き方がぜんぜん違うように思えて、よくよく調べてみたら本に載っているのはバージョン1のもののようです。

バージョン1で合わせてサンプルをやっていってもいいのですが、どうせ今後は2系にシフトしていくので、2系のイディオムに読み替えながら進むようにしました。

上のようにpharをインクルードしてもいいのですが、AWS SDK for PHP 2開発ではComposerを併用して開発するのが推奨されているようなので、それに従います。

それでは始まり始まり。

環境

VagrantとChef Soloあたりでちゃちゃっと作れちゃうと思います。
それか普通にEC2のインスタンスや他の既成の仮想マシンにインストールすればいいと思います。

  • CentOS6.4 x64 または Ubuntu 12.04 LTS
  • Apache2
  • PHP5.3.3

Composerのインストール

ComposerはRailsのBundlerみたいなもんですね。

curl -s http://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...
Composer successfully installed to: /var/www/aws/s3/composer.phar
Use it: php composer.phar

ここで composer.phar がカレントに作成されます。

composer.json の作成

jsonファイルを作成します。Gemfileみたいなものです。

{
"require": {
"aws/aws-sdk-php": "*"
}
}

Composerで依存パッケージのインストール

ここで composer.json に記述された依存パッケージがインストールされる。
カレントディレクトリの vendor ディレクトリにインストールされます。 .gitignorecomposer.phar とか vendor/ は外したほうがいいかもしれませんね。

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.3.7)
Downloading: 100%
- Installing guzzle/guzzle (v3.7.4)
Downloading: 100%
- Installing aws/aws-sdk-php (2.4.11)
Downloading: 100%
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

不足しているシステムパッケージがあったらyumとapt-getを使ってインストールします。
たぶんUbuntuの場合そのままだとエラーになると思います。詳しくは下のトラブルシューティングへ。

最初のAWS SDK for PHP 2プログラミング

ここではバケットの一覧表示をするプログラムを書いてみたいと思います。
プログラムは以下のサンプルを参考にさせていただきました。

include/awssecure.inc.php

AWSのアクセスキーを設定します。これは漏れたらやばいので別ファイルとして管理するといいです。
最初アクセストークンはどこで取得すればいいんだろう?って思っていたのですが、以下で取得するようです。

ただ、警告にもあるとおり、ここで発行されるアクセストークンはAWSアカウントに直接紐づく rootユーザーみたいなとんでもない特権レベル を持っているので、あんまりおすすめされません。

なので、IAM(Identity and Access Management)でユーザーとグループを作成してそこでクレデンシャルを発行するのがスマートなようです。

ちなみに、1ユーザーあたり2つのクレデンシャルしか発行できないみたいです。

<?php
// AWSアクセストークン
$config = array(
'key'    => 'AKIAIOSFODNN7EXAMPLE',
'secret' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
);

gitで管理するときはこのファイルのトラッキングを外しましょう。
ただ、テンプレート的なファイルだけは残っていてほしいのでインデックスから無視するだけにします。

git update-index --skip-worktree include/awssecure.inc.php

list_buckets.php

以下が本命のプログラムとなります。

<?php
error_reporting(E_ALL);
// Load Composer Vendor Modules
require_once('vendor/autoload.php');
// AWS Credential
require_once('include/awssecure.inc.php');
use Aws\S3\S3Client;
$s3 = S3Client::factory($config);
$blist = $s3->listBuckets();
foreach ($blist['Buckets'] as $b)
{
echo "${b['Name']}: created at ${b['CreationDate']}\n";
}

実行してみる

コマンドラインからでも、ブラウザ経由でもどっちでも大丈夫だと思います。

$ php list_buckets.php
hogehogehoge: created at 2013-11-22T10:50:47.000Z
sitepoint-aws-cloud-book-wnoguchi: created at 2013-12-04T23:06:19.000Z
blhablahblah: created at 2013-12-02T03:48:40.000Z
foobarbar: created at 2013-11-09T12:13:07.000Z

これでOKです。

とりあえずAWS SDKを使ったプログラミングを始めようと思って躓いたところをまとめてみました。

トラブルシューティング

CentOSのエラー

以下は実際にXMLがからむAWS SDKを呼び出している時に発生していた気がします。

php create_bucket.php ppp
PHP Fatal error:  Class 'XMLWriter' not found in /vagrant/src/s3/vendor/guzzle/guzzle/src/Guzzle/Service/Command/LocationVisitor/Request/XmlVisitor.php on line 201

以下のようにして対応

yum -y install php-xml

Ubuntuのエラー

Composerの依存パッケージをインストールしようとしたらエラーになりました。

php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- aws/aws-sdk-php 2.4.0 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.1 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.10 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.11 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.2 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.3 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.4 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.5 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.6 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.7 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.8 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.4.9 requires guzzle/guzzle ~3.7.0 -> satisfiable by guzzle/guzzle[v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.3.4 requires guzzle/guzzle ~3.6.0 -> satisfiable by guzzle/guzzle[v3.6.0].
- aws/aws-sdk-php 2.3.1 requires guzzle/guzzle ~3.4.3 -> satisfiable by guzzle/guzzle[v3.4.3].
- aws/aws-sdk-php 2.3.2 requires guzzle/guzzle >=3.4.3,<4 -> satisfiable by guzzle/guzzle[v3.4.3, v3.5.0, v3.6.0, v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.3.3 requires guzzle/guzzle >=3.4.3,<4 -> satisfiable by guzzle/guzzle[v3.4.3, v3.5.0, v3.6.0, v3.7.0, v3.7.1, v3.7.2, v3.7.3, v3.7.4].
- aws/aws-sdk-php 2.3.0 requires guzzle/guzzle ~3.4.1 -> satisfiable by guzzle/guzzle[v3.4.1, v3.4.2, v3.4.3].
- aws/aws-sdk-php 2.2.0 requires guzzle/guzzle ~3.3.0 -> satisfiable by guzzle/guzzle[v3.3.0, v3.3.1].
- aws/aws-sdk-php 2.2.1 requires guzzle/guzzle ~3.3.0 -> satisfiable by guzzle/guzzle[v3.3.0, v3.3.1].
- aws/aws-sdk-php 2.1.1 requires guzzle/guzzle ~3.2.0 -> satisfiable by guzzle/guzzle[v3.2.0].
- aws/aws-sdk-php 2.1.2 requires guzzle/guzzle ~3.2.0 -> satisfiable by guzzle/guzzle[v3.2.0].
- aws/aws-sdk-php 2.1.0 requires guzzle/guzzle ~3.1.2 -> satisfiable by guzzle/guzzle[v3.1.2].
- aws/aws-sdk-php 2.0.0 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- aws/aws-sdk-php 2.0.1 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- aws/aws-sdk-php 2.0.2 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- aws/aws-sdk-php 2.0.3 requires guzzle/guzzle 3.0.* -> satisfiable by guzzle/guzzle[v3.0.0, v3.0.1, v3.0.2, v3.0.3, v3.0.4, v3.0.5, v3.0.6, v3.0.7].
- guzzle/guzzle v3.7.4 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.7.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.6.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.5.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.4.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.4.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.4.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.3.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.3.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.2.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.1.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.7 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.6 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.5 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.4 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.3 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.2 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.1 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- guzzle/guzzle v3.0.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
- Installation request for aws/aws-sdk-php * -> satisfiable by aws/aws-sdk-php[2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.1.0, 2.1.1, 2.1.2, 2.2.0, 2.2.1, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.4.0, 2.4.1, 2.4.10, 2.4.11, 2.4.2, 2.4.3, 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8, 2.4.9].

PHPcurl拡張がないって言ってる気がします。

sudo apt-get -y install php5-curl

もういっかい。

php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
- Installing symfony/event-dispatcher (v2.3.7)
Downloading: 100%
- Installing guzzle/guzzle (v3.7.4)
Downloading: 100%
- Installing aws/aws-sdk-php (2.4.11)
Downloading: 100%
symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

うまくいきました。

参考サイト

S3開発に関しては以下のドキュメントが良さそう。

その他。

参考文献

msysGitのマルチバイトファイルパス

つかれた。
msysGitであげた不具合のお返事がなくなって、正直みんなこのあたりで困ってないんだろうなー、パッチ送ってもOS依存の PATH_MAX まわりがからんでるから容易には取り込まれないだろうし、3流プログラマのぼくには修正は難しくて、とりあえず最適化無効にしてビルドすれば動くからそれで諦めてたんだけど、最近だれかがまたパッチ投げてくれたっぽい。末尾をゼロ埋めする strlcpy を使うようにしてるみたい。ものすごい長い英文で議論が始まってついていけないので、遠くから見る。Reported-byがついてたから微妙に嬉しい。
うむ、つかれた。

Route53設定続編

お名前.comでネームサーバーを変更してみた。
digってみたらSOAがRoute53に移って、ちゃんとpingも通る。
セカンダリネームサーバーとか普通にできてるし、やばいな、これは。

NSレコードが4つもあって「冗長化?誰に向かっていってんの???」って感じ。

Bitcasa

アップロードに失敗したのが断片化してる。。。
巨大なファイルのアーカイブだけに限定したほうが良さそう。

烏龍茶の悲劇

水が尽きたので会社の烏龍茶飲みまくってたら水分補給にならなくて、
余計に喉乾いてやばかったです。
脱水症状こわい。
今度から水にしよう。
烏龍茶だとパフォーマンスも低下するし。

今日も疲れた。

今日のTips

teeコマンド意外と有能ってこと。

$ vagrant ssh-config --host yunocchi | tee -a ~/.ssh/config
Host yunocchi
HostName 127.0.0.1
User vagrant
Port 2200
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/noguchiwataru/.vagrant.d/insecure_private_key
IdentitiesOnly yes
LogLevel FATAL

Bitcasa

  • 年間無制限プラン契約したけど、アップロード速度は問題ない。
  • 容量7EB超えヤバイ
  • ダウンロードはまだ試してない
  • 主にあまり参照しないような大容量のファイルのバックアップに使う
  • 頻繁に使用するファイルはDropBoxがよさげ

雑記

勉強会行ってみたい。

最近金欠なので、なんかシェアウェアか何か作れないかなあ。
そんなアイディアがうかばないのがちょっとなぁ。

VMware WorkstationとかVMware Fusionは最低限ほしい。

chef+Vagrantの勉強と応用情報の勉強が急務であります。