本文为笔者以前的记录,虽然是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那里倒是找到了一篇关于动态链接库模块编译的东西。

有三种方法

  1. 重新编译整个php,./configure --with-oci8=shared
  2. 以动态链接库的形式
  3. 以静态链接库的形式

啰哩啰唆的说了一堆,其实就是具体编译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被成功加载了。


山河永寂
2.4k 声望159 粉丝