CMSimple_XH 開発者ドキュメント
Backup.php
1 <?php
2 
16 namespace XH;
17 
29 class Backup
30 {
36  private $contentFolders;
37 
43  private $contentFolder;
44 
50  private $contentFile;
51 
57  private $maxBackups;
58 
66  public function __construct(array $contentFolders)
67  {
68  global $cf;
69 
70  $this->contentFolders = $contentFolders;
71  $this->maxBackups = (int) $cf['backup']['numberoffiles'];
72  }
73 
79  public function execute()
80  {
81  $result = '';
82  foreach ($this->contentFolders as $folder) {
83  $result .= $this->backupSingleFolder($folder);
84  }
85  return $result;
86  }
87 
95  public function backupSingleFolder($folder)
96  {
97  $result = '';
98  $this->contentFolder = $folder;
99  $this->contentFile = $this->contentFolder . 'content.htm';
100  $basename = date("Ymd_His") . '_content.htm';
101  $filename = $this->contentFolder . $basename;
102  $needsBackup = $this->needsBackup();
103  if (!$needsBackup || $this->backupFile($basename)) {
104  if ($needsBackup) {
105  $result .= $this->renderCreationInfo($filename);
106  }
107  $deletions = $this->deleteSurplusBackups();
108  $result .= $this->renderDeletionResults($deletions);
109  } else {
110  e('cntsave', 'backup', $filename);
111  }
112  return $result;
113  }
114 
120  private function findBackups()
121  {
122  $result = array();
123  if (is_dir($this->contentFolder) && ($dir = opendir($this->contentFolder))) {
124  while (($entry = readdir($dir)) !== false) {
125  if (XH_isContentBackup($entry)) {
126  $result[] = $entry;
127  }
128  }
129  closedir($dir);
130  }
131  sort($result);
132  return $result;
133  }
134 
140  private function needsBackup()
141  {
142  if ($this->maxBackups <= 0) {
143  return false;
144  }
145  $latestBackup = $this->latestBackup();
146  if ($latestBackup) {
147  return md5_file($this->contentFile) != md5_file($latestBackup);
148  } else {
149  return true;
150  }
151  }
152 
160  private function latestBackup()
161  {
162  $backups = $this->findBackups();
163  if (!empty($backups)) {
164  return $this->contentFolder . $backups[count($backups) - 1];
165  } else {
166  return false;
167  }
168  }
169 
177  private function backupFile($basename)
178  {
179  return copy($this->contentFile, $this->contentFolder . $basename);
180  }
181 
187  private function deleteSurplusBackups()
188  {
189  $result = array();
190  $basenames = $this->findBackups();
191  $basenames = array_slice($basenames, 0, -$this->maxBackups);
192  foreach ($basenames as $basename) {
193  $filename = $this->contentFolder . $basename;
194  $result[$filename] = unlink($filename);
195  }
196  return $result;
197  }
198 
208  private function renderCreationInfo($filename)
209  {
210  global $tx;
211 
212  $message = sprintf('%s %s %s', utf8_ucfirst($tx['filetype']['backup']), $filename, $tx['result']['created']);
213  return XH_message('info', $message);
214  }
215 
223  private function renderDeletionResults(array $deletions)
224  {
225  $results = '';
226  foreach ($deletions as $filename => $deleted) {
227  if ($deleted) {
228  $results .= $this->renderDeletionInfo($filename);
229  } else {
230  e('cntdelete', 'backup', $filename);
231  }
232  }
233  return $results;
234  }
235 
245  private function renderDeletionInfo($filename)
246  {
247  global $tx;
248 
249  $message = sprintf('%s %s %s', utf8_ucfirst($tx['filetype']['backup']), $filename, $tx['result']['deleted']);
250  return XH_message('info', $message);
251  }
252 }
execute()
Definition: Backup.php:79
__construct(array $contentFolders)
Definition: Backup.php:66
XH_isContentBackup($filename, $regularOnly=true)
Definition: functions.php:1949
backupSingleFolder($folder)
Definition: Backup.php:95
utf8_ucfirst($string)
Definition: utf8.php:118
$cf
Definition: cms.php:272
e($et, $ft, $fn)
Definition: functions.php:655
$tx
Definition: cms.php:363
XH_message($type, $message)
Definition: functions.php:1806