예제 #1
0
 public function Build($package)
 {
     try {
         $this->Package = $package;
         $time_start = DUP_Util::GetMicrotime();
         $this->Package->SetStatus(DUP_PackageStatus::DBSTART);
         $this->dbStorePath = "{$this->Package->StorePath}/{$this->File}";
         $package_mysqldump = DUP_Settings::Get('package_mysqldump');
         $package_phpdump_qrylimit = DUP_Settings::Get('package_phpdump_qrylimit');
         $mysqlDumpPath = self::GetMySqlDumpPath();
         $mode = $mysqlDumpPath && $package_mysqldump ? 'MYSQLDUMP' : 'PHP';
         $reserved_db_filepath = DUPLICATOR_WPROOTPATH . 'database.sql';
         $log = "\n********************************************************************************\n";
         $log .= "DATABASE:\n";
         $log .= "********************************************************************************\n";
         $log .= "BUILD MODE:   {$mode}";
         $log .= $mode == 'PHP' ? "(query limit - {$package_phpdump_qrylimit})\n" : "\n";
         $log .= "MYSQLTIMEOUT: " . DUPLICATOR_DB_MAX_TIME . "\n";
         $log .= "MYSQLDUMP:    ";
         $log .= $mysqlDumpPath ? "Is Supported" : "Not Supported";
         DUP_Log::Info($log);
         $log = null;
         //Reserved file found
         if (file_exists($reserved_db_filepath)) {
             DUP_Log::Error("Reserverd SQL file detected", "The file database.sql was found at [{$reserved_db_filepath}].\n" . "\tPlease remove/rename this file to continue with the package creation.");
         }
         switch ($mode) {
             case 'MYSQLDUMP':
                 $this->mysqlDump($mysqlDumpPath);
                 break;
             case 'PHP':
                 $this->phpDump();
                 break;
         }
         DUP_Log::Info("SQL CREATED: {$this->File}");
         $time_end = DUP_Util::GetMicrotime();
         $time_sum = DUP_Util::ElapsedTime($time_end, $time_start);
         //File below 10k will be incomplete
         $sql_file_size = filesize($this->dbStorePath);
         DUP_Log::Info('file size:' . $sql_file_size);
         if ($sql_file_size < 10000) {
             DUP_Log::Error("SQL file size too low.", "File does not look complete.  Check permission on file and parent directory at [{$this->dbStorePath}]");
         }
         DUP_Log::Info("SQL FILE SIZE: " . DUP_Util::ByteSize($sql_file_size));
         DUP_Log::Info("SQL FILE TIME: " . date("Y-m-d H:i:s"));
         DUP_Log::Info("SQL RUNTIME: {$time_sum}");
         $this->Size = @filesize($this->dbStorePath);
         $this->Package->SetStatus(DUP_PackageStatus::DBDONE);
     } catch (Exception $e) {
         DUP_Log::Error("Runtime error in DUP_Database::Build", "Exception: {$e}");
     }
 }
예제 #2
0
 public function Build($package)
 {
     try {
         $this->Package = $package;
         $time_start = DUP_Util::GetMicrotime();
         $this->Package->SetStatus(DUP_PackageStatus::DBSTART);
         $package_mysqldump = DUP_Settings::Get('package_mysqldump');
         $package_phpdump_qrylimit = DUP_Settings::Get('package_phpdump_qrylimit');
         $this->dbStorePath = "{$this->Package->StorePath}/{$this->File}";
         $mysqlDumpPath = self::GetMySqlDumpPath();
         $mode = $mysqlDumpPath && $package_mysqldump ? 'MYSQLDUMP' : 'PHP';
         $mysqlDumpSupport = $mysqlDumpPath ? 'Is Supported' : 'Not Supported';
         $log = "\n********************************************************************************\n";
         $log .= "DATABASE:\n";
         $log .= "********************************************************************************\n";
         $log .= "BUILD MODE:   {$mode} ";
         $log .= $mode == 'PHP' ? "(query limit - {$package_phpdump_qrylimit})\n" : "\n";
         $log .= "MYSQLDUMP:    {$mysqlDumpSupport}\n";
         $log .= "MYSQLTIMEOUT: " . DUPLICATOR_DB_MAX_TIME;
         DUP_Log::Info($log);
         $log = null;
         switch ($mode) {
             case 'MYSQLDUMP':
                 $this->mysqlDump($mysqlDumpPath);
                 break;
             case 'PHP':
                 $this->phpDump();
                 break;
         }
         DUP_Log::Info("SQL CREATED: {$this->File}");
         $time_end = DUP_Util::GetMicrotime();
         $time_sum = DUP_Util::ElapsedTime($time_end, $time_start);
         $sql_file_size = filesize($this->dbStorePath);
         if ($sql_file_size <= 0) {
             DUP_Log::Error("SQL file generated zero bytes.", "No data was written to the sql file.  Check permission on file and parent directory at [{$this->dbStorePath}]");
         }
         DUP_Log::Info("SQL FILE SIZE: " . DUP_Util::ByteSize($sql_file_size));
         DUP_Log::Info("SQL FILE TIME: " . date("Y-m-d H:i:s"));
         DUP_Log::Info("SQL RUNTIME: {$time_sum}");
         $this->Size = @filesize($this->dbStorePath);
         $this->Package->SetStatus(DUP_PackageStatus::DBDONE);
     } catch (Exception $e) {
         DUP_Log::Error("Runtime error in DUP_Database::Build", "Exception: {$e}");
     }
 }
예제 #3
0
 /**
  * Starts the package build process
  * @return DUP_Package
  */
 public function Build()
 {
     global $wp_version;
     global $wpdb;
     global $current_user;
     $timerStart = DUP_Util::GetMicrotime();
     $this->Archive->File = "{$this->NameHash}_archive.zip";
     $this->Installer->File = "{$this->NameHash}_installer.php";
     $this->Database->File = "{$this->NameHash}_database.sql";
     //START LOGGING
     DUP_Log::Open($this->NameHash);
     $php_max_time = @ini_get("max_execution_time");
     $php_max_memory = @ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);
     $php_max_time = $php_max_time == 0 ? "(0) no time limit imposed" : "[{$php_max_time}] not allowed";
     $php_max_memory = $php_max_memory === false ? "Unabled to set php memory_limit" : DUPLICATOR_PHP_MAX_MEMORY . " ({$php_max_memory} default)";
     $info = "********************************************************************************\n";
     $info .= "PACKAGE-LOG: " . @date("Y-m-d H:i:s") . "\n";
     $info .= "NOTICE: Do NOT post to public sites or forums \n";
     $info .= "********************************************************************************\n";
     $info .= "VERSION:\t" . DUPLICATOR_VERSION . "\n";
     $info .= "WORDPRESS:\t{$wp_version}\n";
     $info .= "PHP INFO:\t" . phpversion() . ' | ' . 'SAPI: ' . php_sapi_name() . "\n";
     $info .= "SERVER:\t\t{$_SERVER['SERVER_SOFTWARE']} \n";
     $info .= "PHP TIME LIMIT: {$php_max_time} \n";
     $info .= "PHP MAX MEMORY: {$php_max_memory} \n";
     $info .= "MEMORY STACK: " . DUP_Server::GetPHPMemory();
     DUP_Log::Info($info);
     $info = null;
     //CREATE DB RECORD
     $packageObj = serialize($this);
     if (!$packageObj) {
         DUP_Log::Error("Unable to serialize pacakge object while building record.");
     }
     $this->ID = $this->FindHashKey($this->Hash);
     if ($this->ID != 0) {
         $this->SetStatus(DUP_PackageStatus::START);
     } else {
         $results = $wpdb->insert($wpdb->prefix . "duplicator_packages", array('name' => $this->Name, 'hash' => $this->Hash, 'status' => DUP_PackageStatus::START, 'created' => current_time('mysql', get_option('gmt_offset', 1)), 'owner' => isset($current_user->user_login) ? $current_user->user_login : '******', 'package' => $packageObj));
         if ($results == false) {
             $error_result = $wpdb->print_error();
             DUP_Log::Error("Duplicator is unable to insert a package record into the database table.", "'{$error_result}'");
         }
         $this->ID = $wpdb->insert_id;
     }
     //START BUILD
     //PHPs serialze method will return the object, but the ID above is not passed
     //for one reason or another so passing the object back in seems to do the trick
     $this->Database->Build($this);
     $this->Archive->Build($this);
     $this->Installer->Build($this);
     //INTEGRITY CHECKS
     DUP_Log::Info("\n********************************************************************************");
     DUP_Log::Info("INTEGRITY CHECKS:");
     DUP_Log::Info("********************************************************************************");
     $dbSizeRead = DUP_Util::ByteSize($this->Database->Size);
     $zipSizeRead = DUP_Util::ByteSize($this->Archive->Size);
     $exeSizeRead = DUP_Util::ByteSize($this->Installer->Size);
     DUP_Log::Info("SQL File: {$dbSizeRead}");
     DUP_Log::Info("Installer File: {$exeSizeRead}");
     DUP_Log::Info("Archive File: {$zipSizeRead} ");
     if (!($this->Archive->Size && $this->Database->Size && $this->Installer->Size)) {
         DUP_Log::Error("A required file contains zero bytes.", "Archive Size: {$zipSizeRead} | SQL Size: {$dbSizeRead} | Installer Size: {$exeSizeRead}");
     }
     //Validate SQL files completed
     $sql_tmp_path = DUP_UTIL::SafePath(DUPLICATOR_SSDIR_PATH_TMP . '/' . $this->Database->File);
     $sql_complete_txt = DUP_Util::TailFile($sql_tmp_path, 3);
     if (!strstr($sql_complete_txt, 'DUPLICATOR_MYSQLDUMP_EOF')) {
         DUP_Log::Error("ERROR: SQL file not complete.  The end of file marker was not found.  Please try to re-create the package.");
     }
     $timerEnd = DUP_Util::GetMicrotime();
     $timerSum = DUP_Util::ElapsedTime($timerEnd, $timerStart);
     $this->Runtime = $timerSum;
     $this->ExeSize = $exeSizeRead;
     $this->ZipSize = $zipSizeRead;
     $this->buildCleanup();
     //FINAL REPORT
     $info = "\n********************************************************************************\n";
     $info .= "RECORD ID:[{$this->ID}]\n";
     $info .= "TOTAL PROCESS RUNTIME: {$timerSum}\n";
     $info .= "PEAK PHP MEMORY USED: " . DUP_Server::GetPHPMemory(true) . "\n";
     $info .= "DONE PROCESSING => {$this->Name} " . @date("Y-m-d H:i:s") . "\n";
     DUP_Log::Info($info);
     DUP_Log::Close();
     $this->SetStatus(DUP_PackageStatus::COMPLETE);
     return $this;
 }
