PHP 5.3 не распознает Native Client для подключения к MS SQL - PullRequest
2 голосов
/ 22 марта 2012

У нас есть сервер, работающий на

32-битный IIS6.0 Windows Server 2003 (у нас есть некоторые классические приложения ASP, которые используют 32-битные компоненты, поэтому мы не можем перейти на 64-битную версию 2008)

Наш сервер БД находится на отдельном компьютере под управлением Windows Server 2008, 64-разрядная версия MS SQL 2008 R2, 64-разрядная версия

. Я установил следующую версию PHP PHP 5.3.10 Дата сборки 2 февраля 2012 г. 20:26:31 Компилятор MSVC9(Visual C ++ 2008)

PHP отлично работает на статических страницах, но проблема заключается в попытке подключения к MSSQL.Нам нужно подключиться к MSSQL из-за большого количества унаследованного кода в ASP и существующей БД MSSQL.

У меня установлен SQL Native Client 2008, я устанавливал его несколько раз.Я проверил, и библиотеки DLL находятся в папке system32.

Это загружаемые расширения

[PHP_SQLSRV_53_NTS_VC9]
extension=php_sqlsrv_53_nts_vc9.dll
[PHP_PDO_SQLSRV_53_NTS_VC9]
extension=php_pdo_sqlsrv_53_nts_vc9.dll

Когда я запускаю phpinfo, я не вижу драйвера sqlsrv в списке

Я проверил журнал ошибок PHP и получил следующую ошибку

[22-Mar-2012 14:04:27 UTC] PHP Warning:  PHP Startup: sqlsrv: Unable to initialize module
Module compiled with build ID=API20090626,NTS,VC9
PHP    compiled with build ID=API20090626,TS,VC9
These options need to match
 in Unknown on line 0
[22-Mar-2012 14:04:27 UTC] PHP Warning:  PHP Startup: pdo_sqlsrv: Unable to initialize     module
Module compiled with build ID=API20090626,NTS,VC9
PHP    compiled with build ID=API20090626,TS,VC9
These options need to match
 in Unknown on line 0

Если я изменю расширение на использование Threaded Safe и перезапущу пул приложений, все равно получаю эту ошибку.

Я несколько раз пытался переустановить Native Client и PHP, но безуспешно.

Я получил другую ошибку, прежде чем sqlsrv не смог распознать собственный клиент, но теперь php не распознает sqlsrv.

ОБНОВЛЕНИЕ

Мне удалось сделать это с правильным драйвером sqlsrv и без ошибок в php errorlog

Но при использовании этого скриптаподключиться или дать мне ошибку в sql

<?php
$serverName = 'DBSERVER';
$connParams = array('UID'=>'UID', 'PWD'=>'PASSWORD', 'Database'=>'DATABASENAME','ReturnDatesAsStrings'=> true);
$conn = sqlsrv_connect($serverName, $connParams);
if(!$conn){
    $errors = sqlsrv_errors();
    die(var_dump($errors));
}
sqlsrv_connect($conn);
die('connected');
?>

и я получаю эту ошибку

