晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/stando/www/wp-content/plugins/duplicator/classes/package/ |
Upload File : |
<?php
defined('ABSPATH') || defined('DUPXABSPATH') || exit;
// Exit if accessed directly
if (! defined('DUPLICATOR_VERSION')) exit;
require_once (DUPLICATOR_PLUGIN_PATH.'classes/package/class.pack.archive.php');
/**
* Creates a zip file using the built in PHP ZipArchive class
*/
class DUP_Zip extends DUP_Archive
{
//PRIVATE
private static $compressDir;
private static $countDirs = 0;
private static $countFiles = 0;
private static $sqlPath;
private static $zipPath;
private static $zipFileSize;
private static $zipArchive;
private static $limitItems = 0;
private static $networkFlush = false;
private static $scanReport;
/**
* Creates the zip file and adds the SQL file to the archive
*/
public static function create(DUP_Archive $archive, $buildProgress)
{
try {
$timerAllStart = DUP_Util::getMicrotime();
$package_zip_flush = DUP_Settings::Get('package_zip_flush');
self::$compressDir = rtrim(wp_normalize_path(DUP_Util::safePath($archive->PackDir)), '/');
self::$sqlPath = DUP_Settings::getSsdirTmpPath()."/{$archive->Package->Database->File}";
self::$zipPath = DUP_Settings::getSsdirTmpPath()."/{$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;
$filterFiles = empty($archive->FilterFiles) ? 'not set' : $archive->FilterFiles;
$filterOn = ($archive->FilterOn) ? 'ON' : 'OFF';
$filterDirsFormat = rtrim(str_replace(';', "\n\t", $filterDirs));
$filterFilesFormat = rtrim(str_replace(';', "\n\t", $filterFiles));
$lastDirSuccess = self::$compressDir;
//LOAD SCAN REPORT
$json = file_get_contents(DUP_Settings::getSsdirTmpPath()."/{$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) {
$error_message = "Cannot open zip file with PHP ZipArchive.";
$buildProgress->set_failed($error_message);
DUP_Log::Error($error_message, "Path location [".self::$zipPath."]", Dup_ErrorBehavior::LogOnly);
$archive->Package->setStatus(DUP_PackageStatus::ERROR);
return;
}
DUP_Log::Info("ARCHIVE DIR: ".self::$compressDir);
DUP_Log::Info("ARCHIVE FILE: ".basename(self::$zipPath));
DUP_Log::Info("FILTERS: *{$filterOn}*");
DUP_Log::Info("DIRS:\n\t{$filterDirsFormat}");
DUP_Log::Info("FILES:\n\t{$filterFilesFormat}");
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
$sql_ark_file_path = $archive->Package->getSqlArkFilePath();
$isSQLInZip = self::$zipArchive->addFile(self::$sqlPath, $sql_ark_file_path);
if ($isSQLInZip) {
DUP_Log::Info("SQL ADDED: ".basename(self::$sqlPath));
} else {
$error_message = "Unable to add database.sql to archive.";
DUP_Log::Error($error_message, "SQL File Path [".self::$sqlPath."]", Dup_ErrorBehavior::LogOnly);
$buildProgress->set_failed($error_message);
$archive->Package->setStatus(DUP_PackageStatus::ERROR);
return;
}
self::$zipArchive->close();
self::$zipArchive->open(self::$zipPath, ZipArchive::CREATE);
//ZIP DIRECTORIES
$info = '';
foreach (self::$scanReport->ARC->Dirs as $dir) {
$emptyDir = $archive->getLocalDirPath($dir);
if (is_readable($dir) && self::$zipArchive->addEmptyDir($emptyDir)) {
self::$countDirs++;
$lastDirSuccess = $dir;
} else {
//Don't warn when dirtory is the root path
if (strcmp($dir, rtrim(self::$compressDir, '/')) != 0) {
$dir_path = strlen($dir) ? "[{$dir}]" : "[Read Error] - last successful read was: [{$lastDirSuccess}]";
$info .= "DIR: {$dir_path}\n";
}
}
}
//LOG Unreadable DIR info
if (strlen($info)) {
DUP_Log::Info("\nWARNING: Unable to zip directories:");
DUP_Log::Info($info);
}
/**
* count update for integrity check
*/
$sumItems = (self::$countDirs + self::$countFiles);
/* ZIP FILES: Network Flush
* This allows the process to not timeout on fcgi
* setups that need a response every X seconds */
$totalFileCount = count(self::$scanReport->ARC->Files);
$info = '';
if (self::$networkFlush) {
foreach (self::$scanReport->ARC->Files as $file) {
$file_size = filesize($file);
$localFileName = $archive->getLocalFilePath($file);
if (is_readable($file)) {
if (defined('DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR') && DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR && $file_size < DUP_Constants::ZIP_STRING_LIMIT && self::$zipArchive->addFromString($localFileName, file_get_contents($file))) {
Dup_Log::Info("Adding {$file} to zip");
self::$limitItems++;
self::$countFiles++;
} elseif (self::$zipArchive->addFile($file, $localFileName)) {
Dup_Log::Info("Adding {$file} to zip");
self::$limitItems++;
self::$countFiles++;
} else {
$info .= "FILE: [{$file}]\n";
}
} else {
$info .= "FILE: [{$file}]\n";
}
//Trigger a flush to the web server after so many files have been loaded.
if (self::$limitItems > DUPLICATOR_ZIP_FLUSH_TRIGGER) {
self::$zipArchive->close();
self::$zipArchive->open(self::$zipPath);
self::$limitItems = 0;
DUP_Util::fcgiFlush();
DUP_Log::Info("Items archived [{$sumItems}] flushing response.");
}
if(self::$countFiles % 500 == 0) {
// Every so many files update the status so the UI can display
$archive->Package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::ARCSTART, DUP_PackageStatus::ARCVALIDATION, $totalFileCount, self::$countFiles);
$archive->Package->update();
}
}
}
//Normal
else {
foreach (self::$scanReport->ARC->Files as $file) {
$file_size = filesize($file);
$localFileName = $archive->getLocalFilePath($file);
if (is_readable($file)) {
if (defined('DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR') && DUPLICATOR_ZIP_ARCHIVE_ADD_FROM_STR && $file_size < DUP_Constants::ZIP_STRING_LIMIT && self::$zipArchive->addFromString($localFileName, file_get_contents($file))) {
self::$countFiles++;
} elseif (self::$zipArchive->addFile($file, $localFileName)) {
self::$countFiles++;
} else {
$info .= "FILE: [{$file}]\n";
}
} else {
$info .= "FILE: [{$file}]\n";
}
if(self::$countFiles % 500 == 0) {
// Every so many files update the status so the UI can display
$archive->Package->Status = DupLiteSnapLibUtil::getWorkPercent(DUP_PackageStatus::ARCSTART, DUP_PackageStatus::ARCVALIDATION, $totalFileCount, self::$countFiles);
$archive->Package->update();
}
}
}
//LOG Unreadable FILE info
if (strlen($info)) {
DUP_Log::Info("\nWARNING: Unable to zip files:");
DUP_Log::Info($info);
unset($info);
}
DUP_Log::Info(print_r(self::$zipArchive, true));
/**
* count update for integrity check
*/
$archive->file_count = self::$countDirs + self::$countFiles;
DUP_Log::Info("FILE ADDED TO ZIP: ".$archive->file_count);
//--------------------------------
//LOG FINAL RESULTS
DUP_Util::fcgiFlush();
$zipCloseResult = self::$zipArchive->close();
if($zipCloseResult) {
DUP_Log::Info("COMPRESSION RESULT: '{$zipCloseResult}'");
} else {
$error_message = "ZipArchive close failure.";
DUP_Log::Error($error_message,
"The ZipArchive engine is having issues zipping up the files on this server. For more details visit the FAQ\n"
. "I'm getting a ZipArchive close failure when building. How can I resolve this?\n"
. "[https://snapcreek.com/duplicator/docs/faqs-tech/#faq-package-165-q]",
Dup_ErrorBehavior::LogOnly);
$buildProgress->set_failed($error_message);
$archive->Package->setStatus(DUP_PackageStatus::ERROR);
return;
}
$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) {
$error_message = "Runtime error in class.pack.archive.zip.php constructor.";
DUP_Log::Error($error_message, "Exception: {$e}", Dup_ErrorBehavior::LogOnly);
$buildProgress->set_failed($error_message);
$archive->Package->setStatus(DUP_PackageStatus::ERROR);
return;
}
}
}