2011-08-10 6 views

답변

29

당신이 tar.gz의을 만들려면 당신은 PHP의 5.3+를 사용하고, 당신은 PharData 클래스를 사용할 수 있습니다 :

$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(); 

.gz 파일 만들기 :

.zip 파일 만들기 :

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

archive.tar를 해제하기 전에 파일이 아직 열려 있지 않은지 확인하십시오 - 예제를 시도하는 중에 오류가 발생했습니다 - unset ($ a) 트릭을 수행했습니다 ^^ –

3

악의적 인 입력으로부터 보호하는 방법에 노트 섹션에 시스템 명령 대신

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

에주의를 사용합니다.

편집 : GZIP 파일을 만들 오픈() 명령 http://www.php.net/manual/en/class.ziparchive.php

+2

고맙지 만, 많은 공유 호스팅에서 이러한 기능을 사용할 수 없기 때문에 셸에서 벗어나려고합니다. –

+0

@ el7r 제 편집을 확인하고 작동하는지 확인하십시오. –

20

당신은 zip 파일을 생성하는 PHP의 Zip 클래스를 사용할 수 있으며, ZLib를 통해 새로운 우편을 만들 수 ZipArchive 클래스를 사용합니다.

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

감사합니다. 작동하지만, 비슷한 방법으로 추출 할 수 있습니까? –

+3

물론! 위에서 링크 된 문서를 살펴보십시오. – foxy

-1

매우 간단한 방법으로 Tar-a를 만들 수 있습니다. PHP 내의 직접적인 라이브러리 - LGPL의 Dennis Wronka가 제공하는 sourceforge에서 클래스를 찾을 수 있으므로 상용 스크립트에서도 사용할 수 있습니다.

<?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; 
} 
} 
?> 
관련 문제