2011-08-10 54 views

Respuesta

29

Si desea crear tar.gz y está utilizando PHP 5.3+, puede utilizar PharData clase:

try 
{ 
    $a = new PharData('archive.tar'); 

    // ADD FILES TO archive.tar FILE 
    $a->addFile('data.xls'); 
    $a->addFile('index.php'); 

    // COMPRESS archive.tar FILE. COMPRESSED FILE WILL BE archive.tar.gz 
    $a->compress(Phar::GZ); 

    // NOTE THAT BOTH FILES WILL EXISTS. SO IF YOU WANT YOU CAN UNLINK archive.tar 
    unlink('archive.tar'); 
} 
catch (Exception $e) 
{ 
    echo "Exception : " . $e; 
} 
+6

Antes de desvincular archive.tar asegúrese de que el archivo aún no está abierto; se ejecutó un error al probar el ejemplo - unset ($ a) hizo el truco ^^ –

3

Utilice el comando del sistema en lugar

http://php.net/manual/en/function.system.php

Prestar atención a la sección de notas sobre la manera de proteger de la entrada maliciosa.

EDIT: Utilice la clase ZipArchive para crear una nueva postal a través de la orden de apertura() http://www.php.net/manual/en/class.ziparchive.php

+2

gracias, pero trato de alejarme del caparazón, porque en muchos alojamientos compartidos estas funciones están deshabilitadas. –

+0

@ el7r verifique mi edición y vea si eso funciona para usted –

20

Se puede utilizar la clase de PHP Zip para crear archivos zip, y ZLib para crear archivos gzip.

Creación de un archivo .zip:

$zip = new ZipArchive(); 
$res = $zip->open('test.zip', ZipArchive::CREATE); 
$zip->addFromString('test.txt', 'file content goes here'); 
$zip->addFile('data.txt', 'entryname.txt'); 
$zip->close(); 

Creación de un archivo .gz:

$file = "test.txt"; 
$gzfile = "test.gz"; 
$fp = gzopen($gzfile, 'w9'); // w == write, 9 == highest compression 
gzwrite($fp, file_get_contents($file)); 
gzclose($fp); 
+0

gracias, funciona, ¿puedo extraerlo de manera similar? –

+3

¡Por supuesto! Solo revisa la documentación vinculada arriba, es bastante fácil de seguir. – foxy

-1

Hay una manera muy simple de crear Tar-a rchives directamente dentro de PHP - puede encontrar una CLASE en sourceforge de Dennis Wronka bajo LGPL para que pueda usarla también en scripts comerciales.

