みんな大好き(?)composer。
これを使って必要なライブラリを落としてくるのはとても便利なんだけど、
どうせvendor
ディレクトリに全部まとめてファイルが入ってくれるなら、
これを圧縮して1個のファイルにし解凍することなく読み込むようにしたい。
そこで便利なのがPharで、 圧縮したファイルを展開することなく読み出すことが出来る便利なやつ。 概念はJAR(Java ARchive)に由来しているという。
composerもcomposer.pharというのをダウンロードして使うが、 あれもphpのファイル群を一個のpharファイルとして圧縮したもので、
$ php composer.phar install
と実行するときにcomposer.pharの中身を読み込んで第2引数で何を実行するか判定している。 PHPStormとか適当なIDEならcomposer.pharの中身を見ることが出来るので見てみたらいいと思う。 探せばgitに圧縮前のソースとかあるんじゃないか(探してない)。 生データに展開することもPharクラスを使えばできるはず(やってない)。
というわけでpharファイルを作りたかったんだけども、実は昨日一日かけて結局できなかったので、
違う方法で圧縮*1
して一個にまとめたvendor
をpharストリームから読み込む方法を書く。
やり方
Phar の仕組みを利用した PEAR モジュールのもっと便利な使い方 - 肉とビールとパンケーキ by @sotarok
このサイトではpharファイルを作るのではなく、既にtgz形式で圧縮されたファイルをpharストリームから読み込んで 使う方法について書いている。
これを参考に
vendor
下をtgz形式に圧縮require_once 'phar://'~
で読み込んで動作確認
をやってみた。
動作確認には
Slim ViewsでSmartyテンプレートを呼び出す - わすれっぽいきみえ
で書いたSlimのアプリケーションを使ったので、環境やディレクトリ構成については省略する。
圧縮
composerでvendor
をあらかじめ作成した上で以下のコマンドを実行。
$ tar czvf vendor.tgz vendor
これでvendor.tgzが作成される。
pharストリームで読み込み&動作確認
@@ -1,6 +1,6 @@ <?php -require_once __DIR__ . '/../vendor/autoload.php'; +require_once 'phar://' . __DIR__ . '/../vendor.tgz/vendor/autoload.php'; $app = new \Slim\Slim(array( 'debug' => true,
これで前回の記事 と同じ画面が表示されればおk。
なんでpharファイルを作成するんじゃなくてtgzの作成にしたの?
pharファイルの作成自体は出来たんですけど、どういう訳か作ったpharの読み込みがうまくいかなかったんですよ…。
失敗したときのコードは以下
How to make valid phar file? (Hello.php puts in he ...
make_phar.phpでhello.pharファイルを作り、open_phar.pharで読み込むテスト。
もし原因が分かる方がいらっしゃったら教えてください…。
@kimikimi714 多分pharファイルの作成方法に問題があるんだと思う。composer.pharも読み込みは出来なかったので、実行用としてpharファイルが作られている可能性がある。
そこまでは考えたけど、具体的にどうしたらいいのかはまだ分からん。
— きみー (@kimikimi714) 2014, 6月 29
- 参考にしたリンク
- PHP: Phar - Manual
- わぁいPhar、あかりPhar作るの大好き! - Feelin' Kinda Strange
- TwigをPhar化 - ぷぎがぽぎ
- Phar の仕組みを利用した PEAR モジュールのもっと便利な使い方 - 肉とビールとパンケーキ by @sotarok
- PHP V5.3 では何が新しいのか: 第 4 回 : Phar アーカイブを作成し、使用する
- Packaging Your Apps with Phar
- PHP5.3.5 PharDataクラスを使ってみる - 弱小PHPerの憂鬱
- Please explain how to create PHP's Phar stubs - Stack Overflow
- unoh.github.com by unoh
愚痴
そのうちにきちんと書きます。
http://www.php.net/manual/ja/phar.creating.intro.php
これはあかん。
*1:睡眠って大事ですね。起きて「もしかしたらこのやり方なら出来るかも」と思ってやってみたら本当に出来た