我正在處理的項目需要創建.tar.gz文件並將其提供給外部服務。這種外部服務僅適用於.tar.gz,因此另一種類型的存檔是無可爭議的。我正在執行的代碼將執行的服務器不允許訪問系統調用。所以system
,exec
,反引號等等都不是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
您不需要作曲者在服務器上。您只需要在本地開發機器上使用作曲家。 – DanielO
@DanielO。感謝您的好消息,非常感謝。正如你已經知道的那樣,我的作曲家經驗是有限的! :)我會試試看。 –