У меня возникла проблема с библиотекой php zip, вызвавшей ошибку 500, если файл растет до 500 МБ, возможно, связанный с памятью …
Но я попытался создать cmd для создания zip-файла, который хорошо работает на моем сервере.
<?php set_time_limit(10000); // Make Zip name $zipname = "main_backup.zip"; // Make a zip file $cmd = `zip -r $zipname * -x filelist.php -x $zipname`; if($cmd){ echo 'zip created'; } else{ echo 'failed'; } unlink(__FILE__); ?>
Я знаю, как исключать файлы и папки, но есть ли способ закрепить только файлы на основе измененного времени с использованием этого подхода?
Я гугл в течение нескольких часов и подошел пустой.
для этого, вот код, который создавал ошибку 500. Мой сайт составляет около 1,8 ГБ, он всегда ошибки при 500 МБ ~. Я должен отметить, что журнал ошибок пуст, поэтому причиной ошибки я просто предполагаю, что это проблемы с ограничением RAM.
<?php $zip = new ZipArchive; $zip_name = "test.zip"; $res = $zip->open($zip_name, ZipArchive::CREATE); /** * Real Recursive Directory Iterator */ class RRDI extends RecursiveIteratorIterator { /** * Creates Real Recursive Directory Iterator * @param string $path * @param int $flags * @return DirectoryIterator */ public function __construct($path, $flags = 0) { parent::__construct(new RecursiveDirectoryIterator($path, $flags)); } } /** * Real RecursiveDirectoryIterator Filtered Class * Returns only those items which filenames match given regex */ class AdvancedDirectoryIterator extends FilterIterator { /** * Regex storage * @var string */ private $regex; /** * Creates new AdvancedDirectoryIterator * @param string $path, prefix with '-R ' for recursive, postfix with /[wildcards] for matching * @param int $flags * @return DirectoryIterator */ public function __construct($path, $flags = 0) { if (strpos($path, '-R ') === 0) { $recursive = true; $path = substr($path, 3); } if (preg_match('~/?([^/]*\*[^/]*)$~', $path, $matches)) { // matched wildcards in filename $path = substr($path, 0, -strlen($matches[1]) - 1); // strip wildcards part from path $this->regex = '~^' . str_replace('*', '.*', str_replace('.', '\.', $matches[1])) . '$~'; // convert wildcards to regex if (!$path) $path = '.'; // if no path given, we assume CWD } parent::__construct($recursive ? new RRDI($path, $flags) : new DirectoryIterator($path)); } /** * Checks for regex in current filename, or matches all if no regex specified * @return bool */ public function accept() { // FilterIterator method return $this->regex === null ? true : preg_match($this->regex, $this->getInnerIterator()->getFilename()); } } foreach (new AdvancedDirectoryIterator('-R *') as $i){ //$fullpath = str_replace(',','',$i->getPath()).'/'.$i->getFilename(); //echo $fullpath.'<br />'; if ($i->isFile() && $i->getFilename()!='filelist.php') { //echo $i->getFilename() . " " . $i->getMTime() . "<br />"; if($i->getMTime()>='0'){ $array[] = substr($i->getPathname(), 2); } } }; // will output all php files in CWD and all subdirectories foreach($array as $files) { $zip_array[] = files; $zip->addFile($files); } $zip->close(); echo 'done'; ?>
Вы можете использовать опцию -t или -tt для zip-команды и иметь свою измененную дату, хранящуюся как переменную, или просто передать ее.
-t с форматом mmddyyyy для даты
-tt с форматом mmddyyyy для досрочного
//Zips up all files in current directory that were dated 08152013 or later zip -r -t 08152013 $zipname * -x filelist.php -x $zipname