2008年12月30日 星期二

順其自然

最近在進行程式執行環境的設定,由於前輩留下許多的程式遺產及系統都是在windows系統下執行的,因此自己寫的程式也必須在windows下執行,為了讓自己的程式能夠在windows環境下執行,經歷了許多的苦頭,許多奇奇怪怪的問題總是百思不得其解,不過,到後來,問題找到解答了,也明白一句話,順其自然。

選擇程式語言,經過了滿多的掙扎,走過了許多徘徊,難以抉擇的十字路口,最終還是選擇php,這理由很多。想過以basic,搭配.net或asp在windows上跑,這些程式語言的撰寫界面親切,而且中文資源眾多,比較好入門,不過新台弊要準備多一些,想到這就讓我打退堂鼓,我不想砸太多錢在這些軟體上,也不想上網抓非法軟體,因為太懶惰了,而且msdn的文件,就算是中文的也看不太懂,翻譯的不太順。php是開放原始碼的軟體,可以隨意散佈使用,不用揹負太多法律及金錢的壓力,比較適合我的個性。開源軟體當然不只php,也曾買了很多perl的書,不過到後來沒有看完。Perl也不錯,只是不像php那麼風行,比較少人用。就看你喜歡哪一種了。

現在我明白,其實學哪套程式語言是沒有什麼差別的,只要學通一種,再學另一種程式語言,其實是很快的,所謂的很快是指基本的語法(80%的功能),背後的精髓就另當別論,專精一二種,其實就夠了,其他的語言在你精通一二種程式語言後,就可以觸類旁通了。

原來程式搭配的資料庫系統是mssql,這套跟php搭配,有點奇怪,因為mssql是微軟的,並非開放原始碼軟體,不過沒辦法,原來的系統是建構在mssql上的,總不能不用吧!為了使用mssql,還k了一個禮拜的書,寫了一堆mssql上的預儲程序來和php搭配使用,php最常搭配的資料庫是mysql,一般常見的應用系統都是以php搭配mysql,與mssql搭配使用的程式語言通常是.net的語言。

原來的資料庫規畫跟我預期的有落差,沒有規畫primary key,foreign key,維護很不方便。不過,也沒辦法了,只好硬幹,以php搭配mssql及預儲程序,總是可以把程式寫出來的,不過在後續的執行環境設定上,讓我吃足苦頭,實際上線後,程式常當,為了找原因,讓我頭痛很久。

後來找到一個解決辦法,在iis上設定應用程式集區,一個小時回收記憶體一次,要當就不會超過一個小時了,但終究不是一個好的解決辦法,而且回收記憶體,雖然對php的session不會有影響(php的session存在硬碟上),但asp的session會全部清空,問題是這台機器上有一堆asp寫的程式。

繼續找資料,才知道php雖然是thread safe的程式,但是許多的dll檔卻不是thread safe的程式,所以一旦碰到非thread safe的dll,php就會不穩定,雖然知道原因,但卻不知道是哪個dll是非thread safe的,但是要解決這個問題就必須以fastcgi的方式執行,這樣非thread safe的dll在這樣的環境下執行也不會有問題,只是在fastcgi下,mssql的dll檔根本跑不起來,這真是糟糕,沒辦法連資料庫,程式就沒作用。

最後終於找到原因了,把php模組需求跟中心的同事說後,同事在linux上架完系統後,我的程式一樣不能連mssql,自己找了php manual後才發現原來win上的ntwdblib.dll檔是非thread safe的,不穩定的原凶就是它了,把php連接mssql的底層函式庫改成dblib就一切正常,找到原因後,心頭真是舒服,不過就要麻煩同事架linux系統了,這樣跑起來才會穩定,也不用再頭痛了。

許多的事情順其自然是比較不會遇到這麼多的曲折,像這次以php搭配mssql就不是一個自然的搭配,開放原始碼搭配商業軟體,許多的問題,開放原始碼社群及微軟這家公司是沒有多餘的心力解決的,到時候就只能自求多福了,以最自然的方式進行,問題還是會比較少,因為這些問題都有人幫你解決了,只要專心寫程式就可以了,不用跟這些環境設定奮戰。

沒有留言: