Подключение к SQL Azure из PHP в Ubuntu

Я пытаюсь подключиться к базе данных SQL Azure через PHP, работающий на сервере Ubuntu 11.04.

На сервере работает версия PHP => 5.3.5-1ubuntu7.11.

Я установил freetds-bin, freetds-common, tdsodbc, odbcinst, php5-odbc и unixodbc, используя apt-get install несколько раз. Я попытался скомпилировать FreeTDS с поддержкой SSL, но не уверен, что это удалось.

На этом этапе я получаю сообщение об ошибке «08S01 - Ошибка канала связи» при попытке подключиться с помощью инструмента isql. В статье Microsoft ошибка объясняется следующим образом: «Связь между драйвером и источником данных, к которому драйвер пытался подключиться, не удалось до того, как функция SQLDriverConnect завершила обработку». Некоторые исследования по этому поводу конкретно указывают на отсутствие поддержки SSL в FreeTDS, но я не понимаю, как проверить, что это было включено.

Я буду использовать либо объекты данных PHP, либо функции mssql_ * для подключения к базе данных SQL Azure. Я менее знаком с PDO, но кажется, что PDO не обязательно использует ODBC? Мне это не совсем понятно, и я подозреваю, что это приводит меня к устранению проблем, замеченных isql, которые не связаны с проблемами, которые я вижу в PHP. Связаны ли проблемы подключения с инструментом isql с проблемами подключения в функциях PDO или mssql_ * в PHP?

Моя последняя попытка с использованием PDO:

<?php

$c = new PDO("odbc:Driver=FreeTDS;Port=1433;Server=sssssssssss.database.windows.net;Database=db_xxxxx_xxx_xxx;UID=db_xxxxx_xxx_xxx_ExternalWriter;PWD=ppppppppp");

?>

Этот код генерирует следующие ошибки в моем файле журнала Apache:

[Вт, 24 декабря, 13:23:10 2013] [ошибка] [клиент 10.1.1.11] Неустранимая ошибка PHP: Неперехваченное исключение «PDOException» с сообщением «SQLSTATE [08S01] SQLDriverConnect: 20004 [unixODBC] [FreeTDS] [SQL Server] Чтение сбой с сервера 'в /var/www/test/pdo.php:3\nStack trace: \ n # 0 /var/www/test/pdo.php(3): PDO -> __ construct (' odbc: Driver = Fre ... ') \ n # 1 {main} \ n брошено в /var/www/test/pdo.php в строке 3

Мой /etc/freetds/freetds.conf:

[global]
        # TDS protocol version
        tds version = 9.1

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
        dump file = /tmp/freetds.log
        debug flags = 0xffff

        # Command and connection timeouts
        ;       timeout = 10
        ;       connect timeout = 10

        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.
        # Try setting 'text size' to a more reasonable limit
        text size = 64512

# A typical Microsoft server
[FreeTDS]
        host = ssssssssss.database.windows.net
        port = 1433
        tds version = 9.1
        client charset = UTF-8

/etc/odbc.ini:

[TS]
Description             = "test"
Driver                  = FreeTDS
Server                  = sssssssssssss.database.windows.net
Port                    = 1433
Database                = db_xxxxxxx_xxx_xxx

/etc/odbcinst.ini

[FreeTDS]
Description     = tdsodbc
Driver          = /usr/lib/odbc/libtdsodbc.so

Любая помощь в этом беспорядке будет очень признательна. Я явно потерялся в этот момент. Спасибо!


person wolfet410    schedule 24.12.2013    source источник
comment
Я следил за документацией FreeTDS по адресу freetds.org/userguide/config.htm на настройки FreeTDS и freetds.org/userguide/install.htm при его установке. tsql -H sss.database.windows.net -p 1433 -U user -P pwd теперь возвращает Невозможно открыть сервер 'sss', запрошенный логином. Клиент с IP-адресом n.n.n.n не имеет доступа к серверу. Чтобы разрешить доступ, используйте портал управления Windows Azure или запустите .... Очевидно, что ошибка исходит из Azure, и соединение, по крайней мере, выполняется. Брандмауэр SQL Azure настроен так, чтобы разрешить подключение с любого компьютера.   -  person wolfet410    schedule 26.12.2013


Ответы (1)


Я не пробовал это специально с Azure, но на локальных машинах SQL Server, которые у нас есть, я обнаружил, что модуль php5-sybase с PDO намного проще в использовании, чем с freetds:

apt-get install php5-sybase

<?php
$dsn = 'dblib:dbname=TestDB;host=sqlserver;charset=UTF-8';
$dbh = new PDO($dsn, 'username', 'password');

Кроме того, при устранении неполадок я считаю, что следы Wireshark трафика БД поучительны, поскольку часто есть очень полезные сообщения, отправляемые сервером SQL, которые не попадают в ошибку PDO.

person Moby Duck    schedule 23.07.2015