【发布时间】:2022-01-14 22:14:12
【问题描述】:
我创建了几个脚本来备份我的网站,脚本分为两个文件:
backup.php(执行备份然后重定向到 index.php)
index.php(调用文件 backup.php 并在显示备份后)
我想配置一种方法来保留最后 X(3、4 等)个备份,同时删除最旧的备份。
我正在使用 glob、filemtime、array_multisort(array_map('filemtime', $backups)、SORT_NUMERIC、SORT_DESC、$backups)、取消链接。
所以第一个文件是最新的。
备份.php:
$root = realpath($_SERVER['DOCUMENT_ROOT']);
$sdir = realpath($_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']));
$name = "BackUp_" . date("[m-d-Y][H-i-s]") . ".tar";
$skip = "BackUp*.tar";
if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
$root = str_replace("\\", "/", $root);
$sdir = str_replace("\\", "/", $sdir);
}
if (function_exists('exec')) {
@exec("tar -cf $sdir/$name $exclude --exclude='$sdir/$skip' --exclude='$root/.htaccess' $root/* ");
if (file_exists("$root/.htaccess")) {
@exec("tar -rf $sdir/$name $root/.htaccess ");
}
}
$protocol = check_protocol() ? 'https://' : 'http://';
$absolute = $protocol . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
header("Location: $absolute/index.php");
index.php:
$sdir = $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']) . "/";
$backups = glob($sdir . "BackUp*.tar");
array_multisort(array_map('filemtime', $backups), SORT_NUMERIC, SORT_DESC, $backups);
$count_backups = 0;
if (file_exists("dat/backdata.dat")) {
$number_of_backups = file_get_contents("dat/backdata.dat");
$number_of_backups = trim(htmlentities($number_of_backups, ENT_QUOTES | ENT_HTML401, 'UTF-8'));
} else {
$number_of_backups = 0;
}
foreach ($backups as $backup) {
$archive = basename($backup);
++$count_backups;
echo " <span class=\"download\"><a href=\"$archive\" class=\"download-me tooltip\" onclick=\"return confirm('Download the backup " . "$archive?');\"><span class=\"tip\">You can download the backup " . "$archive</span>$archive</a></span> <span class=\"delete\"><a class=\"delete-me tooltip\" href=\"index.php?delete=$archive\" onclick=\"return confirm('Are you sure to delete the backup " . "$archive?');\"><span class=\"tip\">You can delete the backup " . "$archive</span>Delete</a></span> <span class=\"filesize\"><span class=\"filesize-me\">" . GetRealSize($archive) . "</span></span><br>" . PHP_EOL;
}
if ($count_backups == 0) {
echo " <span class=\"warn\">Press BackUp and wait until the backup is done!</span><br>" . PHP_EOL;
}
我有一个名为“backdata.dat”的文件,其中只包含数字 (int)。可以编辑此文件以配置要保留的备份数量。
我想以这种方式使用 backdata.dat:
backdata.dat 包含 0 对可能的备份数量没有限制
backdata.dat 包含任何其他大于零的数字,直到 100 用于删除其他更旧的数字并保留前 3、4、10、20、50 等...
除了 index.php 之外的脚本工作正常,因为我尝试过但无法解决问题...
我试过了:
index.php
$sdir = $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']) . "/";
$backups = glob($sdir . "BackUp*.tar");
array_multisort(array_map('filemtime', $backups), SORT_NUMERIC, SORT_DESC, $backups);
$count_backups = 0;
if (file_exists("dat/backdata.dat")) {
$number_of_backups = file_get_contents("dat/backdata.dat");
$number_of_backups = trim(htmlentities($number_of_backups, ENT_QUOTES | ENT_HTML401, 'UTF-8'));
} else {
$number_of_backups = 0;
}
foreach ($backups as $backup) {
$archive = basename($backup);
++$count_backups;
if (($count_backups > $number_of_backups) && ($number_of_backups > 0)) {
unlink($archive);
echo " <span class=\"download\"><a href=\"$archive\" class=\"download-me tooltip\" onclick=\"return confirm('Download the backup " . "$archive?');\"><span class=\"tip\">You can download the backup " . "$archive</span>$archive</a></span> <span class=\"delete\"><a class=\"delete-me tooltip\" href=\"index.php?delete=$archive\" onclick=\"return confirm('Are you sure to delete the backup " . "$archive?');\"><span class=\"tip\">You can delete the backup " . "$archive</span>Delete</a></span> <span class=\"filesize\"><span class=\"filesize-me\">" . GetRealSize($archive) . "</span></span><br>" . PHP_EOL;
}
}
if ($count_backups == 0) {
echo " <span class=\"warn\">Press BackUp and wait until the backup is done!</span><br>" . PHP_EOL;
}
此代码无法正常工作。如何解决?谢谢。亚历山德罗
【问题讨论】:
标签: php exec glob filemtime array-multisort