Linux上のPHPからSQLServerに接続する

sqlserver表題の作業をやったんですが、物凄く苦労しました。ググれば情報は出てくるんだけど、書かれた通りやっても上手くいかなかったり。

2020年版はこのページの一番下を参照

サーバの構成とかによってもやり方変わるしね。詳しい方にアドバイス貰いつつ何とか出来ました。

サーバ
Windows Server 2003 R2 SP2
SQLServer 2008 EXPRESS

クライアント
Red Hat Enterprise Linux 4
PHP5.2.14(PDOは使える状態)

SQLServerと外部接続するにはODBCを使います。PHPで使えるのを調べてみるとPDO_DBLIBです。ネット上ではこれをインストールするには

# pecl install pdo_dblib

と書かれてたけど、エラーで出来ず。仕方ないので自分でコンパイルする事に。

その前にFreeTDSが必要なのでそっちを入れます。これはyumでインストールできた。

# yum install freetds-devel-0.64-1.el4.rf

設定ファイルfreetds.confは以下のように書く。

# vi /usr/local/etc/freetds.conf
[global]
 port = 1433
 tds version = 8.0
 text size = 2147483647
 charset = sjis
 client charset = UTF-8

[mssql]
 host = (IPアドレス)
 port = 1433
 tds version = 8.0
 charset = sjis
 client charset = UTF-8

PDO_DBLIBをコンパイルしてみると…エラー出る。共有ライブラリを認識させないとダメらしい。

# vi /etc/ld.so.conf
/usr/local/lib
# ldconfig

今度こそ出来た。

# tar xvf PDO_DBLIB-1.0.tar
# cd PDO_DBLIB-1.0
# phpize
# ./configure
# make
# male install

pdo_dblib.soが作成されたので、それを/usr/local/php5/lib/php/extensions/5.2.14/にコピーしてからextensions.ini編集。

# vi /usr/local/php5/etc/extensions.ini
extension=pdo_dblib.so

そしてApache再起動。phpinfo()で確認するとdblib入ってました。これで完了かと思ったらまだダメで、unixODBClibiconvが必要だった。

# tar xvzf unixODBC-2.2.11.tar.gz
# cd unixODBC-2.2.11
# ./configure --enable-gui=no
# make
# make install

設定ファイルodbcinst.ini

# vi /usr/local/etc/odbcinst.ini
[FreeTDS]
Driver    = /usr/lib/libtdsodbc.so.0
Setup     = /usr/lib/libtdsS.so
CPTimeout =
CPReuse   =
FileUsage = 1

設定ファイルodbc.ini

# vi /usr/local/etc/odbc.ini
[ODBC Data Sources]
freetds = FreeTDS ODBC Driver

[freetds]
Driver = FreeTDS
Description = MSSQL
Trace = No
Servername = mssql
Database = (データベース名)
Port = 1433

[Default]
Driver = FreeTDS

環境変数を設定しないとちゃんと動かないので設定。

# export ODBCINI=/usr/local/etc/odbc.ini
# export ODBCSYSINI=/usr/local/etc

libiconvコンパイル

# tar xvzf libiconv-1.10.tar.gz
# gunzip libiconv-1.10-cp932.patch.gz
# patch -p0 < libiconv-1.10-cp932.patch
# cd libiconv-1.10
# ./configure
# make
# make install

ここまでやってから、ようやくSQLServerにテスト接続。

# tsql -S mssql -U (ID) -P (パスワード)

“1>”って出たら接続成功です。quitで切断し、今度は別のやり方で接続。

# isql -v mssql (ID) (パスワード)

エラーで動かない…とりあえず放置してPHPで接続を試す。

<?php
$dbh = new PDO('dblib:host=(IPアドレス):1433;dbname=(データベース名)', '(ID)', '(パスワード)');
?>

繋がった! この記述方法もネット上では書いてあることバラバラで苦労したけど、とにかく接続できました。

上記の事を手探り状態で試行錯誤しつつやっていったんで、かなり大変でした。ホントはWindows Serverが客先にあって、それの外部接続だODBCだポート開放だをやりに行ったのも大変だったんだけど、もういいや。

これでようやくシステム開発に取り掛かることが出来ます。

Centos 8.1 + PHP 7.2 + SQLServer 2008の場合

2020年時点でSQLServer 2008がサポート終了していたせいで、今回も苦労しました。dblibからsqlsrvに切り替わり、最新のODBC 17だと接続できないので13を使い、pdo_sqlsrvも5.8から5.3にダウングレードさせました。

まずODBCインストール(CentOS 8版は使わない)。

# curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo
# yum remove unixODBC
# ACCEPT_EULA=Y yum install msodbcsql-13.0.1.0-1 mssql-tools-14.0.2.0-1

次にここからCentOS 7.2用のPHPドライバをダウンロード(こちらもCentOS 8版は使わない)。解凍して、php_sqlsrv_72_nts.so と php_pdo_sqlsrv_72_nts.soを以下にコピー。

/usr/lib64/php/modules/

いちおうパーミッション変更。

# chmod 755 /usr/lib64/php/modules/pdo_sqlsrv_72_nts.so
# chmod 755 /usr/lib64/php/modules/sqlsrv_72_nts.so

PHPの設定ファイルを作成して書き込み。

# vi /etc/php.d/20-sqlsrv.ini
extension=php_sqlsrv_72_nts.so

# vi /etc/php.d/30-pdo_sqlsrv.ini
extension=php_pdo_sqlsrv_72_nts.so

反映させる。

# systemctl restart php-fpm.service
# systemctl restart httpd.service

PHPから接続。ポート番号の前がコロンからカンマに変わっててハマった(汗)

$dbh = new PDO('sqlsrv:Server=(IPアドレス),1433;Database=(データベース名)','(ID)','(パスワード)');

こうして見ると簡単だけど、ここまでたどり着くのに1週間かかったよ… SQLServerとかもう勘弁。

コメントを残す

メールアドレスが公開されることはありません。