예제 #4
0
 /**
  *  CREATE
  *  Creates the zip file and adds the SQL file to the archive
  */
 public static function Create(DUP_Archive $archive)
 {
     try {
         $timerAllStart = DUP_Util::GetMicrotime();
         $package_zip_flush = DUP_Settings::Get('package_zip_flush');
         self::$compressDir = rtrim(DUP_Util::SafePath($archive->PackDir), '/');
         self::$sqlPath = DUP_Util::SafePath("{$archive->Package->StorePath}/{$archive->Package->Database->File}");
         self::$zipPath = DUP_Util::SafePath("{$archive->Package->StorePath}/{$archive->File}");
         self::$zipArchive = new ZipArchive();
         self::$networkFlush = empty($package_zip_flush) ? false : $package_zip_flush;
         $filterDirs = empty($archive->FilterDirs) ? 'not set' : $archive->FilterDirs;
         $filterExts = empty($archive->FilterExts) ? 'not set' : $archive->FilterExts;
         $filterOn = $archive->FilterOn ? 'ON' : 'OFF';
         //LOAD SCAN REPORT
         $json = file_get_contents(DUPLICATOR_SSDIR_PATH_TMP . "/{$archive->Package->NameHash}_scan.json");
         self::$scanReport = json_decode($json);
         DUP_Log::Info("\n********************************************************************************");
         DUP_Log::Info("ARCHIVE (ZIP):");
         DUP_Log::Info("********************************************************************************");
         $isZipOpen = self::$zipArchive->open(self::$zipPath, ZIPARCHIVE::CREATE) === TRUE;
         if (!$isZipOpen) {
             DUP_Log::Error("Cannot open zip file with PHP ZipArchive.", "Path location [" . self::$zipPath . "]");
         }
         DUP_Log::Info("ARCHIVE DIR:  " . self::$compressDir);
         DUP_Log::Info("ARCHIVE FILE: " . basename(self::$zipPath));
         DUP_Log::Info("FILTERS: *{$filterOn}*");
         DUP_Log::Info("DIRS:  {$filterDirs}");
         DUP_Log::Info("EXTS:  {$filterExts}");
         DUP_Log::Info("----------------------------------------");
         DUP_Log::Info("COMPRESSING");
         DUP_Log::Info("SIZE:\t" . self::$scanReport->ARC->Size);
         DUP_Log::Info("STATS:\tDirs " . self::$scanReport->ARC->DirCount . " | Files " . self::$scanReport->ARC->FileCount);
         //ADD SQL
         $isSQLInZip = self::$zipArchive->addFile(self::$sqlPath, "database.sql");
         if ($isSQLInZip) {
             DUP_Log::Info("SQL ADDED: " . basename(self::$sqlPath));
         } else {
             DUP_Log::Error("Unable to add database.sql to archive.", "SQL File Path [" . self::$sqlath . "]");
         }
         self::$zipArchive->close();
         self::$zipArchive->open(self::$zipPath, ZipArchive::CREATE);
         //ZIP DIRECTORIES
         foreach (self::$scanReport->ARC->Dirs as $dir) {
             if (self::$zipArchive->addEmptyDir(ltrim(str_replace(self::$compressDir, '', $dir), '/'))) {
                 self::$countDirs++;
             } else {
                 //Don't warn when dirtory is the root path
                 if (strcmp($dir, rtrim(self::$compressDir, '/')) != 0) {
                     DUP_Log::Info("WARNING: Unable to zip directory: '{$dir}'" . rtrim(self::$compressDir, '/'));
                 }
             }
         }
         /* ZIP FILES: Network Flush
          *  This allows the process to not timeout on fcgi 
          *  setups that need a response every X seconds */
         if (self::$networkFlush) {
             foreach (self::$scanReport->ARC->Files as $file) {
                 if (self::$zipArchive->addFile($file, ltrim(str_replace(self::$compressDir, '', $file), '/'))) {
                     self::$limitItems++;
                     self::$countFiles++;
                 } else {
                     DUP_Log::Info("WARNING: Unable to zip file: {$file}");
                 }
                 //Trigger a flush to the web server after so many files have been loaded.
                 if (self::$limitItems > DUPLICATOR_ZIP_FLUSH_TRIGGER) {
                     $sumItems = self::$countDirs + self::$countFiles;
                     self::$zipArchive->close();
                     self::$zipArchive->open(self::$zipPath);
                     self::$limitItems = 0;
                     DUP_Util::FcgiFlush();
                     DUP_Log::Info("Items archived [{$sumItems}] flushing response.");
                 }
             }
             //Normal
         } else {
             foreach (self::$scanReport->ARC->Files as $file) {
                 if (self::$zipArchive->addFile($file, ltrim(str_replace(self::$compressDir, '', $file), '/'))) {
                     self::$countFiles++;
                 } else {
                     DUP_Log::Info("WARNING: Unable to zip file: {$file}");
                 }
             }
         }
         DUP_Log::Info(print_r(self::$zipArchive, true));
         //--------------------------------
         //LOG FINAL RESULTS
         DUP_Util::FcgiFlush();
         $zipCloseResult = self::$zipArchive->close();
         $zipCloseResult ? DUP_Log::Info("COMPRESSION RESULT: '{$zipCloseResult}'") : DUP_Log::Error("ZipArchive close failure.", "This hosted server may have a disk quota limit.\nCheck to make sure this archive file can be stored.");
         $timerAllEnd = DUP_Util::GetMicrotime();
         $timerAllSum = DUP_Util::ElapsedTime($timerAllEnd, $timerAllStart);
         self::$zipFileSize = @filesize(self::$zipPath);
         DUP_Log::Info("COMPRESSED SIZE: " . DUP_Util::ByteSize(self::$zipFileSize));
         DUP_Log::Info("ARCHIVE RUNTIME: {$timerAllSum}");
         DUP_Log::Info("MEMORY STACK: " . DUP_Server::GetPHPMemory());
     } catch (Exception $e) {
         DUP_Log::Error("Runtime error in package.archive.zip.php constructor.", "Exception: {$e}");
     }
 }
 /**
  * Starts the package build process
  * @return DUP_Package
  */
 public function Build()
 {
     global $wp_version;
     global $wpdb;
     global $current_user;
     $timerStart = DUP_Util::GetMicrotime();
     $this->Archive->File = "{$this->NameHash}_archive.zip";
     $this->Installer->File = "{$this->NameHash}_installer.php";
     $this->Database->File = "{$this->NameHash}_database.sql";
     //START LOGGING
     DUP_Log::Open($this->NameHash);
     $php_max_time = @ini_get("max_execution_time");
     $php_max_memory = @ini_set('memory_limit', DUPLICATOR_PHP_MAX_MEMORY);
     $php_max_time = $php_max_time == 0 ? "(0) no time limit imposed" : "[{$php_max_time}] not allowed";
     $php_max_memory = $php_max_memory === false ? "Unabled to set php memory_limit" : DUPLICATOR_PHP_MAX_MEMORY . " ({$php_max_memory} default)";
     $info = "********************************************************************************\n";
     $info .= "PACKAGE-LOG: " . @date("Y-m-d H:i:s") . "\n";
     $info .= "NOTICE: Do NOT post to public sites or forums \n";
     $info .= "********************************************************************************\n";
     $info .= "VERSION:\t" . DUPLICATOR_VERSION . "\n";
     $info .= "WORDPRESS:\t{$wp_version}\n";
     $info .= "PHP INFO:\t" . phpversion() . ' | ' . 'SAPI: ' . php_sapi_name() . "\n";
     $info .= "SERVER:\t\t{$_SERVER['SERVER_SOFTWARE']} \n";
     $info .= "PHP TIME LIMIT: {$php_max_time} \n";
     $info .= "PHP MAX MEMORY: {$php_max_memory}";
     DUP_Log::Info($info);
     unset($info);
     //CREATE DB RECORD
     $packageObj = serialize($this);
     if (!$packageObj) {
         DUP_Log::Error("Unable to serialize pacakge object while building record.");
     }
     $this->ID = $this->FindHashKey($this->Hash);
     if ($this->ID != 0) {
         $this->SetStatus(DUP_PackageStatus::START);
     } else {
         $results = $wpdb->insert($wpdb->prefix . "duplicator_packages", array('name' => $this->Name, 'hash' => $this->Hash, 'status' => DUP_PackageStatus::START, 'created' => current_time('mysql', get_option('gmt_offset', 1)), 'owner' => isset($current_user->user_login) ? $current_user->user_login : '******', 'package' => $packageObj));
         if ($results == false) {
             $error_result = $wpdb->print_error();
             DUP_Log::Error("Unable to insert record into database table.", "'{$error_result}'");
         }
         $this->ID = $wpdb->insert_id;
     }
     //START BUILD
     //PHPs serialze method will return the object but the ID above is not passed
     //for one reason or another so passing the object back in seems to do the trick
     $this->Database->Build($this);
     $this->Archive->Build($this);
     $this->Installer->Build($this);
     //VALIDATE FILE SIZE
     $dbSizeRead = DUP_Util::ByteSize($this->Database->Size);
     $zipSizeRead = DUP_Util::ByteSize($this->Archive->Size);
     $exeSizeRead = DUP_Util::ByteSize($this->Installer->Size);
     if (!($this->Archive->Size && $this->Database->Size && $this->Installer->Size)) {
         DUP_Log::Error("A required file contains zero bytes.", "Archive Size: {$zipSizeRead} | SQL Size: {$dbSizeRead} | Installer Size: {$exeSizeRead}");
     }
     $this->SetStatus(DUP_PackageStatus::COMPLETE);
     $timerEnd = DUP_Util::GetMicrotime();
     $timerSum = DUP_Util::ElapsedTime($timerEnd, $timerStart);
     $this->Runtime = $timerSum;
     $this->ExeSize = $exeSizeRead;
     $this->ZipSize = $zipSizeRead;
     $this->buildCleanup();
     $info = "\n********************************************************************************\n";
     $info .= "RECORD ID:[{$this->ID}]\n";
     $info .= "FILE SIZE: Archive:{$zipSizeRead} | SQL:{$dbSizeRead} | Installer:{$exeSizeRead}\n";
     $info .= "TOTAL PROCESS RUNTIME: {$timerSum}\n";
     $info .= "DONE PROCESSING => {$this->Name} " . @date("Y-m-d H:i:s") . "\n";
     $info .= "********************************************************************************\n";
     DUP_Log::Info($info);
     DUP_Log::Close();
     return $this;
 }
