- Deep Shift Labs Development Blog - http://www.deepshiftlabs.com/dev_blog -

Установка PHP 5.4.6 на IIS 7 для работы с MS SQL 2008

Posted By On 2 September 2012 @ 3:19 | Comments Disabled

Instal PHP 5.4.6 on IIS 7 to work with MS SQL 2008

Я решил написать этот пост, поскольку я не нашёл простого и понятного описания установки PHP на Windows и настройки этой не очень распространённой комбинации для работы с MS SQL 2008.

Сейчас мы работаем над переносом самой большой из когда-либо созданных в Deep Shift Labs системы с Windows 2000 и MS SQL 2000 на Windows 2008 и MS SQL 2008. Хочу вкратце рассказать об истории этой системы и зачем, собственно, нам понадобилось устанавливать PHP на Windows. Система насчитывает порядка 800К строк PHP-кода, и работа над ней продолжалась последние 10 лет. Эта система создана для одного из наших заказчиков. Первые несколько лет система работала на FreeBSD, Apache и PostgreSQL. Затем компания-заказчик стала публичной, и у них возникла проблема перехода на коммерческое ПО. Где-то в 2004 нам удалось – благодаря тому, что мы изначально использовали ADODB [1] – с минимальными затратами сначала переехать с FreeBSD/Apache на Windows 2000/IIS 5 (PHP работает как модуль ISAPI), а потом, в 2006-ом, перенести тогда ещё небольшую  как по структуре, так и по размеру, базу на MS SQL 2000.

Самым сложным в том далёком 2006 году было найти драйвер, умеющий работать с MS SQL. Было перепробовано всё, с чем мог работать ADODB и, в конечном итоге, мы остановились на использовании php_dblib.dll от Фрэнка Кромана. Фрэнк [2] в то время поддерживал [3] расширения MS SQL в PHP и очень нам помог дельными советами. Тогдашний драйвер php_mssql.dll использовал ntwdblib.dll от Microsoft, которая плохо работала с датами и длинными текстами. php_dblib.dll использовала dblib.dll из FreeTDS, и мы не нашли никаких проблем в её работе.
И вот настал момент, когда заказчик захотел переехать на версии операционной системы и базу данных, которые поддерживает Microsoft (Windows 2000 и MS SQL 2000 уже не поддерживаются), и это, в общем-то, обычное требование в больших компаниях. Естественно, в используемой нами версии ADODB 4.93 2006 года – не было поддержки mssqlnative драйвера, и поэтому задача была поставлена следующая:

- перенести базу данных MS SQL 2000 на MS SQL 2008
- перенести веб сервер с Windows 2000 и IIS 5 (ISAPI) на Windows 2008 и IIS 7 (FastCGI)
- перейти с PHP 5.1.6 на PHP 5.4.6
- перейти с ADODB 4.93 на 5.17 с одновременным переходом на новый драйвер ‘mssqlnative’
- протестировать систему, включая две репликации в нашу базу из  серверов MS SQL 2000 и MS SQL 2005

Вы можете задать резонный вопрос: почему, собственно, мы устанавливаем 5.3.13, чтобы потом переключиться на 5.4.6? Есть две причины. Первая – у меня банально не получилось поставить 5.4.6 с настройкой IIS руками. Как я не бился, PHP не видел php.ini файл, лежащий в C:\PHP. Согласно всем руководствам, нужно создать переменную PHPRC, указав в ней путь к папке с php.ini, но в моём случае кто-то что-то сделал не так.

PHPRC did not work for me

Поскольку PHP не видел конфигурационный файл, то и драйвера MS SQL не загружались. Застряв в этом месте на пару часов и задав вопросы в форуме, я занялся поисками альтернатив в ожидании пока Америка проснётся и увидит мои послания ‘SOS’ в форуме. Тут-то я совершенно случайно набрёл на сайт http://www.microsoft.com/web/platform/phponwindows.aspx, где и обнаружил ту альтернативу, которую искал. Возможно, я бы и не стал пользоваться инсталлятором, если бы он не предлагал установить волшебный и замечательный PHP Manager [4], от возможности “пощупать” который я не смог отказаться. В результате выяснилось, что PHP Manager нормально подключает 5.4.6, делая его php.ini файл видимым.

Предлагаю вашему вниманию один из способов установки.

1. Создаём папки C:\PHP и C:\tmp
2. Загружаем non thread safe PHP версию, рекомендуемую к использованию тут [5] и тут [6]. Файл будет содержать _nts_ в имени, например – php-5.4.6-nts-Win32-VC9-x86.zip (последняя доступная версия на момент написания поста) с сайта http://windows.php.net/download/ [7].
3. Распаковываем её в C:\PHP
4. Загружаем последнюю [8] версию драйверов MS SQL от Microsoft (файл SQLSRV30) и распаковываем в C:\PHP\ext
5. Загружаем с сайта Microsoft инсталлятор [9] PHP. Я использовал 5.3.13. Устанавливаем его.

