2011年5月10日 星期二

PHP撈MS-SQL資料遇到的問題

PHP撈MS-SQL資料很多年前就嘗試過了,那時候是將PHP與MS-SQL都裝在同一台Server上,利用ODBC去撈的。

上個禮拜有個小任務,同樣也是PHP撈MS-SQL資料。這個案子只是測試版,短期又不會上線,等於是沒功勞的案件。不過呢,我喜歡搞這種異質平台的整合方案,就當成在練功吧。

這次測試過程遇到不少問題,紀錄下來,做為日後參考:

1. MS-SQL記得要設定一組使用者帳號,提供給PHP連線函式使用。並將這組帳號,賦予給要存取的Table,否則會出現權限不足,無法存取的訊息。

2. 在本機Win7上測試PHP連線到MS-SQL都正常,換到Windows 2003卻出現畫面空白。到網路查解決方式,將以下兩個檔案複製到Windows\System32底下,並將Apache services重啟即可。
  • C:\AppServ\php5\ext\php_mssql.dll
  • C:\AppServ\php5\ntwdblib.dll
3. 解決上述問題後,畫面總算出現東西了,卻秀出無法連線到Server的訊息。找了好久,最後解決方式是將連線程式內,原本連線到MS-SQL是用IP的,改為主機名稱就解決了。

這個問題比較奇怪,照理來講,用IP解析會比用名稱解析來的直接及快速。不管了,先可以用再說。這問題以後有想到再來研究。

4. 當PHP查詢MSSQL資料時(尤其是大量資料),常會出現”Fatal error: Maximum execution time….”的錯誤訊息。到php.ini將max_execution_time值調高(預設30秒),就不會因為查詢時間逾時,而出現錯誤訊息。

(PS.PHP查MySQL速度很快,就算資料大也是很快就回應。但是改成MS-SQL就很慢,不知道是誰的錯?)


5. 當PHP查MS-SQL遇到大量資料時,會將記憶體給塞滿,然後出現這段錯誤訊息:”Fatal error: Allowed memory size of 25430681 bytes exhausted (tried to allocate 2054 bytes)”。

到php.ini修改memory_limit值,可以解決這個問題。但是我從預設24M一路上修到800M,發現只要遇到那種大量資料查詢,就會出現記憶體不足的情形。 最後我只好使用筆數限制來解決這個問題。

(PS.我不清楚PHP撈MS-SQL資料,到底去抓甚麼東西,竟然可以將記憶體塞爆。當然,這也有可能是我技術太差,或有甚麼東西沒調整好所引起。上述情形在MySQL還沒遇到過,看來PHP跟MS-SQL需要一段磨合期。)


最後,PHP撈MS-SQL語法可參考此網站:
http://cch8.blogspot.com/2010/11/phpmssql.html