PHP 5.3 не распознает собственный клиент для подключения к MS SQL

У нас работает сервер

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

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

Я установил следующую версию PHP PHP 5.3.10 Дата сборки 02.02.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 (DLL-файлы находятся в 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 и пошел к этому ключу.

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

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

Cheers, Fede

Это оказалось проблемой разрешения.

Я изменил в php.ini опцию fastcgi.impersonate на 0 и попробую с разными идентификаторами пула приложений. Он работал как локальная система. Это учетная запись с большим количеством прав пользователя, чем учетная запись Network Service или Local Service. Однако помните, что запуск пула приложений под учетной записью с повышенными правами пользователя представляет собой высокий риск для безопасности. Дополнительные справки по учетным записям и как настроить проверку этих статей:

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

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

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

Поэтому я открыл RegEdit и нашел этот ключ

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

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

Надеюсь это поможет! Federico

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

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

У меня была такая же проблема с версией компилятора, и она была решена с помощью драйвера 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.