Я уже писал
как делать бэкап БД в Dropbox. В Dropbox меня смущали две вещи: (1) небольшой объем бесплатного хранилища - 12 Гб (со всем ухищрениями и рефералами); (2) отсутствие нормального класса для работы с API.
Поэтому я подыскивал более подходящее облачное хранилище для бэкапов. Знакомьтесь -
Box. Сейчас по
акции можно получить 50 Гб пожизненно. Достаточно залогиниться в сервис мобильного устройства. Я логинился со своего Samsung Galaxy Tab 10.1 - 50 Гб дали почти сразу.
Другим преимуществом является
готовый PHP-класс для работы с API сервиса (есть и
другие библиотеки), который позволяет не только загружать файлы, но и создавать папки.
Для начала работы нужно будет создать приложение и авторизовать его под аккаунтом нашего юзера. Как это сделать подробно описано в
документации. В результате у вас должны быть Application Key и Auth Token. C ними и будем работать.
Для удобства я решил раскладывать бэкапы по папкам год/месяц.
Код выглядит так:
$currYear = date('Y');
$currMonth = date('m');
$folderId = 0;
$BoxNet = new Box_Rest_Client(CONFIG_BOXNET_APP_KEY);
$BoxNet->auth_token = CONFIG_BOXNET_APP_TOKEN;
// Ищем папку с годом
$arListing = $BoxNet->get('get_account_tree', array(
'folder_id' => CONFIG_BOXNET_BACKUP_FOLDER_ID,
'params' => array('nozip', 'nofiles', 'simple')
));
if ($arListing['status'] == 'listing_ok') {
if (is_array($arListing['tree']['folder']['folders'])) {
foreach($arListing['tree']['folder']['folders'] as $arFolder) {
if ($arFolder['@attributes']['name'] == $currYear) {
$folderId = $arFolder['@attributes']['id'];
}
}
}
// Не нашли папку - создаем
if ($folderId == 0) {
$arNewFolder = $BoxNet->get('create_folder', array(
'parent_id' => CONFIG_BOXNET_BACKUP_FOLDER_ID,
'name' => $currYear,
'share' => 0
));
// Создаем папку с месяцем
$arNewFolder = $BoxNet->get('create_folder', array(
'parent_id' => $arNewFolder['folder']['folder_id'],
'name' => $currMonth,
'share' => 0
));
$folderId = $arNewFolder['folder']['folder_id'];
}
else {
// Ищем папку с месяцем
$arListing = $BoxNet->get('get_account_tree', array(
'folder_id' => $folderId,
'params' => array('nozip', 'nofiles', 'simple')
));
$folderFound = false;
if ($arListing['status'] == 'listing_ok') {
if (is_array($arListing['tree']['folder']['folders'])) {
foreach($arListing['tree']['folder']['folders'] as $arFolder) {
if ($arFolder['@attributes']['name'] == $currMonth) {
$folderId = $arFolder['@attributes']['id'];
$folderFound = true;
}
}
}
// Не нашли папку - создаем
if (!$folderFound) {
// Создаем папку с месяцем
$arNewFolder = $BoxNet->get('create_folder', array(
'parent_id' => $folderId,
'name' => $currMonth,
'share' => 0
));
$folderId = $arNewFolder['folder']['folder_id'];
}
}
}
}
if ($folderId > 0) {
$dumpFile = $_SERVER['DOCUMENT_ROOT'] . CONFIG_TEMP_PATH . '/avtobeginner-' . date("d-m-Y") . '.sql';
$dumpQuery = 'mysqldump -u' . CONFIG_DB_USER . ' -p' . CONFIG_DB_PASSWORD . ' -h' . CONFIG_DB_HOST . ' ' . CONFIG_DB_NAME . ' > ' . $dumpFile . '; gzip -f ' . $dumpFile;
exec($dumpQuery);
$dumpFile .= '.gz';
if (file_exists($dumpFile)) {
$BoxNetFile = new Box_Client_File($dumpFile, 'avtobeginner-' . date("d-m-Y") . '.sql.gz');
$BoxNetFile->attr('folder_id', $folderId);
$BoxNet->upload($BoxNetFile, array(), true);
}
else {
// Ошибка
}
}
?>
В константе CONFIG_BOXNET_BACKUP_FOLDER_ID хранится ID корневой папки (у меня она называется Backup). ID можно узнать с помощью функции get_account_tree или присвоить 0 (корневая папка).