コンテンツにスキップ

Top

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');

以上!