На прошлой неделе я столкнулся с этим вопросом в 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 … вы можете использовать любой магазин, который является внешним по отношению к вашему приложению, и который вы можете легко обновить.
Мне было бы интересно услышать варианты этой идеи. Если у вас есть другие идеи, дайте мне знать!
Спасибо.
-Брайан