2012-02-23 1 views
23

Как бы я распаковал файл в php без использования exec('tar') или любых других команд с использованием чистого PHP?PHP Untar-gz без exec()?

Моя проблема заключается в следующем: У меня есть файл размером 26 МБ tar.gz, который необходимо загрузить на мой сервер и извлечь. Я попытался использовать net2ftp, чтобы извлечь его, но он не поддерживает tar.gz, разжатие после загрузки.

Я использую бесплатный веб-хост, поэтому они не допускают никаких команд exec(), и они не позволяют получить доступ к приглашению. Так как же я буду об этом говорить?

Есть ли у PHP встроенная команда?

ответ

37

С PHP 5.3.0 вам не нужно использовать Archive_Tar.

Существует новый класс для работы с архивом tar: The PharData class.

Чтобы извлечь архив (используя PharData::extractTo(), которые работают как ZipArchive::extractTo()):

try { 
    $phar = new PharData('myphar.tar'); 
    $phar->extractTo('/full/path'); // extract all files 
} catch (Exception $e) { 
    // handle errors 
} 

И если у вас есть архив tar.gz, просто распаковать его перед экстрактом (с использованием PharData::decompress()):

// decompress from gz 
$p = new PharData('/path/to/my.tar.gz'); 
$p->decompress(); // creates /path/to/my.tar 

// unarchive from the tar 
$phar = new PharData('/path/to/my.tar'); 
$phar->extractTo('/full/path'); 
+1

По какой-то причине PharData :: extractTo не работает в PHP 5.4.0 в Windows. Не могу понять, почему – TinyGrasshopper

+0

Я видел [ваш вопрос] (http://stackoverflow.com/q/13870800/569101), но у меня нет Windows с 5.4.0, чтобы проверить его, извините. – j0k

+0

Он также, вопреки документации, кажется, не воспринимает каталоги как второй аргумент. –

3

PEAR предоставляет Archive_Tar class, который поддерживает сжатие Gzip и BZ2 при условии, что вы загрузили расширения zlib и bz2 соответственно.