> array(2) { [0]=> array(6) { [0]=> string(5) "IMSSP" ["SQLSTATE"]=>
> string(5) "IMSSP" [1]=> int(-49) ["code"]=> int(-49) [2]=> string(390)
> "This extension requires either the Microsoft SQL Server 2008 Native
> Client (SP1 or later) or the Microsoft SQL Server 2008 R2 Native
> Client ODBC Driver to communicate with SQL Server. Neither of those
> ODBC Drivers are currently installed. Access the following URL to
> download the Microsoft SQL Server 2008 R2 Native Client ODBC driver
> for x86: http://go.microsoft.com/fwlink/?LinkId=163712" ["message"]=>
> string(390) "This extension requires either the Microsoft SQL Server
> 2008 Native Client (SP1 or later) or the Microsoft SQL Server 2008 R2
> Native Client ODBC Driver to communicate with SQL Server. Neither of
> those ODBC Drivers are currently installed. Access the following URL
> to download the Microsoft SQL Server 2008 R2 Native Client ODBC driver
> for x86: http://go.microsoft.com/fwlink/?LinkId=163712" } [1]=>
> array(6) { [0]=> string(5) "IM002" ["SQLSTATE"]=> string(5) "IM002"
> [1]=> int(0) ["code"]=> int(0) [2]=> string(91) "[Microsoft][ODBC
> Driver Manager] Data source name not found and no default driver
> specified" ["message"]=> string(91) "[Microsoft][ODBC Driver Manager]
> Data source name not found and no default driver specified" } }

ОБНОВЛЕНИЕ 2

Я установил инструменты SQLCMD, и он правильно подключается к серверу.

DLLверсии:

SQLNCLI10.DLL 2009.100.1600.1

SQLSRV32.DLL 2000.85.1117.0 (Я обновил эту версию с помощью DLL с другого сервера, но все равно не помог) Это сейчас версия 6.1.7600.16385

Как указано выше, установлен Native Client 2008 R2 (библиотеки находятся в windows \ system32), а БД запущена и работает.Если я запускаю тот же сценарий с другого сервера, он работает.

Я попытался с другими разрешениями для пула приложений, родных клиентских библиотек DLL и папки расширения php без удачи.

Любые идеи будутотлично.

ОБНОВЛЕНИЕ 3

Как оказалось, это была проблема с разрешениями!

Я скачал Process Monitor и последовалинструкции к этому сообщению

http://www.iislogs.com/articles/processmonitorw3wp/

Тогда я увидел, что процессу w3wp.exe было отказано в доступе к этому ключу реестра

HKLM \ Software \ ODBC \ ODBCINST.INI \ SQL Native Client 10.0

Я открыл RegEdit и перешел к этому ключу.

Я щелкнул правой кнопкой мыши -> Разрешения, добавил сетевую службу в список и дал ей разрешения на чтение.

Переработан пул приложений, и он теперь работает!

Приветствия, Федерал

Ответы [ 2 ]

4 голосов
/ 06 июля 2012

Оказалось, что проблема с разрешениями.

Я изменил в php.ini параметр fastcgi.impersonate на 0 и попытался использовать разные идентификаторы пула приложений.Он работал как локальная система.Это учетная запись с большими правами пользователя, чем у учетной записи «Сетевая служба» или «Локальная служба».Однако следует помнить, что запуск пула приложений под учетной записью с повышенными правами пользователя представляет высокий риск для безопасности.Дополнительные ссылки на учетные записи и способы настройки см. В следующих статьях:

Настройка удостоверения пула приложений с IIS 6.0 (IIS 6.0) Учетные записи пользователей службы Безопасность службы и права доступа

Я решил установить для нее значение Сетевая служба и загрузил Process Monitor *.Затем я использовал его для наблюдения за процессом w3wp, который показал, что доступ к разделу реестра, где хранится путь к sqlncli.dll, запрещен.

HKLM \ Software \ ODBC \ ODBCINST.INI \ SQL NativeКлиент 10.0

Итак, я открыл RegEdit и обнаружил этот ключ

Я щелкнул правой кнопкой мыши -> Разрешения, добавил сетевую службу в список и дал ей разрешения на чтение.

Восстановилпул приложений и теперь он работает!

Надеюсь, это поможет!Федерико

* Здесь очень хорошая пошаговая статья о том, как использовать монитор процесса.

http://www.iislogs.com/articles/processmonitorw3wp/

0 голосов
/ 08 октября 2014

У меня была та же проблема с версией компилятора, и я решил ее с помощью драйвера ODBC PHP:

//$pdo = new PDO("sqlsrv:Server=$hostname;Database=$dbname;", $username, $password);  // works with proper driver for PHP.
$pdo = new PDO("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname;", $username, $password);  // works with proper driver for ODBC and PHP ODBC.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...