わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

phpで圧縮ファイルを解凍せずに読み込むには

みんな大好き(?)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ストリームで読み込み&動作確認

前回の記事 で書いたindex.phpを以下のように変更。

@@ -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で読み込むテスト。
もし原因が分かる方がいらっしゃったら教えてください…。

愚痴

そのうちにきちんと書きます。
http://www.php.net/manual/ja/phar.creating.intro.php

これはあかん。

*1:睡眠って大事ですね。起きて「もしかしたらこのやり方なら出来るかも」と思ってやってみたら本当に出来た