表題の作業をやったんですが、物凄く苦労しました。ググれば情報は出てくるんだけど、書かれた通りやっても上手くいかなかったり。
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入ってました。これで完了かと思ったらまだダメで、unixODBCとlibiconvが必要だった。
# 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とかもう勘弁。