blogger

    blogger
  • hot log

  • comment

    twitter

    • 12.10.xC6出来时候碰到"Could not determine encryption mode from page zero",竟果然是BUG!http://www-01.ibm.com/support/docview.wss?rs=630&uid=swg21973408

      2015-12-21 20:15

    • 空间已经转移到新加坡,希望会好一些。

      2015-11-16 14:34

    • 增加新域名liaosnet.cc,与liaosnet.com同指向。

      2015-10-09 15:25

    • 空间迁移到香港。或许速度会快一点。。

      2014-02-13 20:10

    • 解决个问题:NBU配置Storage时的目录在系统分区上,导致备份失败,最终原因是目录在系统分区上时,需要在 This directory can exist on the root file system or system disk. 这个选项前打上勾。

      2012-09-26 22:21

    • More»

    blog sort

    links

    record

    banner

    在Nginx + php-fpm(fastcgi)环境下配置informix的连接

    暗夜星空's Memory from Feb 2 , 2011 at 0:22 AM , under Category: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="environment">部分(该部分的内容是指定php的环境变量)
      增加以下两项。(示例中使用用户环境变量,即上面指定的两个环境变量)
        <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压缩包

    Page comment lists:

    netsky 2011-02-02 22:09

    若是使用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";
    ?>