编译PHP OCI8 磨难记

在DELL 的Poweredge 840服务器上安装了RedHat enterprise V3 Linux 操作系统。然后安装Apache 2.0.59和PHP4.4.7,这两个都是最新版的。编译安装Apache、PHP都很顺利,没有出现什么问题,毕竟操刀多次了。连接Oracle数据 库也正常,系统能运行起来。但是运行了一段时间后,发现系统不太稳定,用着用着,就会发现点击某个web画面时,是个空白页,无法打开该画面,等一会儿再 打开时又能正常打开了,没有规律性。

经过多天的不断排查,发现Apache的error_logs记录了多个重复出现的Notice错误:
*** glibc detected *** double free or corruption (out): 0×00000000019f4730 ***
*** glibc detected *** double free or corruption (!prev): 0×0000000001111d90 ***
*** glibc detected *** corrupted double-linked list: 0×0000000001111d50 ***

*** glibc detected *** free(): invalid next size (fast): 0×0969ef30 ***
[Mon May 08 09:41:51 2006] [notice] child pid 3065 exit signal Aborted (6)
[Mon May 08 09:48:58 2006] [notice] child pid 4747 exit signal Segmentation fault (11)

由于服务器CPU是Intel Xeon 3070 (3000系列)双核64位的,而PHP是32位的程序,而Oracle10也是64位的,所以怀疑是PHP OCI8库的问题,与oracle 10g的接口有问题。而PHP源代码包里带的OCI8库比较旧,需要下载最新的OCI8源代码。

所需要用到的源代码列表如下:
autoconf-2.13.tar.gz   http://www.gnu.org/software/autoconf/
oci8-1.2.3.tgz            http://pecl.php.net/package/oci8/
httpd-2.0.59.tar.gz    http://httpd.apache.org/
php-4.4.7.tar.gz        http://www.php.net/

详细的编译步骤如下:(假定所有程序都在/opt目录下)
(I)先安装autoconf2.13,在后面需要用到,Linux系统本身带的autoconf程序版本比这个新多了,但PHP就认这个,没办法。如果 用系统带的新版本autoconf程序,执行下面的 $./buildconf –force 时,系统会给出很多warning提示,安全起见,还是用重新编译安装这个旧版本的程序。

$tar xvfz autoconf-2.13.tar.gz
$cd autoconf-2.13
$./configure –prefix=/opt/autoconf
$make
$make install
$export PATH=/home/autoconf/bin:$PATH ##这样才能先找到旧的这个程序

(II)编译安装Apache
$tar xfvz httpd-2.0.59.tar.gz
$cd httpd-2.0.59
$./configure –prefix=/opt/apache2 –enable-so
$make
$make install

(III)编译PHP和OCI8
##先解压源代码
$tar xfvz oci8-1.2.3.tgz
$tar xfvz php-4.4.7.tar.gz

##开始编译了
$cd php-4.4.7
$cd ext        ##进入ext扩展库目录
$rm -f oci8    ##将旧的OCI8库删除掉
$mv /opt/oci8-1.2.3 ./oci8   ##将新的OCI8库src移到此ext目录下,并且改名为oci8
$cd ..  ##向上退出到php-4.4.7目录下

##下面这步非常关键哦,必须将PHP旧的configure文件删除掉,才会重新生成,
##当时搞了一个晚上才找到这个关键步骤
$rm configure 

##重新生成configure/configure.in等文件
$./buildconf –force

##编译PHP的选项,可以根据需要自己增减
$./configure –prefix=/opt/php4 /
–with-apxs2=/opt/apache2/bin/apxs /
–with-config-file-path=/opt/apache2/conf /
–with-oci8=$ORACLE_HOME /
–with-gd –enable-ftp –with-zlib /
–enable-mbstring –enable-mbregex –with-gettext –with-gdbm /
–enable-safe-mode –enable-bcmath –enable-calendar /
–enable-ctype –with-ftp –enable-magic-quotes –enable-inline-optimization /
–with-iconv –with-xml –enable-exif

$make
$make install

到此,PHP和OCI8编译安装完成。在编译PHP和OCI8之前,应该将需要用到的Oracle环境变量都配置好,如下:
export ORACLE_BASE=/home/oracle10g
export ORACLE_HOME=$ORACLE_BASE/product/10.1.0/Db_1
export ORACLE_SID=ora10g
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/local/lib
export NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8
export NLS_CHARACTERSET=AL32UTF8

OCI8重新编译后,系统运行很稳定,apache的error_log中再没有出现上面列出来的错误。前后花费了2个白天,一个晚上的时间啊。痛苦死,还好最后圆满搞定,解决问题了。一句话,用革命的浪漫主义精神搞定PHP OCI8的编译!

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值