相关版本信息:

PHP Version 5.6.30

nginx version: nginx/1.10.3

Linux version 2.6.32-358.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013

64位

php连接oracle数据库虽然不是最佳拍档,但组内开发确实有这样需求。如果没有参考合适的文档,这个过程还是挺折磨人的,下面是一个记录,原型是国外的一篇博客 Installing PDO_OCI and OCI8 PHP extensions on CentOS 6.4 64bit

假设你已经安装好php的环境,php版本为5.3,要连接的oracle服务器是 11g R2,操作系统版本CentOS 6.4 x86_64。如果没有安装php,可以通过以下命令安装:

1. 安装InstantClient

instantclient是oracle的连接数据库的简单客户端,不用安装一个500Moracle客户端就可以连接oracle数据库,有windows和linux版本。从 这里 选择需要的版本下载,只需Basic和Devel两个rpm包。

第一个坑:这里下载的话最好是要注册一个oracle官方的账号,下载时提示登录,登录后再下载就可以,因为我之前直接下载了好几次,安装都出错,因为下载的其实是个网页,而不是真正的rpm包。

安装
# rpm -ivh oracle-instantclient11.-basic-11.2.0.4.-.x86_64.rpm
# rpm -ivh oracle-instantclient11.-devel-11.2.0.4.-.x86_64.rpm 软链接
# ln -s /usr/include/oracle/11.2/client64 /usr/include/oracle/11.2/client
# ln -s /usr/lib/oracle/11.2/client64 /usr/lib/oracle/11.2/client

64位系统需要创建32位的软链接,这里可能是一个遗留bug,不然后面编译会出问题。

接下来还要让系统能够找到oracle客户端的库文件,修改LD_LIBRARY_PATH:

# vi /etc/profile.d/oracle.sh
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

执行 source /etc/profile.d/oracle.sh 使环境变量生效。

2. 安装PDO_OCI

这里我并没有安装这个扩展,我只安装了oci8,直接看第三步(by:sunfei)

在连接互联网的情况下,通过pecl在线安装php的扩展非常简单,参考 How to install oracle instantclient and pdo_oci on ubuntu machine 。

从 https://pecl.php.net/package/PDO_OCI 下载 PDO_OCI-1.0.tgz 源文件。

# wget https://pecl.php.net/get/PDO_OCI-1.0.tgz
# tar -xvf PDO_OCI-1.0.tgz
# cd PDO_OCI-1.0

由于PDO_OCI很久没有更新,所以下面需要编辑 ODI_OCI-1.0 文件夹里的 config.m4 文件来让它支持11g:

# 在第10行左右找到与下面类似的代码,添加这两行:
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then
PDO_OCI_VERSION=11.2 # 在第101行左右添加这几行:
11.2)
PHP_ADD_LIBRARY(clntsh, , PDO_OCI_SHARED_LIBADD)
;;

编译安装pdo_oci扩展:(安装完成后可在 /usr/lib64/php/modules/pdo_oci.so 找到这个模块)

$ phpize
$ ./configure --with-pdo-oci=instantclient,/usr,11.2
$ make
$ sudo make install

在make的时候报错

For Red hat 6, 64bits, client 11.2,
After touch config.m4 and tune up libs symlinks..
I get a compilation error "pdo_oci.c:34: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘pdo_oci_functions’"
To solve it just change function_entry to zend_function_entry @pdo_oci.c file.
 
修改文件pdo_oci.c
34行function_entry 改成 zend_function_entry
 

#这个步骤可以不要

要启用这个扩展,在 /etc/php.d/ 下新建一个 pdo_oci.ini 文件,内容:

extension=pdo_oci.so

直接在php.info 添加

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-/pdo_oci.so

验证安装成功:

# php -i|grep oci
看到类似下面的内容则安装成功:
/etc/php.d/pdo_oci.ini,
PDO drivers => oci, sqlite 或
# php -m

3. 安装OCI8

