CakePHP3でLinux環境からSQLServerに接続する

2014-12-24
PHP
SQLServer
Advent Calendar
CakePHP3

この記事は、CakePHP Advent Calendar 2014の25日目の記事です。

2014/12/25 0:08追記>> PHPのバージョンは5.5, SQLServer2008, CakePHP3はdevの最新版です。

普通の人は、まずCakePHPを選択した時点でSQLServerを選ぶことはないと思いますがw CakePHP2の時も、デフォルトの状態ではLinuxからSQLServerに接続出来なかったので、CakePHP3でも試してみました。

CakePHP2の場合の手順は、過去のエントリーを参照下さい。
とりあえず、CakePHP3をcomposerでセットアップして、sandboxアプリを立ち上げて、app.phpの設定でdriverとしてSqlserverを選択します。

1
2
3
4
5
6
7
8
9
10
11
12
13
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Sqlserver',
'persistent' => false,
'host' => '***.***.***.***',
'port' => '1433',
'username' => 'testuser1',
'password' => 'Pass!Testuser',
'database' => 'blogs',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,

つながらぬ。

やはり駄目ですね。 恐らく原因は、dbo_sqlsrvを探しに行っているからだと思いますが、コードをチェックしてみます。
Connection.phpでdriverをnewしている箇所で、Sqlserverのdriverのコンストラクターが呼び出されて死んでます。

具体的には「vendor/cakephp/cakephp/src/Database/Driver/Sqlserver.php」の40行目ですね。
メンバ変数に初期値をセットしている部分で、pdo_sqlsrvの定数を参照して死にます。

1
'encoding' => PDO::SQLSRV_ENCODING_UTF8,

SQLSRV_ATTR_ENCODING_UTF8は、pdo_sqlsrvには存在するものですが、残念ながらLinux用のpdo_sqlsrvは無いのです。
というわけで、やっぱりSQLServerに接続できないので、ちょっぴりdriverを改造します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40c40
< 'encoding' => 'UTF-8',
---
> 'encoding' => PDO::SQLSRV_ENCODING_UTF8,
56a57
> PDO::ATTR_PERSISTENT => $config['persistent'],
60c61,63
< $enc = !empty($config['encoding']) ? $config['encoding'] : 'UTF-8';
---
> if (!empty($config['encoding'])) {
> $config['flags'][PDO::SQLSRV_ATTR_ENCODING] = $config['encoding'];
> }
62c65
< $dsn = "dblib:host={$config['host']};dbname={$config['database']};charset={$enc}";
---
> $dsn = "sqlsrv:Server={$config['host']};Database={$config['database']};MultipleActiveResultSets=false";
85c88
< return in_array('dblib', PDO::getAvailableDrivers());
---
> return in_array('sqlsrv', PDO::getAvailableDrivers());

sqlsrvをdblibに差し替える&pdo_dblibでサポートされてない定数の参照を削除しました。
これで、ひとまずdatabaseに接続することは出来ました。

繋がったぜ!

でも、まともに動かないんじゃ話にならないので、blogチュートリアルをやってみると・・・
う、動かない・・・(ノД`)シクシク

簡単にごまかせるかと思いましたが、ORMapper内のSQLServerの方言解釈あたりで、よく分からんバグり方をしているようです。
そもそもWindowsでも動くのだろうか・・・、あやしいぞw。(-_-;)

撃沈

2014/12/25 0:08追記 >> articlesテーブルからの一覧取得が出来なかったです。単純なSELECT句だと思います。
というわけで、接続は出来ましたが、アプリケーションは動かずということでした。

なので、SQLServer&Linuxのユーザは、まだCakePHP3は危険なのでやめたほうが良さそうです。
試してないので、何ともいえないですが、Driver非依存の箇所でエラーが起きているので、WindowsサーバのPHPでも上手く動かない可能性もあると思います。

CakePHP3でSQLServerに接続できないんて悲しいので、引き続きトライしてみます。 メリークリスマス!