PHPからSQL Server 2008への接続でハマったポイントと環境構築手順

WindowsおよびLinux環境で、PHPからSQL Server 2008に接続する際の主な注意点と設定方法を解説します。特に既存システムの移行やレガシー環境でのトラブルシューティングに役立ちます。

Windows環境でのセットアップ

まず、対応するPHPバージョンとSQL Serverドライバの組み合わせを確認します。Microsoft公式ドキュメントによると、PHP 7.2 + SQL Server 2008 R2の場合、ODBC Driver 13.1または17+と、Drivers for PHP for SQL Server バージョン4.0〜5.3が推奨されます。

必要なコンポーネント:

  • PHP本体(例: 7.2.x)
  • Microsoft Drivers for PHP for SQL Server(.dllファイル)
  • Microsoft ODBC Driver for SQL Server

インストール時の注意:

  • OSが64bitでも、PHPが32bitなら32bit版の拡張モジュールを使用
  • Thread Safe (TS) / Non Thread Safe (NTS) をPHP実行環境に合わせる
  • php.iniに以下を追加:
    extension=php_sqlsrv_72_nts.dll
    extension=php_pdo_sqlsrv_72_nts.dll

Linux環境でのセットアップ

FreeTDSを用いた接続が主流です。SQL Server 2008にはTDSバージョン7.3を指定します。

wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz
tar -zxvf freetds-patched.tar.gz
cd freetds-*
./configure --prefix=/usr/local/freetds --with-tdsver=7.3 --enable-msdblib
make && make install

その後、PHP拡張をビルド:

# mssql拡張
cd /path/to/php-src/ext/mssql
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-mssql=/usr/local/freetds
make && make install

# PDO_DBLIB拡張
cd ../pdo_dblib
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds
make && make install

php.iniに追記:

extension=pdo.so
extension=pdo_dblib.so
extension=mssql.so

接続テストコード

<?php
error_reporting(E_ALL);
header("Content-type: text/html; charset=utf-8");

try {
    $dsn = "dblib:host=172.17.1.250:1433;dbname=master";
    $user = "sa";
    $pass = "password";
    
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    
    echo "✅ 接続成功!";
} catch (PDOException $e) {
    echo "❌ 接続失敗: " . $e->getMessage();
}
?>

よくある罠:HTTP 429エラー

Laravel 5.2以降では、APIルートにデフォルトでthrottleミドルウェアが適用されており、短時間に60回以上のリクエストで429エラーが発生します。

回避策:

// routes/api.php
Route::middleware('api')->group(function () {
    // レート制限を無効化したい場合は...
    Route::middleware('throttle:1000,1')->group(function () {
        Route::get('/data', [DataController::class, 'index']);
    });
});

または、カーネルから完全に除外:

// app/Http/Kernel.php
protected $middlewareGroups = [
    'api' => [
        // \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ],
];

タグ: PHP SQLServer ODBC FreeTDS laravel

8月2日 01:35 投稿