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