Я написал базовую систему управления контентом для своего веб-сайта, включая панель администрирования. Я понимаю базовый файл IO, а также копирование через PHP, но мои попытки сценария резервного копирования, вызываемого из сценария, потерпели неудачу. Я попытался сделать это:
//... authentication, other functions for(scandir($homedir) as $buffer){ if(is_dir($buffer)){ //Add $buffer to an array } else{ //Back up the file } } for($founddirectories as $dir){ for(scandir($dir) as $b){ //Backup as above, adding to $founddirectories } }
Но, похоже, это не сработало.
Я знаю, что могу сделать это с помощью FTP, но я хочу полностью серверное решение, к которому можно получить доступ в любом месте с достаточной авторизацией.
Вот альтернатива: почему бы вам не вместо Zip исходный каталог ?
function Zip($source, $destination) { if (extension_loaded('zip') === true) { if (file_exists($source) === true) { $zip = new ZipArchive(); if ($zip->open($destination, ZIPARCHIVE::CREATE) === true) { $source = realpath($source); if (is_dir($source) === true) { $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { $file = realpath($file); if (is_dir($file) === true) { $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); } else if (is_file($file) === true) { $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); } } } else if (is_file($source) === true) { $zip->addFromString(basename($source), file_get_contents($source)); } } return $zip->close(); } } return false; }
Вы даже можете разархивировать его и архивировать тот же эффект, хотя я должен сказать, что предпочитаю, чтобы мои резервные копии сжаты в формате zip-файла.
если у вас есть доступ к исполняемому двоичному файлу tar через функцию exec, это будет быстрее и лучше, я думаю:
exec('tar -zcvf ' . realpath('some directory') .'/*);
или
chdir('some directory') exec('tar -zcvf ./*');
Вы можете использовать рекурсию.
for(scandir($dir) as $dir_contents){ if(is_dir($dir_contents)){ backup($dir_contents); }else{ //back up the file } }
вы получили это почти правильно
$dirs = array($homedir); $files = array(); while(count($dirs)) { $dir = array_shift($dirs); foreach(glob("$dir/*") as $e) if(is_dir($e)) $dirs[] = $e; else $files[] = $e; } // here $files[] contains all files from $homedir and below
glob () лучше, чем scandir () из-за более согласованного вывода
Я что-то назвал UPHP. Просто вызовите zip()
чтобы сделать это. Вот:
<?php include "uphplib.php"; $folder = "data"; $dest = "backup/backup.zip"; zip($folder, $dest); ?>
UPHP – это библиотека PHP. скачать: здесь
Вот сценарий резервного копирования с возможностями ftp, scp, mysqldump, pg_dump и файловой системы https://github.com/skywebro/php-backup
Я использую простую функцию для резервного копирования файла:
<?php $oldfile = 'myfile.php'; $newfile = 'backuped.php'; copy($oldfile, $newfile) or die("Unable to backup"); echo 'Backup is Completed'; ?>