Интеграция Amazon S3 с WordPress

Причина использования Amazon S3 для хранения важных данных вытекает из правила резервного копирования “3-2-1”, придуманных Питером Крогом. Согласно правилу 3-2-1, вы сохраните три копии любых критически важных данных: исходные данные, резервную копию на съемных носителях и вторую резервную копию в месте расположения за пределами участка (в нашем случае облако Amazon S3).

Облачные вычисления, кратко

Облачные вычисления — это общий термин для любых данных или программного обеспечения, размещенных за пределами локальной системы. Облачные вычисления делятся на три основных типа услуг: инфраструктура как услуга (IaaS), платформа как услуга (PaaS) и программное обеспечение как услуга (SaaS).

  • Инфраструктура как услуга.
    IaaS предоставляет виртуальные хранилища, виртуальные машины и другие аппаратные ресурсы, которые клиенты могут использовать на платной основе. Примерами IaaS являются Amazon S3, Amazon EC2 и RackSpace Cloud.
  • Платформа как услуга.
    PaaS предоставляет виртуальные машины, интерфейсы программирования приложений, платформы и операционные системы, которые клиенты могут развернуть для своих собственных приложений в Интернете. Force.com, Google AppEngine и Windows Azure являются примерами PaaS.
  • Программное обеспечение как услуга.
    Пожалуй, наиболее распространенным типом облачных услуг является SaaS. Большинство людей используют услуги такого типа ежедневно. SaaS предоставляет полную рабочую среду приложения, к которой пользователь получает доступ через браузер, а не локально установленное приложение. SalesForce.com, Gmail, Google Apps и Basecamp являются некоторыми примерами SaaS.

Для всех типов услуг, перечисленных выше, поставщик услуг несет ответственность за управление облачной системой от имени пользователя. Пользователь избавлен от скуки того, чтобы управлять инфраструктурой, необходимой для работы конкретной службы.

Amazon S3 в ореховой скорлупе

Amazon Web Services (AWS) — это букет веб-сервисов, предлагаемых Amazon, которые вместе составляют платформу облачных вычислений. Наиболее важными и наиболее известными из этих услуг являются Amazon EC2 и Amazon S3. AWS также включает в себя CloudFront, Сервис простой очереди, SimpleDB, упругий блок-магазин. В этой статье мы сосредоточимся исключительно на Amazon S3.

Amazon S3 — это облачная инфраструктура хранения данных, доступная пользователю программно через API веб-службы (или SOAP, либо REST). Используя API, пользователь может хранить различные виды данных в облаке S3. Они могут хранить и получать данные из любой точки в Интернете и в любое время с помощью API. Но S3 не похож на файловую систему, используемую на вашем компьютере. Многие люди думают о S3 как о удаленной файловой системе, содержащей иерархию файлов и каталогов, размещенных Amazon. Ничто не может быть дальше от истины.

Amazon S3 — это система хранения с плоским пространством, лишенная какой бы то ни было иерархии. Каждый контейнер для хранения в S3 называется «ковшом», и каждое ведро выполняет ту же функцию, что и каталог в обычной файловой системе. Однако в ведре нет иерархии (т.е. нельзя создать ведро в ведре). Каждое ведро позволяет хранить различные виды данных, в диапазоне размеров от 1 B до колоссальных 5 ТБ (терабайт), хотя самый большой объект, который может быть загружен в одном запросе PUT составляет 5 ГБ. Очевидно, я не экспериментировал с такими огромными файлами.

Файл, хранящийся в ведре, называется объектом. Объект является основной единицей хранимых данных на S3. Объекты состоят из данных и метаданных. Метаданные — это набор пар имено-ценностей, описывающие объект. Мета данные не являются обязательными, но часто добавляет огромную ценность, будь то мета данные по умолчанию, добавленные S3 (например, дата последнего измененного) или стандартные данные http мета, такие Content-Type как.

Итак, какие объекты можно хранить на S3? Любой вид, который вам нравится. Это может быть простой текстовый файл, лист стиля, исходный код программирования или двоичный файл, такой как изображение, видео или файл ЗИП. Каждый объект S3 имеет свой собственный URL- IC, который можно использовать для доступа к объекту в браузере (при наличии соответствующих разрешений – подробнее об этом позже).

Вы можете написать URL в двух форматах, которые выглядят примерно так:

Название ведра здесь намеренно простой, codediesel . Это может быть более сложным, отражающим структуру вашего приложения, как codediesel.wordpress.backup или codediesel.assets.images .

Каждый объект S3 имеет уникальный URL-адрес, сформированный путем свертывания следующих компонентов:

  1. Протокол http:// https:// (или),
  2. Конечная точка S3 s3.amazonaws.com (),
  3. Название ковш,
  4. Объект ключ, начиная с / .

Для того, чтобы определить ведра, система S3 требует, чтобы вы присвоили имя каждому ведре, которое должно быть уникальным в пространстве имен ведра S3. Таким образом, если пользователь назвал один из своих ведер, company-docs вы не можете создать ведро с этим именем в любом месте в пространстве имен S3. Имена объектов в ведре, однако, должны быть уникальными только для этого ведра; таким образом, два разных ведра могут иметь объекты с одинаковым именем. Кроме того, можно описать объекты, хранящиеся в ведрах, с дополнительной информацией с помощью мета-данных.

Имена ковша должны соответствовать следующим требованиям:

  • Может содержать буквы нижнего регистра, цифры, периоды . (), подчеркивает ( _ ) и дефисы ( - );
  • Должно начинаться с числа или буквы;
  • Должно быть от 3 до 255 символов в длину;
  • Не может быть отформатирован как IP-адрес 265.255.5.4 (например).

Короче говоря, Amazon S3 обеспечивает надежную облачную инфраструктуру хранения данных, доступки через SOAP или REST API. Некоторые распространенные сценарии использования для S3:

  • Резервное копирование и хранение.
    Предоставлять услуги резервного копирования и хранения данных.
  • Принимающие приложения.
    Предоставлять службы, которые развертывают, устанавливают и управляют веб-приложениями.
  • Размещение средств массовой информации.
    Создайте излишную, масштабируемую и высокодоступную инфраструктуру, в ней размещается видео, фото или музыка.
  • Доставка программного обеспечения.
    Размещайте программные приложения, которые клиенты могут загрузить.

Модель ценообразования Amazon S3

Amazon S3 является платной услугой; При регистрации необходимо прикрепить кредитную карту к учетной записи Amazon. Но это удивительно низкая цена, и вы платите только за то, что вы используете; если вы не используете ресурсы в вашей учетной записи S3, вы ничего не платите. Кроме того, в рамках AWS “Бесплатный уровень использования”, после регистрации, новые клиенты AWS получают 5 ГБ памяти Amazon S3, 20000 GET запросов, 2000 PUT запросов, и 15 ГБ данных передачи каждый месяц бесплатно в течение одного года.

Итак, сколько вы платите после бесплатного периода. По приблизительным оценкам, если вы храните 5 ГБ данных в месяц, с передачей данных 15 ГБ и 40000 GET и PUT запросов в месяц, стоимость будет около $ 2,60 в месяц. Это ниже, чем стоимость гамбургера – недорогой по любому стандарту. Цены могут измениться, поэтому используйте калькулятор на веб-сайте S3.

Ваше использование S3 заряжается в соответствии с тремя основными параметрами:

  • Общий объем хранимых данных,
  • Общий объем данных, передаваемых в S3 и из S3 в месяц,
  • Количество запросов, сделанных s3 в месяц.

Ваши сборы за хранение S3 рассчитываются на единице, известном как гигабайт-месяц. Если вы храните 1 ГБ в течение одного месяца, с вас будет взиматься плата за один гигабайт-месяц, который составляет ,14.

Плата за передачу данных зависит от объема данных, загруженных и загруженных из S3. Данные, передаваемые из S3, взимаются по скользящей шкале, начиная с ,12 за гигабайт и уменьшаясь в зависимости от объема, достигая ,050 за гигабайт для всех исходящих передачи данных свыше 350 терабайт в месяц. Обратите внимание, что плата за данные, передаваемые в рамках “региона” Amazon S3 через запрос COPY, и плата за данные, передаваемые между Amazon EC2 и Amazon S3 в пределах одного региона, или за данные, передаваемые между регионом Amazon EC2 в Северной Вирджинии и Стандартный регион Amazon S3 в США. Чтобы избежать сюрпризов, всегда проверяйте последние ценовые политики на Amazon.

Введение в Amazon S3 API и CloudFusion

Теперь с теорией позади нас, давайте перейдем к забавной части: написание кода. Но перед этим вам нужно будет зарегистрироваться в S3 и создать учетную запись AWS. Если у вас еще нет, вам будет предложено создать один, когда вы зарегистрируетесь на Amazon S3.

Прежде чем перейти к кодирующей части, давайте познакомимся с некоторыми визуальными инструментами, которые мы можем использовать для работы с Amazon S3. Различные визуальные и командные линии инструменты доступны, чтобы помочь вам управлять вашей учетной записи S3 и данные в нем. Поскольку визуальные инструменты просты в работе и удобны для пользователя, мы сосредоточимся на них в этой статье. Я предпочитаю работать с консолью управления AWS по соображениям безопасности.

Консоль управления AWS

Консоль управления является частью AWS. Поскольку это часть вашей учетной записи AWS, конфигурация не требуется. После входа в систему у вас будет полный доступ ко всем данным S3 и другим службам AWS. Можно создавать новые ведра, создавать объекты, применять политики безопасности, копировать объекты в разные ведра и выполнять множество других функций.

