在Nginx + php-fpm(fastcgi)环境下配置informix的连接
目的: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% tar -xzvf autoconf-2.13.tar.gz
在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,找到
增加以下两项。(示例中使用用户环境变量,即上面指定的两个环境变量)
<value name="INFORMIXDIR">$INFORMIXDIR</value>
<value name="INFORMIXSERVER">$INFORMIXSERVER</value>
修改PATH,使用$PATH替换掉默认变量
<value name="PATH">$PATH</value>
完成以上后,启动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的参数含义是(dbname@INFORMIXSERVER, user, password)
<?php
$conn_id = ifx_connect ("sysmaster@ids_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的进程中含有配置文件名,这才找到关键所在,加上环境就一切都好了!
php_informix.zip压缩包
若是使用PDO_INFORMIX连接亦可将PDO_INFORMIX的源码包放在php-5.2.8/ext目录下,再次生成configure文件,待新生成的configure中含有--with-pdo-informix时再次编译即可。
以下为示例的configure
./configure \
--prefix=/home/nginx2/php \
--enable-fastcgi \
--enable-fpm \
--with-pdo-informix \
--with-zlib--with-curl \
--with-freetype-dir \
--enable-ftp \
--enable-zip \
--enable-mbstring \
--with-mcrypt
同样的,不要忘记修改php_fpm.conf中的环境变量。
最后确认phpinfo()中有pdo_informix项且环境变量中存在INFORMIXDIR和INFORMIXSERVER的记录。
附上通过pdo_informix连接到informix的php文件:
<?php
$host = "192.168.80.60";
$dbName = "testdb";
$dbServer = "ids_online_net";
$user = "informix";
$pass = "informix";
$port = "9105";
$protocol = "onsoctcp";
$DSN = "informix:host=$host;database=$dbName;server=$dbServer;service=$port;protocol=$protocol";
echo "The DSN Config:<br>".$DSN."<br>";
try {
$db = new PDO($DSN, $user, $pass);
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
echo "access informix failed";
echo "Caught exception: ", $e->getMessage(), "\n";
exit();
}
echo "access informix successed";
?>
注:此文章使用的某些链接文件可能已经丢失。