从 https://pecl.php.net/package/oci8 下载oci8-2.0.8.tgz源文件。

第二个坑:这里要先进入到wphp扩展目录/usr/local/php/include/php/ext,然后下载,解压

# wget https://pecl.php.net/get/oci8-2.0.8.tgz
# tar -xvf oci8-2.0..tgz
# cd oci8-2.0.

编译安装oci8扩展:

# phpize
# ./configure --with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib
# make
# make install

要启用这个扩展,在 /etc/php.d/ 下新建一个 oci8.ini 文件,内容:

第四个坑:上一步的make install完成后,屏幕显示一个路径出来,这个路径就是oci8.so文件的位置,文件有了,然后还得到php.ini中去增加配置,wdcp面板php.ini的路径在/usr/local/php/etc/php.ini,到配置文件的最后,加上一行extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/oci8.so

,我是加到了zend相关配置的前面,因为有人说加到最后不行,你可以自己试试。

extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-/oci8.so

然后重启nginx,到此为止,你基本上就算成功了。

extension=oci8.so

验证安装成功:

# php -i|grep oci8

oci8
  oci8.connection_class => no value => no value
  oci8.default_prefetch => 100 => 100
  oci8.events => Off => Off
  oci8.max_persistent => -1 => -1
  oci8.old_oci_close_semantics => Off => Off
  oci8.persistent_timeout => -1 => -1
  oci8.ping_interval => 60 => 60
  oci8.privileged_connect => Off => Off
  oci8.statement_cache_size => 20 => 20

最后别忘了重启逆web服务器如nginx,可以通过phpinfo()来确保扩展是否成功安装。

4. 测试连接

在你web服务器如apache的php目录下创建 testoci.php :

第五个坑:下面这段代码里,显示$item的部分,不知道为什么要用htmlentities函数去处理一下,我第一次没有发现,后来发现中文乱码的时候,才上网查询,最后把这个函数去掉了,直接显示$item,另外还要在oci_connect参数里加上编码参数ZHS16GBK(如果不行换编码,百度,我就不写了)。

<?php

$conn = oci_connect('username', 'password', '172.29.88.178/DBTEST');

$stid = oci_parse($conn, 'select table_name from user_tables');
oci_execute($stid); echo "<table>\n";
while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>".($item !== null ? htmlentities($item, ENT_QUOTES) : " ")."</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n"; ?>

访问这个页面就应该可以得到结果了。

终极大坑:你可能执行上面的页面后发现没有任何东西显示,你可以在连接完的那一行后面显示一下oci的错误信息,具体用oci_error(),发现ora-24408 could not generate unique server group name是这个错误,百度了很久,找到了解决方法,/etc/sysconfig/network这里要配置HOSTNAME=主机名(主机名是自己起的名字),同时要在/etc/hosts里随后添加(127.0.0.1 localhost的后面,加个空格然后添加)主机名,然后重启网络service network restart,再去跑上面的测试文件,就OK了。

总算是解决问题了,可能你在实际过程中又会遇到其他问题,还是不成功,我只能说,慢慢来,总会解决的,记得解决后把经验发上来,以供新(cai)手(niao)学习。