<?php 
/** 
* @package PHPClassCollection 
* @subpackage Tar 
* @link classes 
* @author Dennis Wronka <[email protected]> 
*/ 
/** 
* @package PHPClassCollection 
* @subpackage Tar 
* @link classes 
* @author Dennis Wronka <[email protected]> 
* @version 1.1 
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPL 2.1 
*/ 
class tar 
{ 
/** 
* The name of the tar-file to create. 
* 
* @var string 
*/ 
var $filename; 
/** 
* The list of files to add to the archive. 
* 
* @var array 
*/ 
var $filelist=array(); 

/** 
* Constructor 
* 
* @param string $filename 
*/ 
function tar($filename) 
{ 
    $this->filename=$filename; 
} 

/** 
* Add a file. 
* 
* @param string $filename 
*/ 
function add($filename) 
{ 
    if ((file_exists($filename)) && (is_readable($filename))) 
    { 
     $this->filelist[]=$filename; 
    } 
} 

/** 
* Write the tar-file. 
* 
* @return bool 
*/ 
function write() 
{ 
    sort($this->filelist); 
    [email protected]($this->filename,'w'); 
    if ($tarfile==false) 
    { 
     return false; 
    } 
    for ($x=0;$x<count($this->filelist);$x++) 
    { 
     $filename=$this->filelist[$x]; 
     if ((is_dir($this->filelist[$x])) && (substr($this->filelist[$x],-1)!='/')) 
     { 
      $filename.='/'; 
     } 
     while (strlen($filename)<100) 
     { 
      $filename.=chr(0); 
     } 
     $permissions=sprintf('%o',fileperms($this->filelist[$x])).chr(0); 
     while (strlen($permissions)<8) 
     { 
      $permissions='0'.$permissions; 
     } 
     $userid=sprintf('%o',fileowner($this->filelist[$x])).chr(0); 
     while (strlen($userid)<8) 
     { 
      $userid='0'.$userid; 
     } 
     $groupid=sprintf('%o',filegroup($this->filelist[$x])).chr(0); 
     while (strlen($groupid)<8) 
     { 
      $groupid='0'.$groupid; 
     } 
     if (is_dir($this->filelist[$x])) 
     { 
      $filesize='0'.chr(0); 
     } 
     else 
     { 
      $filesize=sprintf('%o',filesize($this->filelist[$x])).chr(0); 
     } 
     while (strlen($filesize)<12) 
     { 
      $filesize='0'.$filesize; 
     } 
     $modtime=sprintf('%o',filectime($this->filelist[$x])).chr(0); 
     $checksum='  '; 
     if (is_dir($this->filelist[$x])) 
     { 
      $indicator=5; 
     } 
     else 
     { 
      $indicator=0; 
     } 
     $linkname=''; 
     while (strlen($linkname)<100) 
     { 
      $linkname.=chr(0); 
     } 
     $ustar='ustar '.chr(0); 
     if (function_exists('posix_getpwuid')) 
     { 
      $user=posix_getpwuid(octdec($userid)); 
      $user=$user['name']; 
     } 
     else 
     { 
      $user=''; 
     } 
     while (strlen($user)<32) 
     { 
      $user.=chr(0); 
     } 
     if (function_exists('posix_getgrgid')) 
     { 
      $group=posix_getgrgid(octdec($groupid)); 
      $group=$group['name']; 
     } 
     else 
     { 
      $group=''; 
     } 
     while (strlen($group)<32) 
     { 
      $group.=chr(0); 
     } 
     $devmajor=''; 
     while (strlen($devmajor)<8) 
     { 
      $devmajor.=chr(0); 
     } 
     $devminor=''; 
     while (strlen($devminor)<8) 
     { 
      $devminor.=chr(0); 
     } 
     $prefix=''; 
     while (strlen($prefix)<155) 
     { 
      $prefix.=chr(0); 
     } 
     $header=$filename.$permissions.$userid.$groupid.$filesize.$modtime.$checksum.$indicator.$linkname.$ustar.$user.$group.$devmajor.$devminor.$prefix; 
     while (strlen($header)<512) 
     { 
      $header.=chr(0); 
     } 
     $checksum=0; 
     for ($y=0;$y<strlen($header);$y++) 
     { 
      $checksum+=ord($header[$y]); 
     } 
     $checksum=sprintf('%o',$checksum).chr(0).' '; 
     while (strlen($checksum)<8) 
     { 
      $checksum='0'.$checksum; 
     } 
     $header=$filename.$permissions.$userid.$groupid.$filesize.$modtime.$checksum.$indicator.$linkname.$ustar.$user.$group.$devmajor.$devminor.$prefix; 
     while (strlen($header)<512) 
     { 
      $header.=chr(0); 
     } 
     fwrite($tarfile,$header); 
     if ($indicator==0) 
     { 
      $contentfile=fopen($this->filelist[$x],'r'); 
      $data=fread($contentfile,filesize($this->filelist[$x])); 
      while (strlen($data)%512!=0) 
      { 
       $data.=chr(0); 
      } 
      fwrite($tarfile,$data); 
     } 
    } 
    fclose($tarfile); 
    return true; 
} 
} 
?> 
Cuestiones relacionadas