Статьи

Обновление настроек PHP в Windows Azure

На прошлой неделе я столкнулся с этим вопросом в Twitter: «Как включить display_errors для приложения, работающего в Windows Azure?» Я должен признать, что я был в тупике. Единственное, о чем я мог подумать, — это переустановить приложение с обновленным файлом php.ini . Но я случайно упомянул этот вопрос Бену Лобу, который предложил очень простую идею: сохраните ваши настройки PHP в каком-то долговременном хранилище, внешнем по отношению к вашему приложению, в виде пар ключ-значение, затем выполните цикл настройки и обновите их с помощью функции ini_set, когда страница загружается. Пример поможет прояснить это, но сначала пара предостережений:

Предостережение 1 : это взлом. Это всего лишь взлом. Это не что иное, как взломать. (Но это работает.) Мое намерение состоит в том, чтобы просто реализовать эту идею и надеяться, что другие улучшат ее.

Предупреждение 2 : Эта идея может быть полезна, если вы изучаете Windows Azure и хотите иметь возможность изменять настройки практически готового к использованию приложения. Я предполагаю, что ваше тяжелое тестирование было выполнено в эмуляторе вычислений до развертывания. Я не обязательно предлагаю использовать идею, представленную здесь, в производственном приложении.

Бен предложил использовать хранилище Windows Azure Table для хранения своих пар ключ-значение (что я и сделаю в моем примере), но вы действительно можете использовать любой магазин, внешний по отношению к вашему приложению…

Предположим, что вы развернули приложение в Windows Azure с отключенным display_errors , но (по той или иной причине) теперь вы хотите включить display_errors . Не задумываясь о возможности изменения настроек, вы застряли (если только вы не захотите повторно развернуть приложение с новым файлом php.ini , который на самом деле не является привлекательным вариантом). Но, если вы позаботились об изменении настроек, возможно, вы добавили в свое приложение такой файл:

<?php
require 'Microsoft\WindowsAzure\Storage\Table.php';

class Setting extends Microsoft_WindowsAzure_Storage_TableEntity
{
    /**
     * @azure value
     */
    public $value; 
}

function updateSettings()
{
    $storageAccount = 'Your storage account name';
    $accountKey = 'Your account key';
    $client = new Microsoft_WindowsAzure_Storage_Table('table.core.windows.net',
                                                       $storageAccount,
                                                       $accountKey);
    $query = "PartitionKey eq 'settings'";
    $settings = $client->retrieveEntities("phpinitable", $query, "Setting");
    foreach($settings as $setting)
    {
        ini_set($setting->getRowKey(), $setting->value);
    }
}
?>

Несколько замечаний по поводу кода выше:

  • Требуется Windows Azure SDK для PHP (это бесплатно и легко установить. Подробнее здесь: Доступ к Windows Azure Table Storage из PHP .)
  • Он отражает мою структуру таблицы Azure. Класс Setting позволяет моим настройкам материализоваться как Объекты настроек и отражает, что в моей Таблице есть свойство value . Ключ раздела для каждой записи таблицы — это настройки, а ключ строки для записи — это имя настройки PHP. Итак, каждая запись в таблице выглядит так:

Ключ раздела : ключ строки настроек : [имя настройки PHP] значение : [значение настройки]

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

include ‘updateSettings.php’;
обновить настройки();

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

Ключ раздела : настройки
Ключ строки : значение display_errors
: 1

Простой способ создания таблиц и записей Azure — использовать проводник хранилища Windows Azure для Eclipse (подробнее об этом здесь: Использование проводника хранилища Windows Azure для Eclipse ). И я могу создать столько записей таблицы, сколько у меня есть настроек для обновления.

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

Мне было бы интересно услышать варианты этой идеи. Если у вас есть другие идеи, дайте мне знать!

Спасибо.

-Брайан