2017-08-06 5 views
3

私が進めているプロジェクトでは、.tar.gzアーカイブを作成して外部サービスに提供する必要があります。この外部サービスは.tar.gzのみで動作し、別のタイプのアーカイブは問題になりません。私が作業しているコードが実行されるサーバーは、システムコールへのアクセスを許可しません。だからsystemexec、バッククックなどはブエノではありません。つまり、.tar.gzファイルを作成するには純粋なPHP実装に頼らなければなりません。PHPを使用して.tar.gzファイルを作成する

少しの研究を行ったところ、PharDataが結果を達成するのに役立つようです。しかし、私はそれで壁を打って、いくつかの指導が必要です。

は、次のフォルダのレイアウトを考えてみましょう:私は、トリックを行いますが、最終結果にマイナーな問題があります.tar.gzアーカイブを作成するには、以下のコードスニペットを使用しています

parent folder 
    - child folder 1 
    - child folder 2 
    - file1 
    - file2 

、それはしていません親フォルダは含まれていますが、その中のすべてが含まれます。

$pd = new PharData('archive.tar'); 

$dir = realpath("parent-folder"); 

$pd->buildFromDirectory($dir); 

$pd->compress(Phar::GZ); 

unset($pd); 

unlink('archive.tar'); 

アーカイブを作成するときには、上記のフォルダレイアウトと完全に一致する必要があります。

- child folder 1 
- child folder 2 
- file1 
- file2 

buildFromDirectoryの説明は、それがアーカイブに親フォルダを含有していないので、次のように言及しない:上記のコードスニペットを使用して、アーカイブには、外部サービスのための契約ブレーカである親フォルダ以外のすべてを含んでいます

ディレクトリ内のファイルからtar/zipアーカイブを作成します。

私もbuildFromIteratorを使ってみましたが、最終結果は同じです。つまり、親フォルダはアーカイブに含まれていません。私はaddFileを使用して希望の結果を得ることができましたが、これは痛いほど遅いです。

もう少し調査を行ったところ、次のライブラリが見つかりました:https://github.com/alchemy-fr/Zippy。しかし、これはサーバー上で利用できないcomposerサポートを必要とします。誰かが最終結果を達成するために私を導くことができたら、私は感謝します。また、純粋なPHP実装であり、外部依存関係を必要としない限り、他のメソッドやライブラリを使用することもできます。コードが実行されるサーバが役立つかどうかわからない場合PHP 5.6

+0

サーバー上にコンポーザーは必要ありません。あなたは地元の開発マシンで作曲家が必要です。 – DanielO

+0

@DanielO。素晴らしい情報をありがとう、それを感謝します。あなたがすでにそれを理解したように、作曲家との私の経験は限られています! :)私はそれを試して見てみましょう。 –

答えて

2

Phar::buildFromDirectory()のベースに "parent-folder"の親を使用し、2番目のパラメータを使用して "parent-folder" "例:

$parent = dirname("parent-folder"); 
$pd->buildFromDirectory($parent, '#^'.preg_quote("$parent/parent-folder/", "#").'#'); 
$pd->compress(Phar::GZ); 
+0

Paul、コードスニペットをありがとう、魅力のように動作します。 'buildFromIterator'を使って同じフィーチャーを達成することは可能ですか?主人公のように、私は午後のPMにコードを示し、彼は "ああ、だが、特定のフォルダを除外する必要がある"と言った。 –

+0

実際には、私は 'CallbackFilterIterator'を使用して、それをトリックしました。 –

関連する問題