本文為筆者以前的記錄,雖然是Mac OS X 10.9的版本,但是應該也是能在10.10上完美成功
最近要做圖書館查詢服務的轉換php,上次寫Oracle中間層的時候因為沒有oci8模塊和oracle實例,所以手工寫代碼沒有調試,這次工作量有些龐大,所以花費了一些時間來安裝oci8模塊,方便php調試工作。
php是通過動態加載動態鏈接庫來使用各個php擴展的。無論是mysql還是gd圖形庫,都是以動態鏈接庫的形式發布的。我首先baidu了一下,Mac用戶想要使用oracle的人真不少,但是大多數給出的方案都是重新編譯php。很多人甚至不用Mac自帶的apache2和php,直接自己編譯apache和php,我個人是不贊同這樣做的。既然他已經給你做好了php和apache,那這個基本上是最不會出問題的。所以我也就沒有采用,准備選擇編譯成.so的形式來加載。
但是翻看了一個多小時,幾乎沒有編譯so模塊的文章,即使有編譯的文章也都是靠macport,brew等第三方軟件包下載zlib等各種庫文件來編譯,個人精神潔癖問題 ,這種方式也不在選擇之列。
既然網上沒有,那我就去看一下php和oracle的官方文檔。但是oracle那裡寫的很啰嗦,居然還要安裝oracle11g,php那裡倒是找到了一篇關於動態鏈接庫模塊編譯的東西。
有三種方法
啰哩啰唆的說了一堆,其實就是具體編譯oci8.so然後在php.ini中加載。
上google搜索了一下有這麼一個外國網站倒是有了一篇關於編譯oci8的文章
OCI8 relies on OS X having several client libraries and tools from
Oracle installed on OS X. For most intents and purposes download the
64-bit version of the following files under the title "Version
10.2.0.4 (64-bit)":
instantclient-basic-10.2.0.4.0-macosx-x64.zip
instantclient-sqlplus-10.2.0.4.0-macosx-x64.zip
instantclient-sdk-10.2.0.4.0-macosx-x64.zip
其實就是要下載Oracle官方的instantclient,根據basic中的dylib文件和sdk中的頭文件來編譯,至於第二個sqlplus則是可有可無的東西,用來獨立連接oracle數據庫,官方下載地址 我當然不可能去下載10g的客戶端,直接下載了11g的instantclient。 下載完成以後解壓所有文件到一個文件夾instantclient_11_2裡面,目錄如下:
下面打開終端,復制必要的文件到系統目錄下。
sudo cp instantclient_11_2/sdk/include/*.h /usr/include(這個/usr/include文件夾是Xcode安裝命令行工具以後有的)
sudo cp instantclient_11_2/sqlplus /usr/bin(這個其實就是安裝sqlplus客戶端,其實不弄也可以的)
sudo cp instantclient_11_2/*.dylib /usr/lib
sudo cp instantclient_11_2/*.dylib.* /usr/lib(這其實就是復制lib動態鏈接庫)
# 下面到/usr/lib目錄做個符號鏈接
sudo ln -s libclntsh.dylib.10.1 libclntsh.dylib
接下來下載編譯oci8,其實這個可以用pecl來自動化完成。但是你必須安裝好autoconf和Xcode命令行工具,autoconf我是直接編譯安裝的,這個百度搜索一下就行了,Xcode命令行工具本來我安裝的,結果10.8-10.9的時候被升級干掉了,所以只能再安裝一遍,我是後來編譯出錯,查看信息,發現是缺少頭文件,當時很納悶,都放到/usr/include了怎麼還缺少,原來是命令行工具的include文件夾被干掉了。只能再重新安裝。
用pecl很自動化的
sudo pecl install oci8
然後出現提示:
Please provide the path to the ORACLE_HOME directory.
Use'instantclient,/path/to/instant/client/lib'
if you're compiling with Oracle Instant Client [autodetect] :
這是要你提供instantclient動態鏈接庫的目錄的意思
直接輸入instantclient,/usr/lib然後就編譯好了oci8.so
如果沒有pecl,那手動下載oci8的源代碼:
php_oci8-1.3.4.tgz
解壓zip文件進入目錄
phpize
./configure --with-oci8=shared,instantclient,/usr/lib 看到這裡大家都明白了,其實就是和pecl一樣,要你提供lib文件的目錄位置
make
make install
然後打開/etc/php.ini
在extension的段落加上extension=oci8.so
就行了,重啟apache使用phpinfo函數就能看到oci8被成功加載了。