2011-08-10 9 views
21

क्या ज़िप आदेश बनाने के लिए कोई सुरक्षित तरीका है, या exec कमांड का उपयोग किये बिना php से tar.gz है?निष्पादन के बिना ज़िप या tar.gz संग्रह बनाना

धन्यवाद

+0

आप पीएआर आर्काइव की तलाश में हैं। ज़िप और टैर प्रारूपों के लिए एक संस्करण है। – mario

उत्तर

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 को अनलिंक करने से पहले सुनिश्चित करें कि फ़ाइल अभी भी खुली नहीं है - उदाहरण की कोशिश करते समय एक त्रुटि में भाग गया - अनसेट ($ ए) ने चाल ^^ –

3

कैसे दुर्भावनापूर्ण इनपुट से बचाने के लिए पर नोट्स अनुभाग के लिए प्रणाली आदेश बजाय

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

वेतन ध्यान का प्रयोग करें।

संपादित करें: खुले() आदेश http://www.php.net/manual/en/class.ziparchive.php

+2

धन्यवाद, लेकिन मैं खोल से दूर होने की कोशिश कर रहा हूं, क्योंकि कई साझा मेजबानों में ये फ़ंक्शन अक्षम हैं। –

+0

@ el7r मेरा संपादन जांचें और देखें कि क्या यह आपके लिए काम करता है –

20

आप ज़िप फ़ाइलों को बनाने के लिए PHP के Zip वर्ग का उपयोग कर सकते हैं, और ZLib माध्यम से एक नया जिप बनाने के लिए gzip फ़ाइलें बनाने के लिए 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

टैर-ए बनाने का एक बहुत ही आसान तरीका है PHP के भीतर सीधे rchives - आप एलजीपीएल के तहत डेनिस 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; 
} 
} 
?>