Организатор S3Fox

Другим популярным инструментом является Организатор S3Fox. S3Fox Организатор является расширение Firefox, что позволяет загружать и загружать файлы и из вашей учетной записи Amazon S3. Интерфейс, который открывается во вкладке браузера Firefox, очень похож на обычного клиента FTP с двойными стеклами. Он отображает файлы на вашем компьютере слева, файлы на S3 справа, и сообщения о состоянии и информацию в панели в нижней части.

Онна Кодирование

Как указывалось ранее, AWS является инфраструктурой веб-сервисов Amazon, которая включает в себя различные облачные сервисы, включая S3, EC2, SimpleDB и CloudFront. Интеграция этих разнообразных услуг может быть сложной задачей. К счастью, в нашем распоряжении есть библиотека SDK в виде CloudFusion,которая позволяет нам работать с AWS без особых усилий. CloudFusion в настоящее время является официальным AWS SDK для PHP, и он охватывает большинство облачных продуктов Amazon: S3, EC2, SimpleDB, CloudFront и многое другое. Для этой должности, я скачал версию системы CloudFusion SDK, но библиотека также доступна в качестве пакета PEAR. Итак, вперед: скачать последнюю версию с официального веб-сайта, и извлечь ЗИП в свой рабочий каталог или на ваш include путь PHP. В извлеченном каталоге вы найдете config-sample.inc.php файл, который следует переименовать в config.inc.php . Вам нужно будет внести некоторые изменения в файл, чтобы отразить ваши учетные данные AWS.

В config файле найдите следующие строки:

define('AWS_KEY', ’);
define('AWS_SECRET_KEY', ’);

Измените линии, чтобы отразить учетные данные Amazon AWS в области безопасности. Вы можете найти учетные данные в разделе учетной записи Amazon AWS, как показано ниже.

Получить ключи, и заполнить их на следующих строках:

define('AWS_KEY', 'your_access_key_id');
define('AWS_SECRET_KEY', 'your_secret_access_key');

Вы можете получить ключ доступа и секретный ключ со страницы аккаунта Amazon:

Со всеми основными требованиями на месте, давайте создадим наше первое ведро на Amazon S3, с именем по вашему выбору. В следующем примере показано ведро по имени com.smashingmagazine.images . (Конечно, к тому времени, когда вы читаете это, это имя, возможно, уже были приняты.) Выберите структуру для названия вашего ведра, которая имеет отношение к вашей работе. Для каждого ведра можно управлять доступом к ведре, просматривать журналы доступа для ведра и его объектов, а также устанавливать географический регион, где Amazon S3 будет хранить ведро и его содержимое.

