Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> php + mssql

php + mssql (freetds)

Автор: Abigor.


У меня есть хостинг, настроенный от части по статье Лиса. Все долгое время работало, но так как у нас есть единая база по всему чего только можно, и хранится она в MS SQL 2005. Понадобилось дать к ней доступ с хостинга.
На чем это все делалось:
FreeBSD 7.0-RELEASE
apache-2.2.8
mod_fastcgi-2.4.6
php5-5.2.5

Для начала, ставим модуль для php.
make -C /usr/ports/databases/php5-mssql/ install clean

Перезагружаем apache, чтоб он увидел модуль.
Так, теперь самое интересное в этом деле, php у нас будет рабоать через прослойку в виде freetds. Почитать про это дело можно тут. Ставим.
make -C /usr/ports/databases/freetds/ install clean
make -C /usr/ports/databases/freetds-msdblib/ install clean

Теперь идем в /usr/local/etc и правим конфиг freetds
[root@dedic etc]# ls freetds.*
-r--r--r--  1 root  wheel  1493 30 апр 10:19 freetds.conf
-r--r--r--  1 root  wheel  3572  4 май 10:54 freetds.conf.dist
[root@dedic etc]#

Приводим его к подобному виду:
[global]
    tds version = 4.2
    initial block size = 512
    swap broken dates = no
    try server login = no
    try domain login = yes
    cross domain login = no
    swap broken money = no
    dump file = /tmp/freetds.log
;    debug flags = 0xffff
;    timeout = 10
;    connect timeout = 10
    text size = 64512

[websql]
    host = websql.isea.ru
    port = 1433
    tds version = 8.0
    client charset = CP1251

[sql]
    host = sql.isea.ru
    port = 1433
    tds version = 8.0
    client charset = CP1251

У меня два sql сервера к которым необходимо подключаться, по этому они оба у меня тут описаны. Да, оба сервера должны иметь рабочую A запись в dns, иначе будут трудности.
Так, все поставили, можно начинать проверять на работоспособность все это дело.
Для начала заведем в домене пользователя под которым будет происходить коннект к базам, (почему в домене? да по тому что у меня в ms sql авторизация только по домену, внутренняя авторизация отключена), даем ему права на нужные базы, и команды. Дальше я написал маленький скрипт на php чтоб проверить работоспособность всего этого.
Вот скрипт: (не пинайте если чего не так, я не сильно люблю php, так что как мог, так и написал)
<?
$conn = mssql_connect ('sql', 'ISEA\iis-mek.isea.ru', 'pass') \
      or die ("Can't connect to Microsoft SQL Server");
mssql_select_db('db_name', $conn) or die ("Can't select databes");

$result = mssql_query("sql запрос");

for ($i = 0; $i < mssql_num_rows( $result ); ++$i){
    $line = mssql_fetch_row($result);
    print( "$line[0] - $line[1]\n");
}
?>

Ну и можем его выполнить в консоли или через web, я через web выполнил, в браузере появился результат запроса. Вот как бы и все :)






размещено: 2008-05-04,
последнее обновление: 2008-05-04,
автор: Abigor


max, 2008-05-04 в 16:37:13

замечательная статья

Sash, 2008-05-04 в 19:56:09

ой, цпасибА! ) как раз воремя.

mssql, 2008-05-20 в 16:01:00

Супер! Прямо вовремя!

MelkorBSD, 2008-05-28 в 19:17:31

Хочется особо отметить вот этот параметр:

text size = 64512

Если Ваш PHP-скрипт вытаскивает из базы что-то из text/image поля, то он вытащит оттуда не более этого значения.
Поэтому рекомендую об этом подумать заранее и в случае необходимости выставить тут число чуть побольше (можно до 4G).

Vitaly, 2008-06-19 в 21:55:20

while ($row = mssql_fetch_assoc($result))
{
   echo serialize($row)."\r\n";
}

/*
Мне кажется так получше будет
ну и еще до кучи можно проверить валидность $result
*/

stalex, 2009-03-19 в 15:04:29

спасибо !

Leech, 2009-04-09 в 21:28:15

Супер !!! Все пашет как часы.
Огромное спасибо. Нигде не видел лучшего объяснения.
Главное все на свежей версии фряхи :)

С Уважением Leech

Seltsam, 2009-11-10 в 14:06:54

Работает без вопросов с MSSQL 2000 - это Вы бы уточнили в статье =)
Пробовали с MSSQL-2005 - необходимо во freetds.conf для сервера указывать порт 1168, на 1433 сам sql-сервер посылает нафиг.
Сейчас столкнулись с траблой во фришке 7.2 с обновлёнными портами (php-5.2.11) - коннект к серверу есть (согласно файрвола пакеты бегают), а вот в логах апача говорится:
HP Warning:  mssql_connect() [<a href='function.mssql-connect'>function.mssql-connect</a>]: Unable to connect to server:  srv_db1 in /usr/local/www/webinfo/data/1ca/main.php on line 25, referer: http://webinfo/1ca/
и всё... в логах sql-сервака ничего не поймали, какбуд-то коннекта никакого нет, хотя тем же netstat -na коннект есть...
что подскажете? форум?

abigor, 2009-11-10 в 18:21:23

2 Seltsam если вы внимательно читали, то в самом начале, сказано, что все это дело делалось с MSSQL 2005 по этому конфиг выложен рабочий.
До php 5.2.11 только предстоит обновляться. Тут ни чего не скажу пока....

Seltsam, 2009-11-10 в 18:58:33

Я сильно извиняюсь - заметил, только пост уже изменить нельзя было.
Боролся сегодня с программером с этой проблемой, в итоге - поменяли в конфиге freetds.conf для необходимого сервера tds version с 8.0 на 7.2 и потом программер ещё что-то там с кодировками возился - sql-сервер не понимал почему-то utf-8. эту кодировку необходимо было юзать программеру для простоты чего-то там. в общем - вроде заработало.
а вообще - изначально такая связка php+mssql работало на freebsd-6.2, php-5.2.9. только там ещё использовали pool.conf и [mypool] в freetds.conf.
походу что-то в php-5.2.11 по поводу freetds изменилось, т.к. если в странице на php напрямую указывать сервер и параметры подключения, то работало тоже без проблем, ну только опять там с кодировками надо было что-то делать программеру.
но за инфу - спасибо по любому =)
всё равно идеального ничего нет, а грабли - вечная вещь =)

abigor, 2009-11-10 в 19:40:03

:) хорошо все что хорошо кончается



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0387 секунд
Из них PHP: 24%; SQL: 76%; Число SQL-запросов: 77 шт.
Исходный размер: 23745; Сжатая: 6926