Chào các bạn. Mình sẽ chia sẽ cho các bạn một đoạn code để giúp các bạn nén tất cả file và folder nằm trong 1 folder lại thành một file zip. Cái này rất tiện dụng cho các bạn backup dữ liệu website.
Muốn zip được tất cả các file và folder trước hết bạn phải lấy tất cả các file cho vào 1 mãng bằng đoạn code sau:
public function arr_file_folder($folder_source = '') { $arr_file = array(); if( ! is_dir($folder_source)) { return false; } $list_file = $this->strip_file(scandir($folder_source)); foreach($list_file as $k => $v) { if(is_file($folder_source.'/'.$v)) { $arr_file[] = $folder_source.'/'.$v; } if(is_dir($folder_source.'/'.$v)) { $arr_file = array_merge($arr_file,$this->arr_file_folder($folder_source.'/'.$v)); } } return $arr_file; }
Với đoạn code này, sẽ trả về cho các bạn một mãng với danh sách các file, nó được chứa trong mãng $arr_file.
Ở đoạn code trên bạn thấy có đoạn code
$list_file = $this->strip_file(scandir($folder_source));
Đoạn code trên bạn thấy tôi có gọi đến hàm strip_file. Hàm này mục đích để bỏ đi 2 value là ‘.’ và ‘..’, 2 giá trị này thu được của hàm scandir mà mình không cần dùng tới. Hàm này được viết như dưới đây
public function strip_file($array = array(), $files = array('.','..','.DS_Store')) { if(empty($files)) { return false; } return array_diff($array,$files); }
Khi đã thu được một mãng các file rồi bạn chỉ việc zip file đó lại nữa là xong. PHP có hỗ trợ thư viện ZipArchive. Bạn zip file lại bằng đoạn code sau.
public function zip_folder($folder_source = '') { $arr_files = $this->arr_file_folder($folder_source); $file_name = 'Backup_WSD_'.date('Y_m_d_h_i',time()).'.zip'; $zip = new ZipArchive(); if ($zip->open($file_name,ZipArchive::CREATE | ZipArchive::OVERWRITE ) != true) { die('Cannot open file '.$file_name); } foreach($arr_files as $k => $v) { $zip->addFile($v); } $zip->close(); return $file_name; }
Đây là đoạn code đầy đủ để zip tất cả file và folder của PHP
/** * Created by PhpStorm. * User: buicongdang * Date: 1/18/16 * Time: 11:33 PM */ class Folder { public function zip_folder($folder_source = '') { $arr_files = $this->arr_file_folder($folder_source); $file_name = 'Backup_WSD_'.date('Y_m_d_h_i',time()).'.zip'; $zip = new ZipArchive(); if ($zip->open($file_name,ZipArchive::CREATE | ZipArchive::OVERWRITE ) != true) { die('Cannot open file '.$file_name); } foreach($arr_files as $k => $v) { $zip->addFile($v); } $zip->close(); return $file_name; } public function strip_file($array = array(), $files = array('.','..','.DS_Store')) { if(empty($files)) { return false; } return array_diff($array,$files); } public function arr_file_folder($folder_source = '') { $arr_file = array(); if( ! is_dir($folder_source)) { return false; } $list_file = $this->strip_file(scandir($folder_source)); foreach($list_file as $k => $v) { if(is_file($folder_source.'/'.$v)) { $arr_file[] = $folder_source.'/'.$v; } if(is_dir($folder_source.'/'.$v)) { $arr_file = array_merge($arr_file,$this->arr_file_folder($folder_source.'/'.$v)); } } return $arr_file; } }
Các bạn sử dụng đoạn code trên bằng cách gọi như sau:
$zip = new Folder(); //Folder là class mà mình vừa viết phía trên
$zip->arr_file_folder(‘folder_can_zip’);// Trong đó folder_can_zip là folder mà bạn cần zip lại.
Thank 🙂 Chúc các bạn học tập và làm việc tốt!