目的:PHP在php-5.2.0的版本以后就将informix的扩展从源代码里删除掉,而改用pdo_informix的方式连接。而使用PDO_INFORMIX连接存在这样或者那样的问题,同时若是以前使用php informix扩展连接方式的程序需要重写构造。本文介绍的是使用nginx + php-fpm结合php-5.2.0中的informix扩展重新实现php 直连informix。
环境:rhel5.5 64bit
相关软件包(置于nginx家目录的soft目录下):
nginx-0.8.54.tar.gz
php-5.2.8.tar.gz
php-5.2.8-fpm-0.5.10.diff.gz
php-5.2.0.tar.gz (仅需要php-5.2.0/ext/informix目录。打包附上)
pcre-devel-6.6-2.el5_1.7.rpm (安装nginx的依赖包)
autoconf-2.13.tar.gz (autoconf 2.13,这个可能需要,重新生成configure)
本文使用用户nginx来安装软件(rpm的需要使用root用户rpm安装),用户informix用于安装informix csdk。
建立用户nginx,并设置密码
root# useradd -d /home/nginx -m -s /bin/bash nginx
root# groupadd informix
root# useradd -g informix -d /opt/informix -m -s /bin/bash informix
1.informix csdk的安装
csdk安装于/opt/informix目录下(示例中使用此目录),安装过程略。
2.php-fpm的安装.
在soft目录下
nginx% tar -xzvf php-5.2.8.tar.gz (解压包php-5.2.8,将生成目录php-5.2.8)
nginx% gunzip php-5.2.8-fpm-0.5.10.diff.gz (解压包php-5.2.8-fpm-0.5.10.diff)
在php-5.2.8/ext 目录下解开php_informix.zip 生成目录informix
nginx% unzip php_informix.zip
在soft目录下为php-5.2.8加上fpm
nginx% patch -d php-5.2.8 -p1 < php-5.2.8-fpm-0.5.10.diff (给php-5.2.8的源码打上fpm补丁)
在php-5.2.8目录下重建configure
nginx% ./buildconf --force
这里需要注意:可能出现类似以下
buildconf: checking installation...
buildconf: autoconf version 2.59 (ok)
buildconf: Your version of autoconf likely contains buggy cache code.
Running cvsclean for you.
To avoid this, install autoconf-2.13.
rebuilding configure
这时,需要编译autoconf-2.13来避免此问题,编译autoconf-2.13的方法如下:
解压缩autoconf-2.13.tar.gz包,然后编译即可,而不需要覆盖现在的autoconf
nginx% gunzip autoconf-2.13.tar.gz | tar xvf -
在autoconf-2.13目录下
nginx% ./configure --prefix=/home/nginx/autoconfig213
完成后
nginx% make && make install
此时,autoconf编译完成,在环境变量中增加PHP_AUTOCONF和PHP_AUTOHEADER
nginx% export PHP_AUTOCONF=/home/nginx/autoconf213/bin/autoconf
nginx% export PHP_AUTOHEADER=/home/nginx/autoconf213/bin/autoheader
再次在php-5.2.8下执行重建configure,确认configure文件重写生成。
nginx% ./buildconf --force
然后可以通过./configure --help 来检查应该含有--with-informix[=DIR] 这样的选项了。
在编译php-fpm前,在环境中指定INFORMIXDIR(必须,若未配置必须要--with-informix中指定目录)和INFORMIXSERVER
nginx% export INFORMIXDIR=/opt/informix
nginx% export INFORMIXSERVER=ids_online_net
注:以下编译选项还包含了mysql的连接,若不需要可以不选。
nginx% ./configure \
--prefix=/home/nginx/php \
--enable-fastcgi \
--enable-fpm \
--with-mysql \
--with-informix \
--with-zlib \
--with-curl \
--with-freetype-dir \
--enable-ftp \
--enable-zip
nginx% make all (编译所有)
nginx% make install (编译安装,完成安装)
检查安装
nginx% cd /home/nginx/php/bin
nginx% ./php -v (显示如下内容,表示安装正常)
PHP 5.2.8 (cli) (built: Aug 11 2009 22:53:04)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
将php-5.2.8目录下的php.ini-dist 复制到/home/nginx/php/lib/php.ini
修改配置文件/home/nginx/php/etc/php-fpm.conf,找到部分(该部分的内容是指定php的环境变量)
增加以下两项。(示例中使用用户环境变量,即上面指定的两个环境变量)
$INFORMIXDIR
$INFORMIXSERVER
修改PATH,使用$PATH替换掉默认变量
$PATH
完成以上后,启动php-fpm
nginx% /home/nginx/php/sbin/php-fpm start
3.nginx的安装
nginx% tar -xzvf nginx-0.8.54.tar.gz (解压缩包nginx-0.8.54,生成目录nginx-0.8.54)
nginx% cd nginx-0.8.54
nginx% ./configure \
--prefix=/home/nginx (指定--prefixm,配置前,应先安装好pcre-devel)
nginx% make (编译)
nginx% make install (编译安装)
配置nginx
修改/home/nginx/conf/nginx.conf 配置文件,需做如下修改
server {
listen 8080; (修改所使用的端口)
server_name localhost; (修改所使用的服务器名,可以使用IP地址)
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
取消FastCGI server部分location的注释,并要注意fastcgi_param行的参数,$fastcgi_script_name 应改为$document_root$fastcgi_script_name,或者使用绝对路径
完成配置后启动
nginx% /home/nginx/sbin/nginx
编写个phpinfo.php文件保存在/home/nginx/html/目录下,文件内容如下:
<?php phpinfo(); ?>
然后在浏览器中打开,输出应当有informix的项目,并且需要注意php的变量中存在INFORMIXDIR和INFORMIXSERVER,如图所示:
编写个连接至informix数据库的php文件testifx.php,ifx_connect的参数含义是([email protected], user, password)
<?php
$conn_id = ifx_connect ("[email protected]_online_net", "informix", "informix");
if ($conn_id){
echo "connect success!";
} else {
echo "connect failed!";
}
?>
若是指定的数据库正常运行的话,应该能得到输出 connect success!
结束语:弄这个弄了好几天,到今天01:30(2011.02.02,春节咯!^_^)总算是搞定了,中间因为php的环境问题做了好几次(使用php -e testifx.php一直都正常,在浏览器中输出错误),偶然看到php-fpm的进程中含有配置文件名,这才找到关键所在,加上环境就一切都好了!