Symfoware

Symfowareについての考察blog

PHP ファイル内のフォルダを指定してtarに圧縮する

PHPでフォルダごとtarファイルにアーカイブする方法を調べました。

PHP 指定ディレクトリのファイルをtarに圧縮する
http://symfoware.blog68.fc2.com/blog-entry-1821.html


tarファイル内にフォルダを作成。
そこにファイルを追加したかったのでやり方を調べてみます。


Phar::addFile



Phar::addFileを使用すれば、やりたいことが実現できそうです。
http://php.net/manual/ja/phar.addfile.php

サンプルとして、sample_dirの中に画像ファイルを追加してみます。


  1. <?php
  2. $phar = new PharData('target.tar');
  3. // addFileでファイルを追加
  4. // 第二引数で追加するフルパスを指定する
  5. $phar->addFile('miku.png', 'sample_dir/miku.png');




狙い通りの構造になりました。

657_01.png





フォルダ内の画像を一括登録



上記の方法で、指定フォルダにファイルを追加することは出来ました。
ただ、速度的に問題があり、300KBのファイル100個を圧縮するのに25秒程度必要です。

サンプルコードはこちら。


  1. <?php
  2. $time_start = microtime(true);
  3. $phar = new PharData('target.tar');
  4. // 300KBのファイルを100個圧縮
  5. foreach(range(1, 100) as $i) {
  6.     $filename = sprintf('%04d.png', $i);
  7.     $phar->addFile('test/'.$filename, 'sample_dir/'.$filename);
  8. }
  9. $time_end = microtime(true);
  10. $total_time = $time_end - $time_start;
  11. echo "{$total_time}秒".PHP_EOL;





こんな時は、PharData::buildFromIteratorを使用します。
http://php.net/manual/ja/phardata.buildfromiterator.php


  1. <?php
  2. $time_start = microtime(true);
  3. $phar = new PharData('target.tar');
  4. // 300KBのファイルを100個圧縮
  5. $files = array();
  6. foreach(range(1, 100) as $i) {
  7.     $filename = sprintf('%04d.png', $i);
  8.     //$phar->addFile('test/'.$filename, 'sample_dir/'.$filename);
  9.     $files['sample_dir/'.$filename] = 'test/'.$filename;
  10. }
  11. $phar->buildFromIterator(new ArrayIterator($files));
  12. $time_end = microtime(true);
  13. $total_time = $time_end - $time_start;
  14. echo "{$total_time}秒".PHP_EOL;



同じ処理が0.08秒になりました。



(PHPで)指定ディレクトリ以下を全部チェックしてファイル一覧を取得する方法

こちらを参考に、指定フォルダ以下のファイルを全てtarに圧縮してみます。


  1. <?php
  2. $phar = new PharData('target.tar');
  3. // testフォルダ以下をtarのsample_dir配下に登録
  4. $it_dir = new RecursiveDirectoryIterator('test');
  5. $it_file = new RecursiveIteratorIterator($it_dir);
  6. $files = array();
  7. foreach ($it_file as $fileinfo) {
  8.     if ($fileinfo->isFile()) {
  9.         $path = $fileinfo->getPathname();
  10.         $files['sample_dir/'.$path] = $path;
  11.     }
  12. }
  13. $phar->buildFromIterator(new ArrayIterator($files));



狙い通りの階層でtarファイルが作成できました。

657_02.png


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/12/20(日) 22:24:11|
  2. PHP
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python デバッグ用のSMTPサーバーを起動する | ホーム | PHP 指定ディレクトリのファイルをtarに圧縮する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1822-8820edba
この記事にトラックバックする(FC2ブログユーザー)