How-to: Linux talks to Microsoft SQL Server by PHP Data Objects (PDO) その2

Date
2007-04-18 (Wed)
Category
php

How-to: Linux talks to Microsoft SQL Server by PHP Data Objects (PDO) その2

前回に引き続き、Linux 上の PHP から、PDO を使って、Micrsoft SQL server に接続する方法を解説します。

unixODBC と FreeTDS の設定

Relationship between conf files

自分でやっているときは、異常にワケがわからなくて、いらだっていた設定ファイルの関係なんですが、わかってみて、絵にしてみたら、全然複雑じゃないですね。実際 FreeTDS のユーザーガイドをしっかり読めば…少なくとも 3. Install FreeTDS4. Preparing ODBC を読んでおけばどうなっているかは理解できるはずです。実際の設定内容は以下の通り。

odbcinst.ini

[FreeTDS]
Driver = /usr/local/lib/libtdsodbc.so

odbc.ini

[ODBC Data Sources]
MY_DSN_NAME = MSSQL

[MY_DSN_NAME]
Driver = /usr/local/lib/libtdsodbc.so
Description = MSSQL
Trace = No
Servername = MY_HOST_NAME
Database = MY_DB_NAME

[Default]
Driver = /usr/local/lib/libtdsodbc.so

freetds.conf

[MY_HOST_NAME]
host = MY_HOST_IP
port = MY_HOST_PORT_NO
tds version = 7.0

これらの設定は、unixODBC パッケージに付属の odbcinst コマンドで確認できます。

# odbcinst -q -d
[FreeTDS]
# odbcinst -q -s [MY_DSN_NAME] [Default]

ここで、まずは FreeTDS パッケージに付属の tsql コマンドを使って、FreeTDS の接続がうまく行くか試してみましょう。

# tsql -S MY_HOST_NAME -U USERNAME -P PASSWORD
locale is "en_US.UTF-8"
locale charset is "UTF-8"
1>

1> 以降は、改行を押すたびに 2> 3> と数が増えますが、それ以上何の反応もないです。1> も出ない/エラーが出る、ということは、サーバと接続できていません。サーバーの IP がリーチャブルかとか、Port があってるかとか試してみてください。IP と Port に関しては telnet コマンドで

#telnet MY_HOST_IP MY_HOST_PORT_NO
Trying MY_HOST_IP...
Connected to MY_HOST_IP.
Escape character is '^]'.

とか出れば、リーチャブルなのでしょう。あとは TDS のバージョンを変えてみるとか。

tsql がうまく言ったら今度はいよいよ実際に SQL を投げてみましょう。unixODBC パッケージに isql というコマンドがあり、これは SQL のインタラクティヴシェルです。

# isql -v MY_DSN_NAME USERNAME PASSWORD
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

SQL 文を発行してみて、内容を確認してみてください。もし connected と出ない場合は、おそらく DSN の設定がおかしいです。isql を -v で起動すると verbose モードで、いろいろエラーが出ていると思うので、内容をググって見てください。7. Troubleshooting の内容も役に立つでしょう。

PDO のインストール

PDO ではクラスメソッドが統一されていて、どのデータベースを使っていようと、同じ操作感を提供する、というのが売りです。で、違いはインスタンス作成時の DSN の呼び方で、実際にどのクラスを使うのかを分けます。僕は正直ってここにハマっていました。ODBC を使っているので、てっきり ODBC だと思い込み、ひたすら PDO_ODBC をビルド/インストールしては動かない、なんでだろう?を繰り返していました。6. How to get what works with it working:: PHP にも ODBC って書いてあるし(db-lib とも書いてありますけど、まぁ焦っているとわからないものです)。

大きな声で言っておきます。PHP で FreeTDS を扱えるのは PDO_DBLIB です。っつぅかね、マニュアルにもでかでかと XCI. Microsoft SQL Server および Sybase 関数 (PDO_DBLIB) って書いてあるしね…やっぱ RT*M だね。。。

でももし PDO が shared module じゃなくて、static link だったら、この PDO の設定を変えるたびに PHP 全体を再ビルドしなくちゃいけなかったわけで、shared module にしておいてよかったよかった。やり方自体は全然簡単で、PHP 本体の ./configure の時に option で --disable-pdo を一言追加。後は pecl コマンドを使って、pecl install PDO_DRIVER とかする。

今回は設定を一応確認しながらやりたかったので、pecl のやってる事を手動でやってみました。

  1. PECL サイトにて PDO_DBLIB パッケージのアーカイヴをダウンロード
  2. アーカイヴを展開して ( tar -zxvf PDO_DBLIB-1.0.tgz ) PDO_DBLIG のディレクトリに移動
  3. phpize コマンドを実行
  4. ./configure コマンドを実行
  5. make && make install
  6. すると no-debug-XXXXXXXXX とかいうディレクトリ名で pdo_dblib.so とかいうファイルが出来ているはずなので、extension_dir でなければ、extension_dir に移動させる。
  7. php.ini の中にある Dynamic Extensions 項に extension=php_dblib.so を一行追加。extension_dir からの相対パスになるのも注意
  8. Apache を再起動して、p h p i n f o () を確認する

僕が確認している事項

まとめ

以上で PHP の PDO を使って FreeTDS 経由で、MSSQL サーバーに接続する事が出来ました。PDO のマニュアルもしっかり整備されてないし、実装が変わる可能性もいっぱいありそうですが、FreeTDS 自体の提供する接続は結構安定しているし、使えそうだと思います。

あとは PDO_ODBC だと思い込んで、コンパイルして PHP が無言で Segment Fault を頻発したときは血の気が引きましたが、要するにマニュアルとソースを嫁!という普通の事を再確認しました。

Comment:2

Lukas Kahwe Smith:2008-08-06 (Wed) 02:34

How is the combo PHP on *nix plus SQL Server 2005 working out for you?

Takashi Mizohata:2008-10-06 (Mon) 07:36

Hello Lukas, thanks for your comment. It worked great.

As you could see (and may have tried), the configuration process is not that straight and also things might have changed drastically since Microsoft pushes Open Source products these days. I build a small mailing system on the top of... not fully maintained MS SQL server on the job I had before. I left there like.. a few years ago already and I don't have any MS SQL environment currently, I cannot say things now.

Hope it helps!

Comment Form

Remember Me?


Trackback:0

TrackBack URL for this entry
http://blogs.grf-design.com/mt/mt-tb.cgi/208
Listed below are links to weblogs that reference
How-to: Linux talks to Microsoft SQL Server by PHP Data Objects (PDO) その2 from The Croton

Return to Page Top