PHP で tar.gz ファイルの圧縮解凍(展開)
PHPでtar.gzのファイルを操作するのどうすんべ、と思ったので調べたら PharData という便利ライブラリがあることを知ったのでそれの紹介。
PHP で tar.gz の圧縮
<?php
if (file_exists('./hoge.tar')) { unlink('./hoge.tar'); };
if (file_exists('./hoge.tar.gz')) { unlink('./hoge.tar.gz'); };
$p = new \PharData('./hoge.tar');
$p->buildFromDirectory('./hoge'); // hogeディレクトリ以下をtarで固める
$p->compress(Phar::GZ); // tarをtar.gzにする。Phar::BZ2にするとbz2になる
unset($p);
if (file_exists('./hoge.tar')) {Phar::unlinkArchive('./hoge.tar');}
?>
最後のunsetとかPhar::unlinkArchiveは必要ないと言えば必要ないけど、以下の解凍処理と連続してやろうとしたらおかしくなったので。
phar archive "./hoge.tar" has open file handles or objects. fclose() all file handles, and unset() all objects prior to calling unlinkArchive()
PHP で tar.gz の解凍(展開)
<?php
try {
$p = new PharData('./hoge.tar.gz');
$p->decompress(); // これで hoge.tarになる。一気に展開はできない
$p = new PharData('./hoge.tar');
$p->extractTo('./hoge'); // ここでtarが展開
} catch (Exception $e) {
echo $e->getMessage();
}
?>
Laravel で動かない!
上記コードをLaravelに入れたら動かない。
Class \"Illuminate\\Support\\Facades\\PharData\" not found at ...
みたいな感じでエラーになってるから PharData が見つからないようだ。
useのパス指定がおかしいのかなんなのかわからん!!
とずいぶん困ったが、先頭に \ つけてないだけだった。
\PharDataにしたらOK牧場!
$p = new \PharData('./hoge.tar.gz');
$p->decompress();
$p = new \PharData('./hoge.tar');
$p->extractTo('./hoge');
以上!