Linux下PHP支持oracle,安装oracle instant client,pdo_oci笔记
安装篇
首先,PHP支持oracle我首先想到的是pdo相关驱动,看了一下还真有,叫做pdo_oci。
但还依赖 oracle instant client ,这个要到oracle官网下载:
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html
选择对应系统的版本,点击进去,这里我的是64位linux,所以选择 Instant Client for Linux x86-64 ,之后会让你同意一个协议,叫做 Accept License Agreement ,勾选后就可以下载了。
值得一提的是,如果要通过wget方式下载,你需要注册一个oracle账号并登陆,然后先在自己电脑上点击下载,得到一个实际url(包含一个token),复制这个url去服务器上wget,直接wget网页里的url是下不了的,切记。
需要下载两个包:
oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
版本号可能不一样,看下关键词:basic 和 devel即可。
这两个包下载到服务器上,分别安装:rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
因为是64位系统,为了防止编译php扩展出问题,将刚刚安装好的两个目录做个软连接ln -s /usr/lib/oracle/12.1/client64 /usr/lib/oracle/12.1/client
ln -s /usr/include/oracle/12.1/client64 /usr/include/oracle/12.1/client
ok,下一步就开始安装 pdo_oci扩展。
首先你应该有一份php源码,如果没有,请到官网下载一份对应版本的。
假设我的源码在 /home/src/php56cd /home/src/php56
cd ext/pdo_oci
phpize #注释:如果没有这个命令你需要找到php安装目录的bin/,如/usr/local/php/bin/phpize./configure --with-pdo-oci=instantclient,/usr,12.1 --with-php-config=/usr/bin/php-config#注:12.1需要对应上面安装的oracle instant的版本号,和oracle/12.1的数字一样,--with-php-config是和phpize同理,在php安装目录里的bin目录下,这两个要改成自己实际情况的。make && make install
如果顺利的话,编译成功后,修改 php.ini ,在文件末尾空两行,加上extension=pdo_oci.so;
好了,通过php -m
命令看一下有没有PDO_OCI这一行,有的话就是ok了。
web服务记得要重启apache或php-fpm。
使用篇
使用过程跟pdo差不多,我对oracle还不是很了解,但是也遇到一个故障,那就是无法连接oracle。
一开始通过下面的方式连接:$pdh = new PDO('oci:dbname=IP地址:端口号/SID',用户名,密码);
报错:SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
后来在statckoverflow上找到答案,改成下面这种连接方式:$tns = "
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 你的IP)(PORT = 端口号))
)
(CONNECT_DATA =
(SID = 你的oracle数据库的SID)
)
)
";$db_username = "youname";$db_password = "yourpassword";try{
$conn = new PDO("oci:dbname=".$tns,$db_username,$db_password);
}catch(PDOException $e){
echo ($e->getMessage());
}
这样就没问题了。