【ubuntu14.04】搭建PHP5+Apache2+Oracle環境,ubuntu14.04php5
RT
最近開發的一個項目,資料庫使用oracle。oracle本身支援Red Hat,對ubuntu的支援並不好,如果ubuntu需要安裝oracle,系統本身需要做偽裝等很多工作,所以我只打算使用遠程伺服器上的oracle資料庫。
本地環境:
Linux xxx-ThinkPad-T400 3.13.0-46-generic #75-Ubuntu SMP Tue Feb 10 15:24:04 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
PHP版本:5.5.9-1ubuntu4.6
PHP安裝時不會內建oracle資料庫管理擴充,我們需要自行下載並且編譯安裝和配置。
這裡我主要參考以下這篇文章:
https://help.ubuntu.com/community/PHPOracle
http://blog.sina.com.cn/s/blog_8f4fbe030100y5q3.html
網上有很多的相關教程,主要分為兩類,但是主要思路都如下:
1.從oracle官網下載instantclient basic和instantclient sdk安裝包;
2.解壓,建立庫檔案軟連結;
3.下載並編譯php oci8.so
4.配置PHP
差別在於,有的是直接下載php oci8.so檔案,解壓同時手動進行編譯,或者如我上面參考的教程所教,直接使用pear命令下載並自動編譯。
重點在於,在按照教程操作的過程中會出現諸多意料不到的問題,接下來我先按照我成功配置的過程寫出教程,然後再解釋我遇到的問題以及解決方案:
1.解決依賴問題:
sudo apt-get updatesudo apt-get upgrade
sudo apt-get install php5-dev build-essential php-pear libaio1
sudo apt-get install unzip make
2.從oracle官網下載Instant Client
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
根據自己的系統進入相應的列表,分別下載對應的instantclient-basic-xxx.zip和 instantclient-sdk-xxx.zip。
3.解壓,建立庫檔案軟連結;
這一步的處理非常重要,如果處理不當,將會導致下面的編譯步驟無法通過。
3.1解壓檔案,並將兩個檔案夾去掉版本號碼。也即instantclient和sdk,然後,將sdk檔案夾整個移動到instantclient目錄下,和其他的庫檔案並存。網上的其他教程大多沒有說明這兩個檔案夾的存放關係,或者是直接將其放在同一級目錄下,導致後面編譯過程中總是提示無法找到sdk。這裡我們一定要把sdk檔案夾移動到instantclient目錄下。不能參照網上其他的教程。
3.2建立庫檔案軟連結,進入instantclient目錄下,在該目錄下建立檔案軟連結(其他教程多不說明連結檔案的存放位置)。注意,這裡不可直接通過右鍵來產生庫檔案的連結:
ln -s libnnz12(version number).so libnnz.so
如上,去掉原來庫檔案中的版本資訊,產生沒有版本資訊的擴充庫檔案連結;
同時,我們需要產生
ln -s libclntsh.so.12.1 libclntsh.so
ln –s libocci.so.12.1 libocci.so
完成了這一步之後,我們就可以將oracle的instantclient檔案夾整個移動到我們預先安排好的位置,推薦的位置是:
/usr/local/lib/
整個目錄複寫完成後,對該目錄進行提權:
sudo chmod 777 -R /usr/local/lib/instantclient/
然後配置我們接下來可能需要的一些系統常量,:
sudo vim /etc/environment
在檔案的末尾加上如下常量:
# Oracle Instant ClientLD_LIBRARY_PATH="/usr/local/lib/instantclient"TNS_ADMIN="/usr/local/lib/instantclient"ORACLE_BASE="/usr/local/lib/instantclient"ORACLE_HOME=$ORACLE_BASE
4.下載並編譯oci8.so
sudo pecl install oci8
然後接下來會自動下載oci8的源碼包並自動進行編譯,然後會在過程中提示你輸入instantclient的相關路徑變數:輸入
instantclient,/usr/local/lib/instantclient
然後系統編譯完成後會提示:
Build process completed successfullyInstalling '/usr/lib/php5/20121212/oci8.so'install ok: channel://pecl.php.net/oci8-2.0.8configuration option "php_ini" is not set to php.ini locationYou should add "extension=oci8.so" to php.ini
如果沒有類似的提示,那麼恭喜你,一定是這個過程出錯了。我們先假設到此為止一直都是順利的。到現在我們成功地編譯了oci8.so這個擴充。接下來就是將其分配到使用環境中去了。
5.配置PHP
我們可以在php.ini中直接開啟extension,但是現在PHP不推薦如此操作,所以我們這樣子操作:由於我的伺服器是ubuntu+apache,所以操作方法如下:
在/etc/php5/apache2/conf.d中建立oci8.ini這個檔案,apache2/conf.d這個目錄下,會發現所有的外掛程式前面都有數字,這裡我們不用管,直接忽略:
sudo vim /etc/php5/apache2/conf.d/oci8.ini
然後在檔案中添加開啟oci8.so這個語句,
extension=oci8.so
然後重啟apache
sudo /etc/init.d/apache2 restart
重啟完成後,在伺服器根目錄裡建立一個test.php檔案,並寫入:
<?php phpinfo() ?>
查看在PHP頁面中是否有出現類似下面的內容:
OCI8
OCI8 Support |
enabled |
OCI8 DTrace Support |
disabled |
OCI8 Version |
2.0.8 |
Revision |
$Id: f04114d4d67cffea4cdc2ed3b7f0229c2caa5016 $ |
Oracle Run-time Client Library Version |
12.1.0.2.0 |
Oracle Compile-time Instant Client Version |
12.1 |
如果列印出了如下資訊,則表示我們的配置到此已經成功。
下面是debug環節:
1.編譯過程出現:
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
通過如下文章進行解決:
http://blog.slogra.com/post-421.html
2.編譯過程出現庫檔案無法找到: configure: error: Oracle Instant Client libraries libnnz.so and libclntsh.so not found 檢查你在建立軟連結的時候是否是通過命令列建立的
3.checking Oracle Instant Client SDK header directory... configure: error: Oracle Instant Client SDK header files not found 你的sdk檔案夾是否位於instantclient目錄下。
4.ERROR: `/tmp/pear/temp/oci8/configure --with-oci8=instantclient,/usr/local/lib/instantclient' failed --with-oci8後面的所跟的路徑是否正確,應該是我們最後複製到的目錄下。
如果遇到其他的問題,歡迎留下評論一起交流。