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

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 – с минимальными затратами сначала переехать с FreeBSD/Apache на Windows 2000/IIS 5 (PHP работает как модуль ISAPI), а потом, в 2006-ом, перенести тогда ещё небольшую  как по структуре, так и по размеру, базу на MS SQL 2000.

Самым сложным в том далёком 2006 году было найти драйвер, умеющий работать с MS SQL. Было перепробовано всё, с чем мог работать ADODB и, в конечном итоге, мы остановились на использовании php_dblib.dll от Фрэнка Кромана. Фрэнк в то время поддерживал расширения 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, от возможности “пощупать” который я не смог отказаться. В результате выяснилось, что PHP Manager нормально подключает 5.4.6, делая его php.ini файл видимым.

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

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

Microsoft PHP web installer

Он устанавливает все необходимые компоненты. Прошло каких-то 10 лет, и на сайте Microsoft появились действительно клёвые штуки для работы в среде Windows на PHP – тут тебе и драйвер, и инсталлятор, создающий специальную PHP консоль в недрах IIS-а и Windows Cache под 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 на другом. Думаю, что это и многое другое, как, например, использование разных файлов конфигурации на разных виртуальных хостах, можно сделать вручную, используя отличную статью Руслана Якушева из компании 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 (например, вот здесь находится необходимая нам версия).

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

$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 таким образом:

if(is_array($this->fields)) {
    foreach($this->fields as $key=>$value) {
        if (is_object($value) && method_exists($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.

<?php
echo "<B>Direct driver connection</b><BR>";
$connectionInfo = array(
      "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 "Unable to connect.</br>";
   die( print_r( sqlsrv_errors(), true));
}
 
 
$tsql = "SELECT GETDATE() AS today";
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false )
{
   echo "Error in executing query.</br>";
   die( print_r( sqlsrv_errors(), true));
}
 
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
echo "Today is ".$row['today']->format('Y-m-d H:i:s')."</br>";
 
 
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
 
ini_set( "include_path", ini_get( "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 "<B>ADODB MSSQL Native connection</b><BR>";
$adoConnection = ADONewConnection('mssqlnative');
//$adoConnection->debug = true;
$adoConnection->Connect($server, $user, $password, $database);
 
 
$rs = $adoConnection->Execute($tsql);
 
echo "Today is ".$rs->fields['today']."</br>";
$adoConnection->Close();
?>

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

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

Игорь

Print this post | Home

12 comments

  1. Sylvia says:

    Я так понимаю что для этого нужно иметь полный доступ к серверу, так? Просто у меня именно windows-хостинг и эта проблема надоела уже)))

  2. Igor Kryltsov says:

    Что именно надоело? :)

  3. ivaseg says:

    Как у тебя получилось установить Microsoft Drivers 3.0 for PHP v5.4 for SQL Server in IIS через Web Platform Installer? У меня на Windows 2008 Server и MS SQL 2008 и IIS7 через Web Platform Installer не захотело установиться, выдало ошибку:
    Невозможно установить этот продукт, поскольку продукт, от которого он зависит, не был успешно установлен.

    И вот ошибки зависимостей:
    Product: Microsoft SQL Server 2012 Native Client — Installation of this product failed because it is not supported on this operating system. For information on supported configurations, see the product documentation.

    Так как у тебя Microsoft SQL Server 2012 Native Client установился, если установщик пишет, что он не поддерживается Windows 2008 Server?

  4. Igor Kryltsov says:

    Я не устанавливал “Microsoft Drivers 3.0 for PHP v5.4 for SQL Server in IIS через Web Platform Installer”

    Я загрузил с сайта Microsoft инсталлятор PHP 5.3.6 и установил его. Далее я просто добавил 5.4. В посте параграф начинается со слов “Теперь мы можем добавить PHP 5.4.6, …..”.
    Подготовительная работа для 5.4.6 описана выше в посте:

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

    Видите пункт 4? Просто распаковали и положили в папку. Нет никакого Web Platform Installer-а

  5. ivaseg says:

    Просто у вас на скриншоте как раз и показан Web Platform Installer http://www.deepshiftlabs.com/dev_blog/wp-content/uploads/2012/09/php_installer.png

    ЗЫ: проблема решена, нужно было установить SP2 для Windows 2008 Server, т.к. на SP1 или вообще без сервис пака, не поставить. Кстати, так и не понял, какой резон было ставить 5.3.6, чтобы потом поставить 5.4.6? Объяснение я то понял, но вопрос в том, почему именно 5.3.6, почему не 5.4.0 (а потом уже 5.4.6 поставить)?

  6. Igor Kryltsov says:

    Про 5.3.6 в посте ни слова.

    Web Platform Installer устанавливает всё в этих двух версиях (это прямо сейчас на сайте Майкрософт)- http://www.microsoft.com/web/platform/phponwindows.aspx PHP 5.2.17 и 5.3.5.
    Когда я устанавливал последняя доступная версия Web Platform Installer была 5.3.13, а мне нужна была 5.4. Вот я и описал процесс установки 5.3.13 из Web Platform Installer и добавления 5.4 постфактум.

  7. Igor Kryltsov says:

    As for: “Product: Microsoft SQL Server 2012 Native Client — Installation of this product failed because it is not supported on this operating system. For information on supported configurations, see the product documentation.”

    If you Google it you will see – http://msdn.microsoft.com/en-us/library/cc280356.aspx

    However as usual with Microsoft you will not find SP2 as a requirement but below in comments:
    ——————
    “SQL Server Native Client 2012 can be installed with Windows Server 2008 SP2″

    - Windows Server 2008 – Failed
    - Windows Server 2008 SP1 – Not tested yet
    - Windows Server 2008 SP2 – Success!
    ——————-

    Basically I updated my Win 2008 R2 before installation and I did not hit this problem and as a result did not describe it in my post.

  8. Igor Kryltsov says:

    “Про 5.3.6 в посте ни слова.” – беру свои слова обратно. Если бы вы не написали – ошибка бы осталась. Спасибо. Исправил пост. Устанавливал не 5.3.6, а 5.3.13, которая была последней доступной из Web Installer во время написания поста.

  9. ivaseg says:

    кстати, весь процесс можно чуток ускорить, если ставить все через Web Platform Installer, в конечном счете нам нужно просто отдельно потом добавить себе версию ПХП посвежее, и не нужно ничего скачивать вручную не нужно, все почти на автомате делается.

  10. Igor Kryltsov says:

    кстати, весь процесс можно чуток ускорить, если ставить все через Web Platform Installer,

    Так так и было сделано. Что вы видите в моём посте лишним?

  11. micaz says:

    best of best blog
    step by step and detail picture
    thank you

  12. Todd says:

    Thanks for finally writing ɑbout Install PHP 5.4.6
    оn IIS 7 tօ ѡork with MS SQL 2008