【问题标题】:delete all older files backup.tar from current folder and keep the last 3 backup.tar in php using glob从当前文件夹中删除所有旧文件 backup.tar 并使用 glob 将最后 3 个 backup.tar 保留在 php 中
【发布时间】: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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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


    【解决方案1】:

    解决了!这是一个错误,我找到的正确方法在这里:

      foreach ($backups as $backup) {
        $archive = basename($backup);
        ++$count_backups;
        if (($count_backups > $number_of_backups) && ($number_of_backups > 0)) {
          unlink($archive);
        } else {
          echo "    <span class=\"download\"><a href=\"$archive\" class=\"download-me tooltip\" onclick=\"return confirm('$strg_10 " . "$archive?');\"><span class=\"tip\">$strg_10 " . "$archive</span>$archive</a></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"delete\"><a class=\"delete-me tooltip\" href=\"index.php?delete=$archive\" onclick=\"return confirm('$strg_11 " . "$archive?');\"><span class=\"tip\">$strg_11 " . "$archive</span>$strg_11</a></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"filesize\"><span class=\"filesize-me\">" . GetRealSize($archive) . "</span></span><br>" . PHP_EOL;
        }
      }
    

    还是谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      相关资源
      最近更新 更多