搜索
熱搜: 活動 交友 discuz
查看: 2020|回復: 0
打印 上一主題 下一主題

如何在Linux系統下安裝及使用Apache+PHP+DBMaker

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-9-6 14:46:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式


技術專區 - 如何在Linux系統下安裝及使用Apache+PHP+DBMaker
DBMaker在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手冊,若有任何疑義,亦可上網詢問。

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2024-4-29 16:39 , Processed in 0.107950 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表