2008年1月27日 星期日

用PHP串接oracle

用PHP串接oracle

這篇文件是參考自oracle OTN的一份文件rh4_10gr2_php5.txt而來!
原本的文件是在RedHat AS4作業系統上安裝oracle database 10gR2,
再加上apache2和php5。
目的在一部機器上設定出可以跑PHP串oracle資料庫的網站平台。

原本的文件rh4_10gr2_php5.txt中就指出了,這是提供參考用,非正式產品功能之一。
不過既然在官網已經置入了這樣的參考文件,表示oracle是正視這樣的平台建置的。
oracle在10g版本推出時,也推了oracle XE版本,已經表明要和MySQL競爭的意圖出來。
相信以PHP結合oracle XE的網站,應該會在日後逐漸增加才是。

我主要目的在說明在一部CentOS4作業系統上建置httpd2、PHP、oracle 10gR2的步驟。

至於在安裝oracle 10gR2的部份,請自行參考OTN的相關說明,
內容大致和安裝在RedHat AS4相同,
因為CentOS4基本上就是由RedHat AS4的開放源始碼,
再編譯而來的linux版本,所以安裝方式,可以說幾乎完全一致!

我也有一份提到安裝oracle database 10R2在CentOS4的blog文件。連結如下:
http://tw.myblog.yahoo.com/bullock0425

安裝的過程中,請儘可能依照FOA格式定義你安裝的oracle database路徑。

你應該會定義幾個重要的環境變數像這樣:
ORACLE_HOME=/opt/u01/app/oracle/product/10.2.0/db_1;export ORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LC_LIBRARY_PATH; export LD_LIBRARY_PATH

注意!這兩個環境變數將是在安裝PHP5時把oci8函式庫編譯進去的主要關鍵設定值。

現在希望你已經把httpd2和PHP5的source code TARBALL準備好了!
開始囉!請以oracle帳號來執行全部指令動作,因為我們將安裝在$ORACLE_HOME路徑之下。
可以不必用到root權限!

安裝httpd2:
$bzcat httpd-2.0.54.tar.bz2 | tar xf -
$cd httpd-2.0.54
$./configure --prefix=$ORACLE_HOME/apache --enable-so --with-mpm=prefork
$make
$make install


Edit $ORACLE_HOME/apache/conf/httpd.conf and change the port to 8080.
以上一行,是原本文件中的說明,是希望把http的port改成8888,但我改成了8080。
接下來,請照做,以測試你的httpd是否有成功運作。
Start Apache:
$ORACLE_HOME/apache/bin/apachectl start
Start a browser and check that http://localhost:8080
gives the default Apache web page.

Stop Apache:
$ORACLE_HOME/apache/bin/apachectl stop

apache2成功安裝之後,接著我們來安裝PHP5:
$bzcat php-5.0.4.tar.bz2 | tar xf -
$cd php-5.0.4
$./configure --prefix=$ORACLE_HOME/php \
>--with-apxs2=$ORACLE_HOME/apache/bin/apxs \
>--with-config-file-path=$ORACLE_HOME/apache/conf \
>--with-oci8=$ORACLE_HOME --enable-sigchild

$make
$make install
$cp php.ini-recommended $ORACLE_HOME/apache/conf/php.ini

Edit php.in and change display_errors to On:
display_errors = On

Add these lines to the $ORACLE_HOME/apache/conf/httpd.conf file:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Restart Apache:
$ORACLE_HOME/apache/bin/apachectl start

PHP5的部份也幾乎是完全和原來的rh4_10gr2_php5.txt相同。
但是要強調一點是,原來文件中的./configure 中,要設定oci8那一行。

--with-oci8-instant-client=$HOME/instantclient_10_2 \
我一直編譯不過去,有錯誤指出......

Notice: Following unknown configure options were used:

--with-oci8-instant-client=/opt/u01/app/oracle/product/10.2.0/db_1/install_10_2

Check './configure --help' for available options

後來我用./configure --help | grep oci8
找出原來要用 --with-oci8=$ORACLE_HOME 就可以了!

把PHP5安裝好之後,用老方法測試。


造一個使用phpinfo()的網頁。

Create a file $ORACLE_HOME/apache/htdocs/phpinfo.php containing:
<?php phpinfo(); ?>

Load this file in a browser:

http://localhost:8080/phpinfo.php
在這個phpinfo.php網頁中,你應該要能看到一些有關oci8的資訊欄位。
如果有看到,那表示你在編譯安裝PHP5時,
也把串接oracle database 10gR2要用得到的oci8函式庫也編譯進去了。
不過為了證明oci8函式庫能用,原本的rh4_10gr2_php5.txt作者寫了一個測試程式碼。
讓我們試試!

Create a file $ORACLE_HOME/apache/htdocs/test.php containing:

<?PHP

$conn = OCILogon("scott", "tiger", "//localhost/orcl");
if (!$conn) exit;
echo OCIServerVersion($conn) ."\n";
print date('Y-m-d H:i:s')."\n";

$query = 'SELECT * FROM EMP';

$stid = OCIParse($conn, $query);
OCIExecute($stid, OCI_DEFAULT);

print '';
while ($succ = OCIFetchInto($stid, $row, OCI_RETURN_NULLS)) {
print '';
foreach ($row as $item) print '';
print '';
}

print '<table border="1"><tbody><tr><td>'.($item?htmlentities($item):' ').'</td></tr></tbody></table>';

OCILogoff($conn);
?>

因為測試網頁用到scott帳號,如果安裝oracle database 10gR2時忘了解除它的鎖定,
可以參考以下做法:

$sqlplus / as sysdba
SQL> alter user scott account unlock identified by tiger;
SQL> exit

我其它的oracle相關文件! 這裡...

沒有留言:

搜尋此網誌

本站大事記

這個部落格(網站)內容以分享LINUX和延伸出的技術文章為主!
特別是為了工作和進修需要,搜集了不少網站連結。
希望對來這裡觀文的朋友們,有提供一些有用的資訊或文章。
但這裡的文章中,也包含個人的心情扎記和隨興言談……
若是當中沒有對上你的口味,請多包涵!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!

原「琳娜絲與希斯寇的邂逅」,改名為「愛上琳娜絲」!
--原序文--
就是當LINUX遇上CISCO啦!他們的結合還能作什麼事…不就是讓這個世界的網路,串…串起來啊…不然你們那能上這網站看部落格!