|
技術專區 - 如何在Linux系統下安裝及使用Apache+PHP+DBMakerDBMaker在Linux平台上,有相當優越的工作效能,而使用DBMaker亦是Web上極佳的解決方案,由於Linux本身的穩定度,加上DBMaker的高速率及強大功能,無論是用在AP或是Web上,都是很好的選擇。目前網站雖然已經有安裝相關的文章,但有些檔案使用較舊的版本,建置程序及命令也已經改變,為了讓使用者能順利安裝PHP+DBMaker,本文將會就觀念上及實作上的來解釋,此處所使用的是php-4.0.6及DBMaker 3.7,Apache為1.3.12,希望藉由本文,能讓使用者順利安裝完成,並領略DBMaker強大的功能。
1. 先確認Apache已正確安裝完成 目前幾乎所有的Distribution預設都已安裝好Apache,您可到/etc/rc.d/init.d/底下,去看看有沒有叫httpd或apachectl的檔名,若有的話,應該就已安裝好。若無的話,請去Apache官方網站上download,重新build或使用rpm安裝,在此僅作簡略說明,若是第一次安裝,請注意,在安裝Apache時,請使用外掛模組(module)的方式來安裝,而不要build成內部模組,這兩者的差別,稍後會作說明。 重新build一版可執行PHP的Apache執行程式,實在是一件蠻累的事情,所以一般說來,都會使用load module的方式,來啟動Apache相關的模組,現在的套件中,很容易可以找到build成module模式的rpm,所以若是懶得重build apache的話,就用rpm來安裝apache吧。 (1) Build Apache成外掛模組(module)的方法 1. tar zxvf apache_1.3.12.tar.gz 2. cd ../apache_1.3.12 3. ./configure --prefix=/usr/local/httpd --enable-module=so 4. make ; make install (2) Apache的內建模組及外掛模組: 所謂的外掛模組,就是這些模組與Apache較為獨立,可以在想要使用時,再把它掛載上來;而內建模組,則是說build出來的命令中,本身已經含有了處理PHP的程式碼。理論上來說,外掛模組有彈性而效能較差,內建模組較無彈性而效能好。 接下來,請您找到[apache_home]/conf/httpd.conf,將其開啟,其中有以下幾行: LoadModule php_module modules/mod_php.so LoadModule php3_module modules/libphp3.so LoadModule php4_module modules/libphp4.so 由於我們要裝的是php-4.0.6,所以我們的終極目標,就是要建立一個可外掛到Apache的libphp4.so。(不要被那個IfDefine弄混淆,其實,只要有libphp4.so,HAVE_PHP就會自動設成True,通常會由/etc/rc.d/init.d/httpd這個script來作判斷。)
2. 安裝並建立PHP (1) 安裝並解壓縮php source 現在先將下載到的php-4.0.6放到適當的目錄下,在我的例子中,我將它放在/usr/local底下,並將其解壓縮到php-4.0.6的目錄。 [root@cmsupport local]# ls bin dbmaker doc etc games info lib man php-4.0.6.tar.gz sbin src [root@cmsupport local]# tar zxvof php-4.0.6.tar.gz [解縮過程] ……. php-4.0.6/acconfig.h php-4.0.6/generated_lists php-4.0.6/mkinstalldirs php-4.0.6/install-sh php-4.0.6/aclocal.m4 [root@cmsupport local]# (2) Configure:設定組態 現在切換到剛建好的php-4.0.6目錄,準備開始build出libphp4.so,在build之前,要先找到apache的執行檔apxs,及dbmaker的目錄,然後依照下列步驟,進行安裝: [root@cmsupport local]# cd php-4.0.6 [root@cmsupport php-4.0.6]# ./configure --with-dbmaker=/home/dbmaker/3.7 \ > --with-apxs=/usr/sbin/apxs --enable-track-vars (其中—with-dbmaker必須指明dbmaker的目錄,apxs則是Apache執行檔所在目錄及檔名) 這個動作,其一是要連結到dbmaker/3.7/lib/libdmapic.a,這樣一來,所建成的php的odbc_driver就會含有dbmaker的driver code;其二,則是讓php知道apxs的組態。 (3) 檢查組態設定正確否 在configure的過程中,會出現一段訊息: …… checking for OpenLink ODBC support... no checking for DBMaker support... yes (static) yes …… 或者亦可查configure.log,會有一段: configure:33215: checking for DBMaker support 若有出現這些訊息的話,那麼php在組態時,已經正確將DBMaker含括在內了。 (4) 建立libphp4.so 接下來進行make的動作,如下: [root@cmsupport php-4.0.6]# make ; make install 當執行完成後,php會產生一個liphp4.so,並將它放置在/usr/lib/apache/libphp4.so上,實際位置,會因各apache建置時的組態,而有所不同。讀者可自行去找找看。接著,上述命令也會去修改httpd.conf,檢查httpd.conf的內容,這樣的建構方式,應該會產生以下幾行: LoadModule php4_module [某個lib位置] /libphp4.so AddModule mod_php.c AddType application/x-httpd-php .php .php3 .php4 AddType application/x-httpd-php-source .phps 這四行中,第一行表示要load外掛的一個模組,稱作php4_module,位置放在其後的目錄。第三行、第四行,則是讓apache知道,以後看到.php、.php3或.php4副檔名的網頁時,便是屬於application/x-httpd-php型態,由於已經load module了,所以會載入libphp4.so再去執行網頁,而產生動態網頁。比較奇怪的是第二行,事實上並不存在mod_php.c這個檔案,但是有的apache設定,一定要先有第二行,第三、四行才會生效(使用IfModule mod_php.c將三、四行包住),所以看起來,還是加上去保險一點。 (5) 複製php.ini 接下來,再把php.ini-dist複製到/usr/local/lib底下,更名叫php.ini cp php.ini-dist /usr/local/lib/php.ini (6) 測試php程式 這麼一來,php應該已經可以執行了,請到你的網頁根目錄底下,撰寫一個 phptest.php,內容為: phpinfo(); ?> 然後重新啟動你的web,再用browser來瀏覽這個網頁,如下: [root@cmsupport conf]# /etc/rc.d/init.d/httpd restart
當你執行這個程式時,可以觀察到當初configure時的設定值。 最好將php的source及這次組態(configure)的參數保留下來,以後當需要擴增其他功能時,就可用來參考。
3. 使用php的odbc命令 根據前兩節建成的php程式,基本上已經可以連接到dbmaker了,請先參考dbmaker管理員手冊,建立一個可用的資料庫,並確定db server正在執行。除此之外,常會發生的一個錯誤,就是需要把/home/dbmaker及/home/dbmaker/data兩個目錄的權限開放成可讀,否則的話,網頁上可能會出現「can not find specific section in configuration file」的錯誤訊息。 接下來,我們來看看php提供的函數及注意事項: (1) int odbc_connect(string dsn、string user、string password、int [cursor_type]) 這是用來連接資料庫之用,第一個參數為資料庫名稱,第二參數為登入的使用者姓名,第三個參數則是密碼,第四個參數為連接時使用的cursor type,一般多不用設定;在撰寫程式時,常是將這三個參數另寫成一個檔案,如:profile.php,然後在要使用的地方,將這個檔案include進來。 若是連接成功,函數會傳回connection id,若是失敗,則傳回0。 (2) int odbc_pconnect(string dsn、string user、string password、int [cursor_type]) 這與前面的odbc_connect幾乎一樣,唯一差別是在,若使用JDBA來觀察你的php程式,會發現到使用odbc_connect函數的網頁,幾乎是連上資料庫後,在網頁結束時,connection也同時斷了。有時速度太快,在JDBA上也許會看不到任何的連接。 而odbc_pconnect則有所不同,當網頁結束時,用JDBA觀察,會發現connection仍然存續,根據php的手冊,下次當使用相同的User 及 Password時,它會直接使用還存續的connection。 這聽起來似乎挺不錯的,但事實上情形遠比上述複雜。例如:從Client A上來的request,當他建立並繼續使用一個connection可能問題還不大,若是另一個從Client B上來的request,它就無法重覆使用A的connection。因為這兩個request屬於不同的process,基本上A的connection是無法讓B使用的。再加上httpd本身有自己的存續時間,當它被消滅時,附著於上的connection也應一併消失。種種情形,使得pconnect可能不單沒有帶來好處,user反而會發現connection無端的在一直增加,還不如使用connect方便,目前已經看到有人使用connection pool的方式,由connection pool中選定一connection給CGI性質的程式使用,但這樣的solution是用JSP作的,筆者相信PHP中應該也有類似的程式已開發出來,進一步資訊,請參考PHP的相關網站。 (3) int odbc_exec(int connection_id、string query_string) 使用這個函數來執行SQL指令;成功傳回result set id,失敗傳回false。 (4) int odbc_fetch_row(int result_id、int [row_number]) 這個函數可用來移動游標,第一個參數是result id,第二個參數則是游標位置;Result Set是放在Server端,這個函數則是可移動指向Result Set的游標位置,再使用odbc_result將結果抓回來。許多人在使用這個函數時,常忽略了第二個參數,其實可使用這個參數來作到許多網頁中「換頁」的功能。 (5) string odbc_result(int result_id、mixed field) 這個函數則是實際將結果取出,第二個參數可以是欄位序數,也可以使用欄位名稱代替。 (6) void odbc_close(int connection_id); 將connection關閉,若是在網頁中使用odbc_connect,這個動作其實可省略,因為網頁結束時,connection就自動斷了,除非使用了odbc_pconnect指令。 (7) 自定特別功能 說實話,php的odbc功能,與它連接其他資料庫的函數,還是短缺了點,因此有的人會自行撰寫特別函數,來填滿這些缺口,例如:在sybase及mysql中都有fetch_array,但odbc函數並沒有這樣的函數,有的人便自行撰寫如下的函數: function odbc_fetch_array($res) { $row = array(); $result = array(); if ($result = odbc_fetch_row($res)) { $nf = odbc_num_fields($res)+1; for($count=1; $count $field_name = odbc_field_name($res、$count); $field_value = odbc_result($res、$count); $row[$count] = $field_value; } return $row; } 另外, odbc_num_rows函數,在php的手冊中,曾提及有許多驅動程式在SELECT命令後,呼叫這個函數會丟回-1的值;DBMaker便是如此,因此,在程式中,當要使用這個函數時,可能也得自己改寫相關的函數。 (8) 實戰練習 $conn=ODBC_connect("PHPTEST","SYSADM",""); if (!$conn) { echo "Connected Failed"; exit; } $rs=ODBC_EXEC($conn,"Select * from TestSample"); echo 「」; while (odbc_fetch_row($rs)) { echo 「」; for ($i=0;$i echo 「」; odbc_result($rs,$i); echo 「」; } echo 「」; } ?> 本文並不打算對odbc的各項功能作太細部的說明,只是作最基本的介紹,及使用者可能會遇到的疑問,重點還是放在php的建置部份;相關函數的詳細使用方式,請參考php手冊,若有任何疑義,亦可上網詢問。
|
|