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