Laravel 5.1 在 Ubuntu 14.04 透過 FreeTDS 連結 Azure SQL Server

最近剛好有個專案使用 PHP 目前最夯的 Framework – Laravel
因為是要部屬到 Microsoft 的雲端平台 Azure 上  結果出現了一些連結資料庫的問題

在安裝 php 的時候並不會預設安裝 SQL Sever 的 Driver
不論你今天是在 Windows 亦或著是像我在這個專案中azure上所開的Linux虛擬主機
都會遇到 Laravel 在 config/database.php 中在配置 Database driver 為 sqlsrv 時的錯誤 –  Driver not found

Linux 必須透過 FreeTDS 來處理連結資料庫
在 Linux 的配置上我們必須使用 apt-get 來安裝

打開您的終端機並輸入

sudo apt-get install freetds-dev tds-odbc libsybdb5 libct4libdbd-freetds freetds-common freetds-bin

接著修改  /etc/freetds/freetds.conf

sudo vim /etc/freetds/freetds.conf

將配置修改成

[global]
    tds version = 8.0 # TDS version, ref this.
    client charset = UTF-8
    text size = 20971520
[website]
    host = {yourdomain}.database.windows.net
    port = 1433

配置完後我們先嘗試重開 apache

sudo apachectl restart

接著輸入 下面的 website 是剛剛在freeTDS中所配的名稱 如上
我們剛配置的名稱為website 帳號為 您在 azure上所配置的Database帳號

tsql -S website -U username

接著輸入密碼,成功的話應該會像

Password: 
locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>

接著您應該就可以順利透過 FreeTDS 連結 SQL Server.

你以為一切都如想像一樣順遂嗎?

結果你會發現當你在使用 Laravel 的 Eloquent 的時候出現這個問題

test

 

Unexpected data found.
Unexpected data found.
The separation symbol could not be found
The format separator does not match
Trailing data

這問題就 Carbon.php 出現問題
你可能會發現上面的圖片 錯誤的行數跟你的不太相同
原因是因為我在解決這個問題的時候有去修改 Laravel 原始的 package
所以可能導致錯誤的行數不同

會出現這個exception的原因是當我們透過 FreeTDS 取出 SQL Server的資料時
他們將時間轉換格式為成這種 ‘Nov 18 2015 06:11:32:000AM’
但是Carbon的套件並無法順利將這種字串轉成Laravel預設的
dateFormat ‘Y-m-d H:i:s’
因此解決這問題的方法為修改 FreeTDS 取資料時的dateFormat

在 /etc/freetds/ 中新增 locales.conf

sudo vim /etc/freetds/locales.conf

設置內容為

[default]
date format = %Y-%m-%d %I:%M:%S.%z

接著一樣重開 apache

sudo apachectl restart

OK, 恭喜你也解決這個問題啦 !

參考網址為原始的 Laravel 專案中的 issue: https://github.com/laravel/framework/issues/1756

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *