Статьи

Настройте свою роль Windows Azure PHP Worker

Недавно меня спросили, возможно ли запустить PHP 5.4 в рабочей роли Windows Azure. (Платформа по умолчанию для рабочей роли PHP в настоящее время устанавливает версию PHP 5.3.) Это заставило меня задуматься, как можно использовать любую пользовательскую установку PHP в рабочей роли. Короткий ответ: да, вы можете использовать произвольную установку PHP в рабочей роли — в этом посте я расскажу вам, как это сделать. Однако, сначала отказ от ответственности: мои исследования подняли несколько вопросов, на которые я еще не ответил, так что в зависимости от того, что вы хотите сделать, этот пост может / или не быть полезным.

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

В любом случае, вот что я сделал, чтобы моя локальная установка PHP 5.4 работала в рабочей роли …

1. Я использовал командлеты Windows Azure Powershell для создания новой службы Windows Azure, добавления рабочей роли PHP и включения удаленного доступа к рабочему столу:

Снимок экрана 2012-08-10 в 3.33.48 вечера

2. Я добавил мою локальную установку PHP 5.4 в каталог WorkerRole1 . Я также отредактировал файл php.ini, чтобы убедиться, что все пути, указанные в файле, являются относительными, а не абсолютными (например, include_path = «. \ Ext \ « вместо «C \: \ php54 \ ext \» ).

Примечание . Здесь возникают некоторые вопросы. Для некоторых расширений PHP могут потребоваться зависимости, которые не установлены по умолчанию. Например, расширение sqlsrv требует собственного клиента SQL Server . В этом случае я мог бы установить зависимость с помощью установщика веб-платформы , но для других зависимостей могут потребоваться другие методы.

3. Я удалил все остальные файлы из каталога WorkerRole1, за исключением файла setup_worker.cmd . Этот сценарий вызывается при запуске роли, и я изменил его, чтобы он добавил мою установку PHP в переменную среды Path .

@echo off


echo Granting permissions for Network Service to the deployment directory...
icacls . /grant "Users":(OI)(CI)F
if %ERRORLEVEL% neq 0 goto error
echo OK
 

echo SUCCESS
 

setx Path "%PATH%;%~dp0php54" /M
 

exit /b 0
 

:error

 
echo FAILED
exit /b -1

4. Я добавил два файла к WorkerRole1 папке: php_entry.cmd и entry.php . Первый файл (php_entry.cmd) будет точкой входа в программу для роли (я настрою это позже). Единственное, что делает этот файл, это вызывает скрипт entry.php . Его содержание просто так:

php entry.php

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

<?php
 

$h = fopen("output.txt", "a+");
 

while(true){
    fwrite($h, "Hello world!");
    sleep(60);
}
?>

Моя папка WorkerRole1 теперь выглядит так:

Снимок экрана 2012-08-10 в 16:44.50 вечера

5. Наконец, опубликуйте проект с помощью командлетов Powershell: Publish-AzureServiceProject

Публикация проекта займет несколько минут, но когда он будет готов, вы сможете войти в него через удаленный рабочий стол …

Снимок экрана 2012-08-10 в 4.58.04 вечера

… И найдите свой путь в каталог подходящих устройств, чтобы увидеть, что ваш долгосрочный скрипт php записывает в файл, как ожидалось. (Конечно, ваш проект будет делать что-то интересное.)

Еще одна вещь, которую следует учитывать: по умолчанию порт 80 открыт для рабочей роли PHP. Вот запись в файле ServiceDefinition.csdef :

<Endpoints>
    <InputEndpoint name="HttpIn" protocol="tcp" port="80" />
</Endpoints>

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

Подход к использованию пользовательской установки PHP для веб-роли аналогичен подходу для рабочей роли. Шаги в основном …

1. Используйте инструменты Powershell для создания нового проекта и PHP Web Role.

2. Добавьте вашу установку PHP в каталог WebRole / bin.

3. Измените сценарий запуска ( setup_web.cmd ) для настройки IIS (это настраивает IIS для запуска PHP из моего каталога php54):

SET PHP_FULL_PATH=%~dp0php54\php-cgi.exe 

SET NEW_PATH=%PATH%;%RoleRoot%\base\x86 

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%PHP_FULL_PATH%',maxInstances='12',idleTimeout='60000',activityTimeout='3600',requestTimeout='60000',instanceMaxRequests='10000',protocol='NamedPipe',flushNamedPipe='False']" /commit:apphost 

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PATH',value='%NEW_PATH%']" /commit:apphost 

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='%PHP_FULL_PATH%'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']" /commit:apphost 

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/handlers /+"[name='PHP',path='*.php',verb='GET,HEAD,POST',modules='FastCgiModule',scriptProcessor='%PHP_FULL_PATH%',resourceType='Either',requireAccess='Script']" /commit:apphost 

%WINDIR%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /"[fullPath='%PHP_FULL_PATH%'].queueLength:50000"

В этом случае вы, вероятно, захотите оставить порт 80 открытым.

Вот и все. Как обычно, отзывы в комментариях приветствуются.

Спасибо.