예제 #6
0
 /**
  *  CREATE
  *  Creates the zip file and adds the SQL file to the archive
  */
 public static function Create(DUP_Archive $archive)
 {
     try {
         $timerAllStart = DUP_Util::GetMicrotime();
         $package_zip_flush = DUP_Settings::Get('package_zip_flush');
         self::$compressDir = rtrim(DUP_Util::SafePath($archive->PackDir), '/');
         self::$filterDirsArray = array_map('DUP_Util::SafePath', explode(";", $archive->FilterDirs, -1));
         self::$filterDirsList = $archive->FilterDirs;
         self::$filterExtsArray = explode(";", $archive->FilterExts, -1);
         self::$filterExtsList = $archive->FilterExts;
         self::$filterOn = $archive->FilterOn;
         self::$sqlPath = DUP_Util::SafePath("{$archive->Package->StorePath}/{$archive->Package->Database->File}");
         self::$zipPath = DUP_Util::SafePath("{$archive->Package->StorePath}/{$archive->File}");
         self::$zipArchive = new ZipArchive();
         self::$filterDirsOn = count(self::$filterDirsArray);
         self::$filterExtsOn = count(self::$filterExtsArray);
         self::$networkFlush = empty($package_zip_flush) ? false : $package_zip_flush;
         DUP_Log::Info("\n********************************************************************************");
         DUP_Log::Info("ARCHIVE (ZIP):");
         DUP_Log::Info("********************************************************************************");
         DUP_Log::Info("ARCHIVE DIR:  " . self::$compressDir);
         DUP_Log::Info("ARCHIVE FILE: " . basename(self::$zipPath));
         DUP_Log::Info("FILTER DIRS:  " . self::$filterDirsList);
         DUP_Log::Info("FILTER EXTS:  " . self::$filterExtsList);
         //--------------------------------
         //OPEN ZIP
         $isZipOpen = self::$zipArchive->open(self::$zipPath, ZIPARCHIVE::CREATE) === TRUE;
         if (!$isZipOpen) {
             DUP_Log::Error("Cannot open zip file with PHP ZipArchive.", "Path location [" . self::$zipPath . "]");
         }
         //--------------------------------
         //ADD FILES
         DUP_Log::Info("----------------------------------------");
         DUP_Log::Info("SCANNING");
         $timerFilesStart = DUP_Util::GetMicrotime();
         if (self::$filterOn && (self::$filterDirsOn || self::$filterExtsOn)) {
             DUP_Log::Info("FILTERS *ON*");
             !in_array(self::$compressDir, self::$filterDirsArray) ? self::recurseDirsWithFilters(self::$compressDir) : DUP_Log::Info("-filter@[" . self::$compressDir . "]");
         } else {
             DUP_Log::Info("FILTERS *OFF*");
             self::recurseDirs(self::$compressDir);
         }
         $timerFilesEnd = DUP_Util::GetMicrotime();
         $timerFilesSum = DUP_Util::ElapsedTime($timerFilesEnd, $timerFilesStart);
         DUP_Log::Info("STATS:\tDirs " . self::$countDirs . " | Files " . self::$countFiles . " | Links " . self::$countLinks);
         DUP_Log::Info("SIZE:\t" . DUP_Util::ByteSize(self::$size));
         DUP_Log::Info("TIME:\t{$timerFilesSum}");
         DUP_Log::Info("----------------------------------------");
         DUP_Log::Info("COMPRESSING");
         //--------------------------------
         //ADD SQL
         $isSQLInZip = self::$zipArchive->addFile(self::$sqlPath, "database.sql");
         if ($isSQLInZip) {
             DUP_Log::Info("SQL ADDED: " . basename(self::$sqlPath));
         } else {
             DUP_Log::Error("Unable to add database.sql file to archive.", "SQL File Path [" . self::$sqlath . "]");
         }
         self::$zipArchive->close();
         self::$zipArchive->open(self::$zipPath, ZipArchive::CREATE);
         DUP_Log::Info(print_r(self::$zipArchive, true));
         //--------------------------------
         //LOG FINAL RESULTS
         DUP_Util::FcgiFlush();
         $zipCloseResult = self::$zipArchive->close();
         $zipCloseResult ? DUP_Log::Info("COMPRESSION RESULT: '{$zipCloseResult}'") : DUP_Log::Error("ZipArchive close failure.", "This hosted server may have a disk quota limit.\nCheck to make sure this archive file can be stored.");
         $timerAllEnd = DUP_Util::GetMicrotime();
         $timerAllSum = DUP_Util::ElapsedTime($timerAllEnd, $timerAllStart);
         self::$zipFileSize = @filesize(self::$zipPath);
         DUP_Log::Info("COMPRESSED SIZE: " . DUP_Util::ByteSize(self::$zipFileSize));
         DUP_Log::Info("ARCHIVE RUNTIME: {$timerAllSum}");
     } catch (Exception $e) {
         DUP_Log::Error("Runtime error in package.archive.zip.php constructor.", "Exception: {$e}");
     }
 }