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:0

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