Архивиране на уеб проекти към

В ранните си детски години не разбирах важността на архивирането на данни. Но, както се казва, разбирането идва с опит. Често опитът е много горчив. В моя случай хостингът два пъти уби базата на сайта MathInfinity, създаден още в студентските ми години.

Големите проекти могат да си позволят да отделят цели сървъри за архивиране. Има обаче огромен брой малки проекти, които работят само с вашия ентусиазъм. Тези проекти също трябва да бъдат архивирани.

Идеята за създаване на архиви на услуги като Dropbox, Ubuntu One, Yandex Disk, Google Drive и т.н. отдавна привлече вниманието ми. Десетки гигабайти свободно пространство, което теоретично може да се използва за архивиране на данни.

Сега тази идея получи първото си въплъщение. Yandex Disk беше избран като услуга за създаване на архиви. Не претендирам да съм гениална идея. И, разбира се, изобретяването на велосипеда започна с търсене на готови решения в интернет. Целият намерен код или вече не работи, или е напълно нечетлив. Предпочитам да разбера как работят приложенията ми.

Няма да кажа, че API на услугите на Yandex имат отлична документация. Има обаче примери и връзки към конкретни стандарти. Това беше достатъчно.

След проучване на проблема задачата за архивиране на данни беше разделена на следните точки:

Последните две точки са въпрос на техника, но въпреки това реших да ги включа в описанието.

Използвам рамката на Limb от дълго време. И за да не преоткривате колелата на вашия велосипед, кодовете на класовете , използващи тази рамка, ще бъдат дадени по-долу. Всички класове и функции с префикс lmb са стандартни класове и функции на Limb.

Регистрация на приложение

Упълномощаване в Yandex с помощта на OAuth

Операции с Yandex.Disk

Създаване и изпращане на резервно копие на Yandex диск

Ще създадем резервно копие по следния алгоритъм:

  1. Изтриваме ненужните резервни копия от диска Yandex. Ако на диска са натрупани повече от n резервни копия, изтрийте старите, вземете числото n от конфигурацията.
  2. В някаква временна папка създаваме дъмп на базата данни Mysql. В моя код това се прави чрез извикване на командата mysqldump.
  3. В същата папка копирайте файловете, които трябва да бъдат запазени.
  4. Архивираме папката със създадените файлове.
  5. Копирайте получения архив на Yandex Disk
  6. Изтриване на временни файлове
Възможни са вариации на последния набор от действия. Тук полетът на фантазията не е ограничен. Посоченият комплект ми е достатъчен. Горепосочените действия могат да бъдат извършени с помощта на следния клас.

Не разресвах кода на последния клас. Мисля, че заинтересованият читател сам ще може да добавя, премахва или променя методи според нуждите си. Работата с се свежда до зареждане на конфигурацията в класа чрез конструктора и изпълнение на метода execute

Извършване на копиране на cron

Случи се така, че внедрявам всички cron задачи под формата на наследници на класове:

Тук, както навсякъде по-горе, се използва стандартният механизъм за конфигурационен файл от Limb. По принцип един клас може да се направи абстрактен, но това е удобно за всеки. Остава въпросът за стартирането. Самата задача се стартира с помощта на скрипта cron_runner.php. Който свързва файл с клас задачи, създава обект от този клас и гарантира, че една и съща задача не се изпълнява едновременно от два процеса (последният се реализира на базата на заключвания на файлове).

Командата е написана в crontab:

Като аргумент на скрипта предаваме пътя, относителен към include_path към файла с класа. Името на самия клас със задачата, която скриптът определяиме на файл.

Заключение

Ще се радвам, ако този код е полезен на някого. По-долу са дадени връзки към пълен работещ пример. Градивната критика е добре дошла. Очаквам вашите коментари и отзиви.

Връзки и източници

Hardcore conf в C++. Каним само професионалисти.