linux系统下php通过php_oci8扩展连接oracle数据库 Nginx的更多相关文章

  1. 在Linux系统下安装大于mysql5.5版本的数据库

    linux下mysql 5.5的安装方法: 1.安装所需要系统库相关库文件      gcc等开发包,在安装linux系统的时候安装. 2.创建mysql安装目录 # mkdir -p /usr/lo ...

  2. 64 位win 7或windows 8下的visual studio不能连接Oracle数据库调试网站的问题

    在64 位win 7或windows 8系统下,visual studio直接F5运行网站调试,你会发现不能连接Oracle数据库,会报一个“ORA-06413: Connection not ope ...

  3. linux系统下php安装mbstring扩展的二种方法

    .执行 复制代码代码如下: yum install php-mbstring 2. 修改php.ini (这一步非常重要, 部分lxadmin版本无法自动修改) 复制代码代码如下: echo ‘ext ...

  4. PLSQL Develope连接oracle数据库配置

    首先我们在讲PLSQL Develope连接oracle数据库配置之前,先讲下如果不用PLSQL Develope连接oracle数据库,那该怎么办,那就是在本机安装oracle数据库,不过这个对于配 ...

  5. 【转载】Linux系统下命令行连接蓝牙设备 查看查找 蓝牙

    Linux系统下命令行连接蓝牙设备 2018年11月26日 10:47:27 Zz笑对一切 阅读数:741   1.打开系统蓝牙 sudo service bluetooth start 1 进入bl ...

  6. Linux系统下连接校园网Drcom客户端教程(广东工业大学)

    这篇教程写给想要学习Linux系统或者在Linux系统下有需要使用Drcom上网的同学,在我疯狂踩坑,经过n多次的刷机装机实验,体验不同发行版本的linux系统后,终于懂得怎么连接上drcom,想想连 ...

  7. 虚拟机中ubuntu-16.04 Linux系统下配置mysql数据库,并在windows下使用navicat远程连接

    Linux系统下mysql数据库安装配置步骤: 1.在服务器上安装mysql:sudo apt-get install mysql-server sudo apt-get install mysql- ...

  8. linux系统下,11款常见远程桌面控制软件

    linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的 ...

  9. 解决Linux系统下Mysql数据库中文显示成问号的问题

    当我们将开发好的javaWEB项目部署到linux系统上,操作数据库的时候,会出现中文乱码问题,比如做插入操作,发现添加到数据库的数据中文出现论码,下面就将解决linux下mysql中文乱码问题! 打 ...

随机推荐

  1. idea中连接oracle数据库打包

    问题:在使用idea连接oracle数据时发现oracle.jdbc.OracleDriver引用这个包报错,找不到包.解决方法:在idea的terminal命令框中输入如下命令.我的jar包的位置在 ...

  2. SQLServer 常见SQL函数

    SQL Server SQL函数 by:授客 QQ:1033553122 字符函数 日期函数 数学函数 系统函数

  3. VS2010部署相关

    找到一篇写得最负责的.贴住收藏了: http://blog.csdn.net/xhf55555/article/details/7702212. 之前在其它地方找的都缺胳膊少腿,真不知他们自己怎么实现 ...

  4. AOP编程 - 淘宝京东网络处理

    现象描述 当我们打开京东 app 进入首页,如果当前是没有网络的状态,里面的按钮点击是没有反应的.只有当我们打开网络的情况下,点击按钮才能跳转页面,按照我们一般人写代码的逻辑应该是这个样子: /** ...

  5. Java标识符

    相关内容: JAVA标识符: 定义 组成规则 常见的命名规则 包 类和接口 方法.变量 常量 首发时间:2017-06-22 20:40 修改时间: 2018-03-16 14:01 :修改了标题,修 ...

  6. Knockout学习,添加模板,事件,Mouseover,mouseout

    <div class="rtitle">我的收藏</div> <div class="list_ul" data-bind=&qu ...

  7. nopcommerce

    nopcommerce是国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基 ...

  8. [SQLSERVER] 把TransactionLog截断

    注意:以下语句非常危险 --BACKUP LOG MyDb TO DISK=’NUL:’

  9. 购物商城学习--第二讲(maven工程介绍)

    接下来第二讲介绍整体工程如何使用maven搭建的. 使用maven管理工程的好处: jar包的管理: 工程之间的依赖管理: 自动打包 maven常见打包方式:jar.war和pom三种.jar工程,是 ...

  10. Lorem 占位符

    Web开发者通常用lorem ipsum text来做占位符,占位符就是占着位置的一些文字,没有实际意义. 为什么叫lorem ipsum text呢? 是因为lorem ipsum是古罗马西塞罗谚语 ...