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 の設定
自分でやっているときは、異常にワケがわからなくて、いらだっていた設定ファイルの関係なんですが、わかってみて、絵にしてみたら、全然複雑じゃないですね。実際 FreeTDS のユーザーガイドをしっかり読めば…少なくとも 3. Install FreeTDS と 4. 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 のやってる事を手動でやってみました。
- PECL サイトにて PDO_DBLIB パッケージのアーカイヴをダウンロード
- アーカイヴを展開して ( tar -zxvf PDO_DBLIB-1.0.tgz ) PDO_DBLIG のディレクトリに移動
- phpize コマンドを実行
- ./configure コマンドを実行
- make && make install
- すると no-debug-XXXXXXXXX とかいうディレクトリ名で pdo_dblib.so とかいうファイルが出来ているはずなので、extension_dir でなければ、extension_dir に移動させる。
- php.ini の中にある Dynamic Extensions 項に extension=php_dblib.so を一行追加。extension_dir からの相対パスになるのも注意
- Apache を再起動して、p h p i n f o () を確認する
僕が確認している事項
- PDO で FreeTDS を使用する DSN suffix (DSN接頭辞) は今の所 dblib です。マニュアル:PDO_DBLIB DSN には以下のようにありますが、今の所実装とは異なります。
PDO_DBLIB が FreeTDS ライブラリに対してリンクされている場合は DSN 接頭辞は sybase: です。 Microsoft SQL Server ライブラリに対してリンクされている場合は mssql:、それ以外の DB-lib に対してリンクされている場合は dblib: となります。
- そして DSN 名による接続はできません。以下のように必ず host:port を使う必要があります。
$PDO = new PDO('dblib:host=IP_ADDRESS:PORT_NO;dbname=DB_NAME','USERNAME','PASSWORD');上記マニュアルページのコメント欄にありますが、Windows システムでは IP_ADDRESS:PORT_NO という指定は出来ず IP_ADDRESS,PORT_NO となるらしいですが、僕は試してません。 - datetime 型 の値が結構変わってしまうかもしれません。おそらく FreeTDS の locales.conf がやってる部分だと思うのだけれど、まだよくわかってません。
まとめ
以上で PHP の PDO を使って FreeTDS 経由で、MSSQL サーバーに接続する事が出来ました。PDO のマニュアルもしっかり整備されてないし、実装が変わる可能性もいっぱいありそうですが、FreeTDS 自体の提供する接続は結構安定しているし、使えそうだと思います。
あとは PDO_ODBC だと思い込んで、コンパイルして PHP が無言で Segment Fault を頻発したときは血の気が引きましたが、要するにマニュアルとソースを嫁!という普通の事を再確認しました。
Comment:0
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