/* Include the CloudFusion SDK class */
require_once( ‘sdk-1.4.4/sdk.class.php');

/* Our bucket name */
$bucket = 'com.smashingmagazine.images’;

/* Initialize the class */
$s3 = new AmazonS3();

/* Create a new bucket */
$resource = $s3->create_bucket($bucket, AmazonS3::REGION_US_E1);

/* Check if the bucket was successfully created */
if ($resource->isOK()) {
    print("'${bucket}' bucket createdn");
} else {
    print("Error creating bucket '${bucket}'n");
}

Давайте рассмотрим каждую строку в приведенном выше примере. Во-первых, мы включили класс CloudFusion SDK в наш файл. Вам нужно будет настроить путь в зависимости от того, где вы хранили файлы SDK.

require_once( 'sdk-1.4.4/sdk.class.php');

Далее, мы мгновенно Amazon S3 класса:

$s3 = new AmazonS3();

На следующем этапе мы создали собственно ведро; в этом случае, com.smashingmagazine.images . Опять же, имя вашего ведра должно быть уникальным во всех существующих имен ведро в Amazon S3. Один из способов убедиться в этом заключается в префиксе слова с именем вашей компании или домена, как мы уже сделали здесь. Но это не гарантирует, что имя будет доступно. Ничто не мешает никому создать ведро имени com.microsoft.apps или , так что com.ibm.images выбирайте мудро.

$bucket = 'com.smashingmagazine.images’;
$resource = $s3->create_bucket($bucket, AmazonS3::REGION_US_E1);

Повторяю, имена ведер должны соответствовать следующим требованиям:

  • Может содержать буквы нижнего регистра, цифры, периоды . (), подчеркивает ( _ ) и дефисы ( - );
  • Должен начинаться с номера или буквы;
  • Должно быть от 3 до 255 символов в длину;
  • Не может быть отформатирован как IP-адрес 265.255.5.4 (например).

Кроме того, вам нужно будет выбрать географическое местоположение для вашего ведра. Ведро может храниться в одном из нескольких регионов. Причиной выбора одного региона над другим может быть оптимизация задержки, минимизация затрат или соблюдение нормативных требований. Во многих организациях есть политики конфиденциальности и правила о том, где хранить данные, поэтому учитывайте это при выборе местоположения. Объекты никогда не покидают область, в которой они хранятся, если вы явно не переведете их в другой регион. То есть, если ваши данные хранятся на серверах, расположенных в США, они никогда не будут скопированы или переданы Amazon на серверы за пределами этого региона; Это необходимо сделать вручную с помощью инструментов API или AWS. В приведенном выше примере мы выбрали REGION_US_E1 регион.

Вот допустимые значения для регионов:

  • AmazonS3::REGION_US_E1
  • AmazonS3::REGION_US_W1
  • AmazonS3::REGION_EU_W1
  • AmazonS3::REGION_APAC_SE1
  • AmazonS3::REGION_APAC_NE1

Наконец, мы проверили, успешно ли было создано ведро:

if ($resource->isOK()) {
    print("'${bucket}' bucket createdn");
} else {
    print("Error creating bucket '${bucket}'n");
}

Теперь давайте посмотрим, как получить список ведер, которые мы создали на S3. Таким образом, прежде чем приступить, создать еще несколько ведер по своему вкусу. Если у вас есть несколько ведер в вашей учетной записи, пришло время перечислить их.

/* Include the CloudFusion SDK class */
require_once ('sdk-1.4.4/sdk.class.php');

/* Our bucket name */
$bucket = 'com.smashingmagazine.images;

/* Initialize the class */
$s3 = new AmazonS3();

/* Get a list of buckets */
$buckets = $s3->get_bucket_list();

if($buckets)  {
    foreach ($buckets as $b) {
        echo $b . "n";
    }
}

Единственной новой частью приведенного выше кода является следующая строка, которая получает множество имен ведра:

$buckets = $s3->get_bucket_list();

Наконец, мы распечатали все имена наших ведер.

if($buckets)  {
    foreach ($buckets as $b) {
        echo $b . "n";
    }
}

Это завершает наш обзор создания и перечисления ведра в нашей учетной записи S3. Мы также узнали об организаторе S3Fox и консольных инструментах AWS для работы с вашей учетной записью S3.

Загрузка данных на Amazon S3

Теперь, когда мы узнали, как создавать и перечислять ведра в S3, давайте выясним, как положить объекты в ведра. Это немного сложно, и у нас есть множество вариантов на выбор. Основным методом для этого является create_object . Метод принимает следующий формат:

create_object ( $bucket, $filename, [ $opt = null ] )

Первым параметром является название ведра, в котором будет храниться объект. Второй параметр — это имя, под которым файл будет храниться на S3. Использование только этих двух параметров достаточно для создания пустого объекта с данным именем файла. Например, следующий код создаст пустой объект, config-empty.inc названный в com.magazine.resources ведре:

$s3 = new AmazonS3();
$bucket = 'com.magazine.resources';
$response = $s3->create_object($bucket, 'config-empty.inc');

// Success?
var_dump($response->isOK());

Как только объект создан, мы можем получить к нему доступ с помощью URL-адреса. URL для объекта выше будет:

https://s3.amazonaws.com/com.magazine.resources/config-empty.inc

Конечно, если вы попытаются получить доступ к URL из браузера, вас встретит сообщение “Доступ отказано”, потому что объекты, хранящиеся на S3, по умолчанию настроены на частный доступ, видимый только владельцем. Вы должны явно сделать объект открытым (подробнее об этом позже).

Чтобы добавить некоторое содержимое объекту во время создания, мы можем использовать следующий код. Это добавит текст “Hello World” в config-empty.inc файл.

$response = $s3->create_object($bucket,  config-empty.inc ‘,
    array(
        'body' => Hello World!'
));

В качестве полного примера следующий код создаст объект с именем simple.txt вместе с некоторым содержимым и сохранит его в данном ведре. Объект может также по желанию содержать метаданные, описывающие этот объект.

/* Initialize the class */
$s3 = new AmazonS3();

/* Our bucket name */
$bucket = 'com.magazine.resources’;

$response = $s3->create_object($bucket, 'simple.txt',
    array(
    'body' => Hello World!'
));

if ($response->isOK())
{
    return true;
}

Вы также можете загрузить файл, а не просто строку, как показано ниже. Хотя многие варианты отображаются здесь, большинство из них имеют значение по умолчанию и могут быть опущены. Подробнее о различных вариантах читайте в материале«AWS SDK для PHP 1.4.7».

require_once( ‘sdk-1.4.4/sdk.class.php');

$s3 = new AmazonS3();
$bucket = 'com.smashingmagazine.images’;

$response = $s3->create_object($bucket, 'source.php',
    array(
    'fileUpload' => 'test.php',
    'acl' => AmazonS3::ACL_PRIVATE,
    'contentType' => 'text/plain',
    'storage' => AmazonS3::STORAGE_REDUCED,
    'headers' => array( // raw headers
        'Cache-Control' => 'max-age',
        'Content-Encoding' => 'text/plain',
        'Content-Language' => 'en-US',
        'Expires' => 'Thu, 01 Dec 1994 16:00:00 GMT',
    )
));

// Success?
var_dump($response->isOK());

Подробная информация о различных вариантах будет разъяснена в следующих разделах. На данный момент, взять на веру в то, что вышеуказанный код будет правильно загружать файл на сервер S3.

Написание нашего Amazon S3 WordPress Плагин

С некоторым фоном на Amazon S3 позади нас, пришло время, чтобы положить наше обучение на практике. Мы готовы построить плагин WordPress, который будет автоматически резервное копирование нашей базы данных WordPress на сервер S3 и восстановить его, когда это необходимо.

Чтобы сохранить статью сосредоточенной и на разумной длине, мы предположим, что вы знакомы с wordPress плагин развития. Если вы немного отрывочны по основам, читайте “Как создать WordPress Plugin“, чтобы получить на пути быстро.

Рамки плагина

Сначала мы создадим скелет, а затем постепенно заполним детали. Чтобы создать плагин, перейдите к wp-content/plugins папке и создайте новую папку с именем s3-backup . В новой папке создайте файл с именем s3-backup.php . Откройте файл в редакторе по вашему выбору, и вставьте следующую информацию заголовок, который будет описывать плагин для WordPress:

/*
Plugin Name: Amazon S3 Backup
Plugin URI: http://cloud-computing-rocks.com
description: >-
  Plugin to back up WordPress database to Amazon S3
Version: 1.0
Author: Mr. Sameer
Author URI: http://www.codediesel.com
License: GPL2
*/

Как только это будет сделано, перейдите на страницу плагина в области админа, и активировать плагин.

Теперь, когда мы успешно установили голые кости WordPress плагин, давайте добавим мясо и создать полную рабочую систему. Прежде чем мы начнем писать код, мы должны знать, что страница админ для плагина в конечном итоге будет выглядеть и какие задачи плагин будет выполнять. Это поможет нам в написании кода. Вот основные настройки страницы для нашего плагина:

Интерфейс довольно прост. Основная задача плагина будет резервное копирование текущей базы данных WordPress на Amazon S3 ведро и восстановить базу данных из ведра. Страница настроек также будет иметь функцию для именования ведра, в котором будет храниться резервное копирование. Кроме того, мы можем указать, будет ли резервное копирование доступно для общественности или доступно только для вас.

Ниже приведен полный план кода плагина. Мы будем подробно останавливаться на каждом разделе в свою очередь.

/*
Plugin Name: Amazon S3 Backup
Plugin URI: http://cloud-computing-rocks.com
description: >-
  Plugin to back up WordPress database to Amazon S3
Version: 1.0
Author: Mr. Sameer
Author URI: http://www.codediesel.com
License: GPL2
*/

$plugin_path = WP_PLUGIN_DIR . "/" . dirname(plugin_basename(__FILE__));

/* CloudFusion SDK */
require_once($plugin_path . '/sdk-1.4.4/sdk.class.php');

/* WordPress ZIP support library */
require_once(ABSPATH . '/wp-admin/includes/class-pclzip.php');

add_action('admin_menu', 'add_settings_page');

/* Save or Restore Database backup */
if(isset($_POST['aws-s3-backup'])) {
…
}

/* Generic Message display */
function showMessage($message, $errormsg = false) {
…
}   

/* Back up WordPress database to an Amazon S3 bucket */
function backup_to_AmazonS3() {
…
}

/* Restore WordPress backup from an Amazon S3 bucket */
function restore_from_AmazonS3() {
…
}

function add_settings_page() {
…
}

function draw_settings_page() {
…
}

Вот каталог структуры, что наш плагин будет использовать:

plugins (WordPress plugin directory)
---s3-backup (our plugin directory)
-------s3backup (restored backup will be stored in this directory)
-------sdk-1.4.4 (CloudFusion SDK directory)
-------s3-backup.php (our plugin source code)

Начнем кодирование плагина. Во-первых, мы инициализируем некоторые переменные для путей и включим CloudFusion SDK. База данных WordPress может стать большой, поэтому для сохранения пространства и пропускной способности плагин должен будет сжать базу данных перед загрузкой на сервер S3. Для этого мы будем использовать class-pclzip.php библиотеку поддержки сжатия ЗИП, которая встроена в WordPress. Наконец, мы зацепим страницу настроек к меню админ.

$plugin_path = WP_PLUGIN_DIR . "/" . dirname(plugin_basename(__FILE__));

/* CloudFusion SDK */
require_once($plugin_path . '/sdk-1.4.4/sdk.class.php');

/* WordPress ZIP support library */
require_once(ABSPATH . '/wp-admin/includes/class-pclzip.php');

/* Create the admin settings page for our plugin */
add_action('admin_menu', 'add_settings_page');

Каждый плагин WordPress должен иметь свою собственную страницу настроек. Наш простой, с несколькими кнопками и полями. Ниже приведен код для него, который будет обрабатывать мирской работы сохранения названия ведра, отображение кнопок и т.д.

function draw_settings_page() {
    ?>
    <div class="wrap">
        <h2><?php echo('WordPress Database Amazon S3 Backup') ?></h2>
            <form method="post" action="options.php">
            <input type="hidden" name="action" value="update" />
            <input type="hidden" name="page_options" value="aws-s3-access-public, aws-s3-access-bucket" />
            <?php
                wp_nonce_field('update-options');
                $access_options = get_option('aws-s3-access-public');
            ?>
            <p>
                <?php echo('Bucket Name:') ?>
                <input type="text" name="aws-s3-access-bucket" size="64" value="<?php echo get_option('aws-s3-access-bucket'); ?>" />
            </p>
            <p>
                <?php echo('Public:') ?>
                <input type="checkbox" name="aws-s3-access-public" <?php checked(1 == $access_options); ?> value="1" />
            </p>
            <p class="submit">
                <input type="submit" class="button-primary" name="Submit" value="<?php echo('Save Changes') ?>" />
            </p>
        </form>
        <hr />
        <form method="post" action="">
            <p class="submit">
                <input type="submit" name="aws-s3-backup" value="<?php echo('Backup Database') ?>" />
                <input type="submit" name="aws-s3-restore" value="<?php echo('Restore Database') ?>" />
            </p>
        </form>
    </div>
    <?php
}

Настройка базовой платформы имеет важное значение для правильной работы плагина. Таким образом, перепроверить свою работу, прежде чем продолжить.

Загрузка базы данных

Далее идет основная часть плагина, его смысл существования: функция резервного копирования базы данных в ведро S3.

/* Back up WordPress database to an Amazon S3 bucket */
function backup_to_AmazonS3()
{
    global $wpdb, $plugin_path;

    /* Backup file name */
    $backup_zip_file = 'aws-s3-database-backup.zip';

    /* Temporary directory and file name where the backup file will be stored */
    $backup_file = $plugin_path . "/s3backup/aws-s3-database-backup.sql";

    /* Complete path to the compressed backup file */
    $backup_compressed = $plugin_path . "/s3backup/" . $backup_zip_file;

    $tables = $wpdb->get_col("SHOW TABLES LIKE '" . $wpdb->prefix . "%'");
  $result = shell_exec('mysqldump --single-transaction -h ' .
                         DB_HOST . ' -u ' . DB_USER . ' --password="' .
                         DB_PASSWORD . '" ' .
                         DB_NAME . ' ' . implode(' ', $tables) . ' > ' .
                         $backup_file);

    $backups[] = $backup_file;

    /* Create a ZIP file of the SQL backup */
    $zip = new PclZip($backup_compressed);
    $zip->create($backups);

    /* Connect to Amazon S3 to upload the ZIP */
    $s3 = new AmazonS3();
    $bucket = get_option('aws-s3-access-bucket');

    /* Check if a bucket name is specified */
    if(empty($bucket)) {
        showMessage("No Bucket specified!", true);
        return;
    }

    /* Set backup public options */
    $access_options = get_option('aws-s3-access-public');

    if($access_options) {
        $access = AmazonS3::ACL_PUBLIC;
    } else {
        $access = AmazonS3::ACL_PRIVATE;
    }

    /* Upload the database itself */
    $response = $s3->create_object($bucket, $backup_zip_file,
                array(
                'fileUpload' => $backup_compressed,
                'acl' => $access,
                'contentType' => 'application/zip',
                'encryption' => 'AES256',
                'storage' => AmazonS3::STORAGE_REDUCED,
                'headers' => array( // raw headers
                    'Cache-Control' => 'max-age',
                    'Content-Encoding' => 'application/zip',
                    'Content-Language' => 'en-US',
                    'Expires' => 'Thu, 01 Dec 1994 16:00:00 GMT',
                )
            ));

    if($response->isOK()) {
        unlink($backup_compressed);
        unlink($backup_file);
        showMessage("Database successfully backed up to Amazon S3.");
    } else {
        showMessage("Error connecting to Amazon S3", true);
    }
}

Код говорит сам за себя, но некоторые разделы нуждаются в немного объяснений. Поскольку мы хотим создать резервную базу данных WordPress, нам необходимо каким-то образом получить данный файл дампа MyS’L для базы данных. Есть несколько способов сделать это: с помощью запросов MyS’L в WordPress, чтобы сохранить все таблицы и строки базы данных, или, опустившись на оболочку и с помощью mysqldump . Мы будем использовать второй метод. Код для дампа базы данных, показанный ниже, использует shell_exec функцию для выполнения mysqldump команды, чтобы захватить дамп базы данных WordPress. Сброс дополнительно сохраняется в aws-s3-database-backup.sql файле.

$tables = $wpdb->get_col("SHOW TABLES LIKE '" . $wpdb->prefix . "%'");
$result = shell_exec('mysqldump --single-transaction -h ' .
                         DB_HOST . ' -u ' . DB_USER .
                         ' --password="' . DB_PASSWORD . '" ' .
                         DB_NAME . ' ' . implode(' ', $tables) .
                         ' > ' . $backup_file);

$backups[] = $backup_file;

Свалка S’L, очевидно, будет большой на большинстве установок, так что нам нужно сжать его перед загрузкой его на S3 для сохранения пространства и пропускной способности. Мы будем использовать встроенные функции WordPress для этой задачи. PclZipКласс хранится в /wp-admin/includes/class-pclzip.php файле, который мы включили в начале плагина. aws-s3-database-backup.zipФайл является окончательным файлом, который будет загружен в ведро S3. Следующие строки создадут необходимый файл зип.

/* Create a ZIP file of the SQL backup */
    $zip = new PclZip($backup_compressed);
    $zip->create($backups);

Конструктор принимает имя файла в PclZip качестве параметра ввода; aws-s3-database-backup.zip , в данном случае. И к create методу мы передаем массив файлов, которые мы хотим сжать; у нас есть только один файл для сжатия, aws-s3-database-backup.sql .

Теперь, когда мы позаботились о базе данных, давайте перейдем к безопасности. Как уже упоминалось во введении, объекты, хранящиеся на S3, могут быть установлены как частные (видимые только владельцем) или общедоступные (видимые всеми). Мы устанавливаем эту опцию, используя следующий код.

/* Set backup public options */
    $access_options = get_option('aws-s3-access-public');

    if($access_options) {
        $access = AmazonS3::ACL_PUBLIC;
    } else {
        $access = AmazonS3::ACL_PRIVATE;
    }

Мы перечислили только два варианта доступа AmazonS3::ACL_PUBLIC AmazonS3::ACL_PRIVATE (и), но есть еще несколько, как перечислено ниже, и подробности, которые вы можете найти в документации Amazon SDK.

  • AmazonS3::ACL_PRIVATE
  • AmazonS3::ACL_PUBLIC
  • AmazonS3::ACL_OPEN
  • AmazonS3::ACL_AUTH_READ
  • AmazonS3::ACL_OWNER_READ
  • AmazonS3::ACL_OWNER_FULL_CONTROL

Теперь о главном коде, который делает фактическую работу по загрузке. Это могло бы быть сложным, но CloudFusion SDK делает его легким. Мы используем create_object метод класса S3 для выполнения загрузки. Мы получили краткий проблеск метода в последнем разделе.

/* Upload the database itself */
$response = $s3->create_object($bucket, $backup_zip_file, array(
            'fileUpload' => $backup_compressed,
            'acl' => $access,
            'contentType' => 'application/zip',
            'encryption' => 'AES256',
            'storage' => AmazonS3::STORAGE_REDUCED,
            'headers' => array( // raw headers
                'Cache-Control' => 'max-age',
                'Content-Encoding' => 'application/zip',
                'Content-Language' => 'en-US',
                'Expires' => 'Thu, 01 Dec 1994 16:00:00 GMT',
            )
        ));
    

Давайте рассмотрим каждую строку по очереди. Но имейте в виду, что метод имеет довольно много вариантов, так что обратитесь к оригиналуДокументацииСам.
«$backup»zip»
Название объекта, который будет создан на S3.
‘fileUpload $backup’
Имя файла, данные которого будут загружены на сервер. В нашем случае, ‘aws-s3-база данных-backup.zip’.
”acl $access’
Тип доступа для объекта. В нашем случае, либо государственных, либо частных.
”contentType’
Тип содержимого, который отправляется в тело. Если файл загружается через ‘fileUpload’, как в нашем случае, он будет пытаться определить правильный тип MIME на основе расширения файла. Значение по умолчанию — это «приложение/поток октета».
”шифрование’
Алгоритм для шифрования объекта. (Разрешенные значения: ‘AES256′)
”хранение’ Зgt; AmazonS3::STORAGE
Определяет, следует ли использовать хранилище “стандарт” или “сокращение избыточности”. Разрешенные значения: “AmazonS3::STORAGE-STANDARD” и “AmazonS3::STORAGE-REDUCED”. Значение по умолчанию — это «STORAGE»STANDARD».
”заголовки’ Хgt; массив ( // сырые заголовки ‘Cache-Control’ -gt; ‘max-age’, ‘Content-Encoding’, ‘приложение/zip’, ‘Контент-язык’
Стандартные заголовки HTTP для отправки вместе с запросом. Они не являются обязательными.
Обратите внимание, что плагин не предоставляет функцию для создания ведра на Amazon S3. Перед загрузкой объектов на него необходимо использовать консоль управления AWS или S3Fox.
Восстановление базы данных
Просто быть в состоянии резервного копирования данных недостаточно. Мы также должны быть в состоянии восстановить его, когда возникает необходимость. В этом разделе мы выложим код для восстановления базы данных из S3. Когда мы говорим “восстановить”, имейте в виду, что файл базы данных из S3 будет просто загружен в указанную папку в нашем каталоге плагина. Фактическая база данных на нашем сервере WordPress никоим образом не изменяется; вам придется восстановить базу данных самостоятельно вручную. Мы могли бы оборудовать наш плагин, чтобы также автоматическое восстановление, но это сделало бы код намного более сложным.
Вот полный код для функции восстановления:

/* Restore WordPress backup from an Amazon S3 bucket */
function restore_from_AmazonS3()
{
    global $plugin_path;

    /* Backup file name */
    $backup_zip_file = 'aws-s3-database-backup.zip';

    /* Complete path to the compressed backup file */
    $backup_compressed = $plugin_path . "/s3backup/" . $backup_zip_file;

    $s3 = new AmazonS3();
    $bucket = get_option('aws-s3-access-bucket');

    if(empty($bucket)) {
        showMessage("No Bucket specified!", true);
        return;
    }

    $response = $s3->get_object($bucket, $backup_zip_file, array(
                'fileDownload' => $backup_compressed
                 ));

    if($response->isOK()) {
        showMessage("Database successfully restored from Amazon S3.");
    } else {
        showMessage("Error connecting to Amazon S3", true);
    }

}

Как вы можете видеть, код для восстановления гораздо проще, чем код для загрузки. Функция использует get_object метод SDK, определение которого следующим образом:

get_object ( $bucket, $filename, [ $opt = null ] )

Ниже перечислены детали параметров метода:

  • $bucket
    Имя ведра, в котором хранится файл резервного копирования. Название ведра хранится в наших настройках WordPress aws-s3-access-bucket переменной, которую мы извлекаем с помощью get_option('aws-s3-access-bucket') функции.
  • $backup_zip_file
    Имя файла объекта резервного копирования. В нашем случае, aws-s3-database-backup.zip .
  • 'fileDownload' => $backup_compressed
    Местоположение файловой системы для загрузки файла или ресурса открытого файла. В нашем случае каталог s3backup в нашей папке плагина. Это должно быть местоположение сервера.

В конце функции мы проверяем, была ли загрузка успешной, и информируем пользователя.

В дополнение к вышеуказанным функциям, есть некоторые различные функции поддержки. Один из них предназначен для отображения сообщения пользователю:

/* Generic message display */
function showMessage($message, $errormsg = false) {
  if ($errormsg) {
    echo '<div id="message" class="error">';
  } else {
    echo '<div id="message" class="updated">';
  }

  echo "<p><strong>$message</strong></p></div>";
}

Другой способ заключается в добавлении крючка для страницы настроек в раздел админ.

function add_settings_page() {
    add_options_page('Amazon S3 Backup', 'Amazon S3 Backup',8,
                     's3-backup', 'draw_settings_page');
}

Команды кнопки для резервного копирования и восстановления обрабатываются с помощью этого простого кода:

/* Save or Restore Database backup */
if(isset($_POST['aws-s3-backup'])) {
    backup_to_AmazonS3();
} elseif(isset($_POST['aws-s3-restore'])) {
    restore_from_AmazonS3();
}

Это округляет наш учебник по созданию плагина для интеграции Amazon S3 с WordPress. Хотя мы могли бы добавить больше функций для плагина, функциональность была голой, чтобы сохранить акцент на основах Amazon S3, а затем на calisthenics развития плагина.

В заключении

Это была относительно длинная статья, целью которой было познакомить вас с Amazon S3 и как использовать его в приложениях PHP. Вместе мы разработали плагин WordPress для резервного копирования нашей базы данных WordPress в облако S3 и получить его, когда это необходимо. Повторяю, S3 представляет собой сложную услугу со многими функциями и функциями, которые мы не рассмотрели здесь из-за соображений пространства. Возможно, в будущих статьях мы будем подробно останавливаться на других особенностях S3 и добавить больше возможностей для плагина мы разработали здесь.

Дальнейшее чтение на SmashingMag:

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: