2017-08-06 64 views
3

我正在處理的項目需要創建.tar.gz文件並將其提供給外部服務。這種外部服務僅適用於.tar.gz,因此另一種類型的存檔是無可爭議的。我正在執行的代碼將執行的服務器不允許訪問系統調用。所以systemexec,反引號等等都不是bueno。這意味着我必須依靠純PHP實現來創建.tar.gz文件。使用PHP創建.tar.gz文件

經過一番研究,似乎PharData將有助於實現結果。不過,我已經打了一堵牆,需要一些指導。

考慮下面的文件夾佈局:

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

我使用下面的代碼片段創建名爲.tar.gz歸檔這是卓有成效的,但有一個與最終的結果是一個小問題,它不包含父文件夾,但包含其中的所有內容。

$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

使用「parent-folder」的父級作爲Phar::buildFromDirectory()的基礎,並使用其第二個參數將結果限制爲「parent-folder 「,例如:

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

保羅,感謝你的代碼片段,工作就像一個魅力。使用'buildFromIterator'可以達到同樣的效果嗎?像英雄一樣,我會去代碼給我的主管,他說:「哦,但是我們需要排除某些文件夾」,doh! –

+0

其實從頭開始,我使用了'CallbackFilterIterator',它的確有竅門。 –