2008年2月21日星期四

Make PHP + Apache + Linux + MSSQL 2005 Work!

這幾個月都在寫PHP,因為要接上一手的爛攤子,主要都是使用PHP在MSSQL和MySQL之間交換資料。
公司在GoDaddy租了部行Fedora 7的dedicated server,自己絕對是對Fedora零經驗!!

誰不知原來Fedora 7 Default不會跟MSSQL的Extension,即使CentOS 5都是一樣。
公司有一個號稱"十年Programming經驗"的老派Programmer說Fedora Server不可以config 支援PHP 的web伺機器,就算我不太懂Linux都知佢吹水。
若果root access都可以改config,都不能安裝PHP,那我要dedicated server幹什麼?

所以我要做的就是安裝php_mssql的Extension,我原以為好像Windows IIS Server般簡單,以為修改一下php.ini,Reboot Apache 就搞定。

原來在Linux下,要重新compile過PHP...還要在SSH用Shell Command去操作....經過幾日研究,終於辛苦地安裝好,雖然網上都有一些教學,但對於好像我這雖然自稱Windows IIS + ASP.NET老手,但亦是Linux + PHP新手,在console行command line去執行步驟,何其痛苦,未必短時間可以完成,所以我重新打一次過程希望可以幫到其他人,CentOS都適用!

操作環境 : Apache/2.2.6 & Fedora core 7 or CentOS
PHP version : 5.2.4
所需軟件 : PuTTY Download : http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe

1. 確認你的Apache和PHP已經可以正常運作後,首先開啟PuTTY,輸入你的Server Host 然後Protocol選擇 SSH,按Open。


2. 然後照PuTTY的指示去登入,需要注意的是:
-在第2和第5行輸入密碼時,PuTTY不會出現星號,你只需照樣用鍵盤輸入密碼後,按Enter即可。
-第4行的su 是切換至root login。
login as: ming
ming@202.19.110.29's password:
Last login: Wed Feb 13 20:38:31 2008 from 210.119.205.57
[ming@ip-202-19-110-29 ~]$ su
Password:
[root@ip-202-19-110-29 ming]#

3. 安裝RPMForge
前往 http://dag.wieers.com/rpm/packages/rpmforge-release/找最新的版本,然後輸入:
wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.fc3.rf.i386.rpm

按Enter,等執行完成後,再輸入:
rpm --install rpmforge-release-0.3.6-1.fc3.rf.i386.rpm

4. 以yum去install freetds,freetds-devel, php-devel , Development tools (Line By Line去按Enter執行)
yum groupinstall 'Development Tools'
yum install freetds freetds-devel –enablerepo=rpmforge
yum install php-devel

5. 用VI Editor去修改php.spec
vi /usr/src/redhat/SPECS/php.spec

- 如果找不到放在那裡的話,可以試試輸入updatedb 然後輸入locate php.spec找出位置。
- 如沒有php.spec的話,便下載php source rpm (一般檔案名稱都是以php-做開頭的)http://centos.mirrors.skynet.be/pub/centos/5/os/SRPMS/
wget http://centos.mirrors.skynet.be/pub/centos/5/os/SRPMS/php-5.1.6-15.el5.src.rpm
rpm --install php-5.1.6-15.el5.src.rpm

安裝完成後,再重覆這個Step直至成功用VI打開php.spec。

6.打開php.spec後,按[i] 進入INSERT Mode,然後在文件後半部份,你應該可以找到一行是以
"CFLAGS="做開頭的並把"-Wno-pointer-sign"這句刪除。
然後試試找尋"%package mysql" 或"%package pdo" ,當找到後,在這一行上方(記住是上方)加入:
%package mssql
Group: Development/Languages
Requires: php = %{version}-%{release}, php-pdo
Summary: A module for PHP applications that use the MSSQL database.
provides: php_database
BuildRequires: freetds-devel%description mssql
The MSSQL package contains a dynamic shared object that will add
support for accessing MSSQL databases to php.

然後按一下"Esc"退出Insert Mode
再按一下":"進入command並輸入"wq" 再按Enter。(wq = write & quit)

Step 7 :
重建php rpm
輸入
rpmbuild -bb /usr/src/redhat/SPECS/php.spec

請保持冷靜,在這時,極大機會會出現xxxx-devel Missing Dependency等error訊息。
如果是的話,可以輸入yum install xxx-devel 一個一個地去install。
把所有Dependency搞好後,切換至extension目錄:
cd /usr/src/redhat/BUILD/php-5.1.6/ext/mssql/

輸入以下去建立mssql module :
phpize
./configure –with-mssql
make
make install

Step 8:
就如Windows Server時一樣,修改php.ini。
和之前一樣,輸入"vi /etc/php.ini" 打開php.ini , 按[i] , 把"extension=mssql.so" 放進php.ini 的extension / module部份中,按[Esc],按":",按"wq"再Enter。
最後一刻就是要reboot apache server,輸入
"/etc/init.d/httpd restart"
這時在phpinfo() 應該已經可以看到MSSQL了。

Step 9:
還要再做多一點點功夫,就是修改freetds.conf 檔案,不知是否Window和Linux不同關係,我在這一步之前,搞了幾天都不能連接MSSQL =_="!!!
在Windows Server,我可以填進server,username,password至mssql_connect連接至SQL Server 2005 如
$db=mssql_connect('210.168.xxx.xxx:1234','usr','pwd');
但Linux Server就不可以,其實我都不肯定技術上是否真的不能,但我看過很多文章,理解為PHP是經FreeTDS連接至MSSQL,所以freetds.conf 必須有其設置。

首先,MSSQL Server 2005 或Express版都不可以用Default Port, 你需要設定Dynamic Port。在
Start Menu 的SQL Server Configuration Manager -> SQL Express Protocols -> TCP/IP properties -> IP Adresses -> IPAll -> Dynamic Port
輸入你的Port,如2468 etc. 謹記在你Server的Firewall 打開port 2468 和 把TCP/IP和NamePipes都設成Enable!

那麼最後一步就是用vi editor打開freetds.conf 修改,這次簡單得多,開啟後,加入:
[sqlserver2005]
host = 210.168.xxx.xxx
port = 2468
tds version = 8.0
然後照之前般儲存離開。要注意的是,不要把instance加入,如210.168.xxx.xxx/SQLEXPRESS , 直接輸入210.168.xxx.xxx就可以,因為要經Namepipes去存取instance.

最後的一步,測試!
$db=mssql_connect('sqlserver2005','usrxxxx','pwdxxxx');

成功!

PS: 打了很多字,很累,有任何問題,歡迎留言,我會看的!

3 則留言:

  1. Hi..If I were you, I will cover the ip address on the first login screenshot.

    回覆刪除
  2. Re: bm
    thanks for care :) that IP is fake :)

    回覆刪除
  3. 很好的教程
    谢谢
    不知道在FreeBSD下 是否适用?
    正在尝试中.......

    回覆刪除