Microsoft PHP web installer

Он устанавливает все необходимые компоненты. Прошло каких-то 10 лет, и на сайте Microsoft появились действительно клёвые штуки для работы в среде Windows на PHP – тут тебе и драйвер, и инсталлятор, создающий специальную PHP консоль в недрах IIS-а и Windows Cache [10] под IIS.

PHP Manager

После установки мы имеем PHP 5.3.13 установленный в Program Files и PHP Manager в IIS.

PHP Manager dashboard

Как вы видите, из PHP Manager доступно управление конфигурационными параметрами из php.ini, причём расширения вынесены отдельно. Также здесь видно, какой php.ini файл используется и куда пишутся логи ошибок. Есть быстрый доступ к FastCGI-хэндлеру, созданному инсталлятором. Есть возможность добавления других версий PHP и их переключения. Мы не проверяли, возможно ли использовать PHP Manager для работы одной версии PHP на одном виртуальном хосте и другой версии PHP на другом. Думаю, что это и многое другое, как, например, использование разных файлов конфигурации на разных виртуальных хостах, можно сделать вручную, используя отличную статью [6] Руслана Якушева из компании Microsoft. Нам же просто нужно было добавить PHP версии 5.4.6 и “закрепиться на достигнутых рубежах”.

Adding PHP 5.4.6

Теперь мы можем добавить PHP 5.4.6, который находится у нас в C:\PHP. После добавления мы видим, что теперь используется новая версия PHP и что PHP Manager создал новый хэндлер, который и используется (этого мы не видим), но можем посмотреть страницу phpinfo(), которую PHP Manager создаёт динамически (кру-тиз-на!).

PHP 5.4.6 can see php.ini now

Настал черёд заняться расширениями. Я убрал mysql и добавил обе версии драйвера sqlsrv и pdo_sqlsrv. Я не проверил, видит ли изменения IIS сразу, так как уже привык выполнять после правок консольную команду ‘iisreset’.

PHP Manager extensions UI

PHP Manager предлагает два варианта конфигураций обработки ошибок: заранее подготовленные для разработки и продакшн.

PHP Manager error reporting UI

В случае со сменой пути к логу ошибок PHP Manager не увидел моих изменений, и понадобился перезапуск IIS-а. Я уж по старинке привык к тому, что временная папка для загружаемых файлов, сессии и логи PHP находятся в C:\tmp. В общем-то ‘Configure error reporting’ и ‘Set runtime limits’ – только для удобства, так как все они (кроме модулей расширений) доступны из ‘Manage all settings’.

PHP Manager points to a wrong location after PHP version switch

Если вам необходимо обрабатывать HTML-файлы с помощью PHP – создаём ещё одно mapping, подсмотрев параметры mappinga-а для PHP.

Setting PHP to handle HTML files (if needed)

Теперь попробуем подсоединиться к MS SQL с помощью драйвера и через ADODB. Для начала нужно убедиться, что сервер разрешает TCP/IP соединения, а также то, что порт 1433 открыт на Windows firewall-е.

Checking SQL Server networking

В моём случае это было не так. Если не удаётся подключиться из PHP, рекомендуется установить и использовать для тестирования – SQLCMD (например, вот здесь [11] находится необходимая нам версия).

Хочу обратить ваше внимание на то, что новый драйвер Microsoft возвращает datetime в виде объекта PHP DateTime [12]. Но мы-то используем ADODB, которая делает:

View Code [13] PHP
$this->fields[$key] = $value->format("Y-m-d\TH:i:s\Z");

в строке 794 файла adodb-mssqlnative.inc.php. Таким образом, возвращая нам строку ’2012-08-22T23:42:22Z’ вместо привычной ’2012-08-22 23:42:22′ и поэтому для обратной совместимости можно поправить adodb-mssqlnative.inc.php таким образом:

View Code [13] PHP
if(is_array [14]($this->fields)) {
    foreach($this->fields as $key=>$value) {
        if (is_object [15]($value) && method_exists [16]($value, 'format')) {//is DateTime object
	    //$this->fields[$key] = $value->format("Y-m-d\TH:i:s\Z");
            //DSL DateTime output format fix
            $this->fields[$key] = $value->format("Y-m-d H:i:s");
	}
    }
}

Вот пример файла, в котором приведены примеры использования работы с драйвером Microsoft напрямую и через ADODB.

View Code [13] PHP
<?php
echo [17] "<B>Direct driver connection</b><BR>";
$connectionInfo = array [18](
      "UID"=>'aws_user',
      "PWD"=>'Q1w2e3r4t5',
      "Database"=>"AWS_Database"
);
 
/* Connect using SQL Server Authentication. */
$conn = sqlsrv_connect('192.168.3.86, 1433', $connectionInfo);
if( $conn === false )
{
   echo [17] "Unable to connect.</br>";
   die [19]( print_r [20]( sqlsrv_errors(), true));
}
 
 
$tsql = "SELECT GETDATE() AS today";
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false )
{
   echo [17] "Error in executing query.</br>";
   die [19]( print_r [20]( sqlsrv_errors(), true));
}
 
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
echo [17] "Today is ".$row['today']->format('Y-m-d H:i:s')."</br>";
 
 
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
 
ini_set [21]( "include_path", ini_get [22]( "include_path" ) . ";" . $_SERVER["DOCUMENT_ROOT"] . "/include" );
require_once("adodb5\adodb.inc.php");
$user     = "aws_user";
$password = "Q1w2e3r4t5";
$server="192.168.3.86, 1433";
$database = "AWS_Database";
 
echo [17] "<B>ADODB MSSQL Native connection</b><BR>";
$adoConnection = ADONewConnection('mssqlnative');
//$adoConnection->debug = true;
$adoConnection->Connect($server, $user, $password, $database);
 
 
$rs = $adoConnection->Execute($tsql);
 
echo [17] "Today is ".$rs->fields['today']."</br>";
$adoConnection->Close();
?>

В заключение хотелось бы отметить, что на сайте Microsoft вы найдёте множество полезной информации. Например, здесь [23] вы найдёте вход на форум PHP/IIS и другие полезные ссылки. Форумы, посвящённые драйверам PHP для баз данных MS SQL, находятся тут [24]. Я ими не-одно [25]-кратно [26] воспользовался. Они активны и мне там помогли дельными советами.

Несколько статей о настройке PHP на IIS.
- Enable Per-Site PHP Configuration on IIS 7 and IIS 6.0 [27]
- Using FastCGI to Host PHP Applications on IIS [6]
- Using FastCGI to Host PHP Applications on IIS 6.0 [28]

Игорь


Article printed from Deep Shift Labs Development Blog: http://www.deepshiftlabs.com/dev_blog

URL to article: http://www.deepshiftlabs.com/dev_blog/?p=1880&lang=ru

URLs in this post:

[1] ADODB: http://adodb.sourceforge.net/

[2] Фрэнк: http://www.linkedin.com/in/webbypixel

[3] поддерживал: http://php.net/credits.php

[4] PHP Manager: http://phpmanager.codeplex.com/

[5] тут: http://www.php.net/manual/en/install.windows.iis7.php

[6] тут: http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis/

[7] http://windows.php.net/download/: http://windows.php.net/download/

[8] последнюю: http://www.microsoft.com/en-us/download/details.aspx?id=20098

[9] инсталлятор: http://www.microsoft.com/web/platform/phponwindows.aspx

[10] Windows Cache: http://blogs.iis.net/robert_mcmurray/archive/2012/07/26/windows-cache-1-3-for-for-php-5-4.aspx

[11] здесь: http://www.microsoft.com/en-us/download/details.aspx?id=16978#SQLCMD

[12] DateTime: http://www.php.net/manual/en/class.datetime.php

[13] View Code: http://www.deepshiftlabs.com/dev_blogjavascript:;

[14] is_array: http://www.php.net/is_array

[15] is_object: http://www.php.net/is_object

[16] method_exists: http://www.php.net/method_exists

[17] echo: http://www.php.net/echo

[18] array: http://www.php.net/array

[19] die: http://www.php.net/die

[20] print_r: http://www.php.net/print_r

[21] ini_set: http://www.php.net/ini_set

[22] ini_get: http://www.php.net/ini_get

[23] здесь: http://php.iis.net/

[24] тут: http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/threads

[25] одно: http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/b8ede10a-a679-49d0-b748-0a5944409d8f

[26] кратно: http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/0e023a13-aac2-4114-a8ac-178e54427f39

[27] Enable Per-Site PHP Configuration on IIS 7 and IIS 6.0: http://learn.iis.net/page.aspx/745/enable-per-site-php-configuration-on-iis-60-and-iis-7-and-above/

[28] Using FastCGI to Host PHP Applications on IIS 6.0: http://learn.iis.net/page.aspx/247/using-fastcgi-to-host-php-applications-on-iis-60/

Content copyright © 2010 Deep Shift Labs.