• Linux下LANMP集成环境中编译增加pdo_odbc模块


    linux版本为CentOs6.5,php集成环境为lanmp_v3.1,集成环境中默认的pdo扩展为:mysql, sqlite, sqlite2,现在有需求想链接微软的Access数据库,所以需要pdo_odbc模块的支持。查询了很多资料,如下:

    编译模块不求人,编译助手诞生支持curl,memcache,bcmath,pdo_mysql等,主要是参照这个,但是这个可能是旧的lanmp版本的并不全适用,但可以参照其原理,其shell脚本如下:

     1 #!/bin/bash
     2 # ext install scripts
     3 # Author:sendsky
     4 # Url http://www.baiup.com/
     5 
     6 echo "Select php version:
     7     1 php-5.2.17 (default)
     8     2 php-5.3.27
     9 "
    10 sleep 0.1
    11 read -p "Please Input 1,2: " PHP_VER_ID
    12 if [[ $PHP_VER_ID == 2 ]]; then
    13     PHP_VER="5.3.27"
    14     ext_dir="no-debug-non-zts-20090626"
    15 else
    16     PHP_VER="5.2.17"
    17     ext_dir="no-debug-zts-20060613"
    18 fi
    19 echo "Select php ext:
    20 bcmath      gd         mysqlnd       posix       sybase_ct
    21 bz2         gettext    oci8          pspell      sysvmsg
    22 calendar    gmp        odbc          readline    sysvsem
    23 com_dotnet  hash       openssl       recode      sysvshm
    24 ctype       iconv      pcntl         reflection  tidy
    25 curl        imap       pcre          session     tokenizer
    26 date        interbase  pdo           shmop       wddx
    27 dba         intl       pdo_dblib     simplexml   xml
    28 dom         json       pdo_firebird  skeleton    xmlreader
    29 enchant     ldap       pdo_mysql     snmp        xmlrpc
    30 ereg        libxml     pdo_oci       soap        xmlwriter
    31 exif        mbstring   pdo_odbc      sockets     xsl
    32 mcrypt      pdo_pgsql  spl           zip         standard
    33 fileinfo    mssql      pdo_sqlite    sqlite      zlib
    34 filter      mysql      pgsql         sqlite3
    35 ftp         mysqli     phar
    36 "
    37 sleep 0.1
    38 read -p "Please Input ext name: " PHP_EXT
    39 
    40 TOP=$(cd $(dirname $0)/.. && pwd)
    41 
    42 if [ ! -f /usr/bin/gcc ]; then
    43     yum install -y gcc gcc-c++ make autoconf libtool-ltdl-devel 
    44         gd-devel freetype-devel libxml2-devel libjpeg-devel 
    45         libpng-devel openssl-devel curl-devel patch 
    46         libmcrypt-devel libmhash-devel ncurses-devel sudo bzip2
    47 fi
    48 
    49 if [ -d $TOP/lanmp/php-$PHP_VER/ext/$PHP_EXT ]; then
    50     cd $TOP/lanmp/php-$PHP_VER/ext/$PHP_EXT
    51 else
    52     cd /tmp
    53     if [ ! -d php-$PHP_VER ]; then
    54       wget -c http://dl.wdlinux.cn:5180/soft/php-$PHP_VER.tar.gz
    55       tar zxvf php-$PHP_VER.tar.gz
    56     fi
    57 fi
    58 
    59 if [ ! -d php-$PHP_VER/ext/$PHP_EXT ]; then
    60   echo "Ext no fount!!"
    61   exit
    62 fi
    63 
    64 cd php-$PHP_VER/ext/$PHP_EXT
    65 /www/wdlinux/php/bin/phpize
    66 ./configure --with-php-config=/www/wdlinux/php/bin/php-config
    67 make
    68 [ $? != 0 ] && exit
    69 make install
    70 echo 
    71 grep -q "$ext_dir" /www/wdlinux/etc/php.ini
    72 if [ $? != 0 ]; then
    73     echo '' >> /www/wdlinux/etc/php.ini
    74     echo "extension_dir=/www/wdlinux/php/lib/php/extensions/$ext_dir" >> /www/wdlinux/etc/php.ini
    75 fi
    76 grep "$PHP_EXT.so" /www/wdlinux/etc/php.ini
    77 if [ $? != 0 ]; then
    78     echo '' >> /www/wdlinux/etc/php.ini
    79     echo "extension=$PHP_EXT.so" >> /www/wdlinux/etc/php.ini
    80 fi
    81 if [ -d /www/wdlinux/apache ]; then
    82     service httpd restart
    83 else
    84     service nginxd restart
    85 fi
    86 echo 
    87 echo "$PHP_EXT install is OK"
    88 echo
    上方链接中的脚本

    上方脚本的主要流程:

    1、让用户选择php版本,然后选择要安装的模块。

    2、如果没有gcc先安装gcc,然后查询当前目录下的lanmp/php选择版本/etc下是否有选择的模块,如果没有则在/tmp目录下下载http://dl.wdlinux.cn:5180/soft/php-选择版本.tar.gz,然后解压后从中取扩展的模块(可在浏览器中打开看看能否下载下来,解压看看相关目录是否存在你要安装的模块,如果没有那就要另想办法了)。

    3、config,make,make install,然后修改php.ini文件中的配置,最后重启服务器。

    而对于当前需求来说,不适用的地方有如下:

    1、当前lanmp3.1中php的版本为5.3.29而不是5.3.27,所以必须修改为5.3.29

    2、如果要按装pdo_odbc,需要首先安装unixODBC,config时也要加入此参数。否则安装时会出现如下错误:

    checking for selected PDO ODBC flavour... configure: error: Unknown ODBC flavour /usr/local/unixODBC
                                include and lib dirs are looked for under 'dir'.
                                'flavour' can be one of:  ibm-db2, iODBC, unixODBC, generic
                                If ',dir' part is omitted, default for the flavour
                                you have selected will used. e.g.:
                                  --with-pdo-odbc=unixODBC
                                will check for unixODBC under /usr/local. You may attempt
                                to use an otherwise unsupported driver using the "generic"
                                flavour.  The syntax for generic ODBC support is:
                                  --with-pdo-odbc=generic,dir,libname,ldflags,cflags
                                When build as shared the extension filename is always pdo_odbc.so

    上方的错误信息也给出解决方法了,目前看资料选择的是用unxiODBC(其余的未测试)。unxiODBC安装方法如下,参考资料(资料中路径对于我们的需求来说适合):

    1、官网下载最新版本(没有找到npm,所以直接编译安装,也曾尝试过yum安装,虽然能安装成功,但由于路径不对,还是导致pdo_odbc无法安装成功):

    wget http://www.unixodbc.org/unixODBC-2.3.4.tar.gz

    2、然后解压:

    tar zxvf unixODBC-2.3.4.tar.gz

    3、cd到解压目录,然后config,注意与参考资料中的区别,include、lib等路径必须是在/usr/local下才可以,否则在安装pdo_odbc时会出现错误

    ./configure --prefix=/usr/local/unixODBC --includedir=/usr/local/include --libdir=/usr/local/lib -bindir=/usr/local/bin --sysconfdir=/usr/local/etc

    如果unixODBC的路径不正确,在安装pdo_odbc时会出现类似错误:

    configure: error: Cannot find header file(s) for pdo_odbc

    4、make编译安装

    make && make install

    以上unxiODBC安装完成,然后正式安装pdo_odbc的脚本(本脚本只适用与pdo_odbc模块的安装)如下(未做其它的优化,只是稍微修改了下):

     1 #!/bin/bash
     2 # ext install scripts
     3 # Author:sendsky
     4 # Url http://www.baiup.com/
     5 
     6 echo "Select php version:
     7     1 php-5.3.29
     8 "
     9 sleep 0.1
    10 read -p "Please Input 1: " PHP_VER_ID
    11 if [[ $PHP_VER_ID == 1 ]]; then
    12     PHP_VER="5.3.29"
    13     ext_dir="no-debug-non-zts-20090626"
    14 else
    15     echo "invalid id!!"
    16 fi
    17 echo "Select php ext:
    18 bcmath      gd         mysqlnd       posix       sybase_ct
    19 bz2         gettext    oci8          pspell      sysvmsg
    20 calendar    gmp        odbc          readline    sysvsem
    21 com_dotnet  hash       openssl       recode      sysvshm
    22 ctype       iconv      pcntl         reflection  tidy
    23 curl        imap       pcre          session     tokenizer
    24 date        interbase  pdo           shmop       wddx
    25 dba         intl       pdo_dblib     simplexml   xml
    26 dom         json       pdo_firebird  skeleton    xmlreader
    27 enchant     ldap       pdo_mysql     snmp        xmlrpc
    28 ereg        libxml     pdo_oci       soap        xmlwriter
    29 exif        mbstring   pdo_odbc      sockets     xsl
    30 mcrypt      pdo_pgsql  spl           zip         standard
    31 fileinfo    mssql      pdo_sqlite    sqlite      zlib
    32 filter      mysql      pgsql         sqlite3
    33 ftp         mysqli     phar
    34 "
    35 sleep 0.1
    36 read -p "Please Input ext name: " PHP_EXT
    37 
    38 TOP=$(cd $(dirname $0)/.. && pwd)
    39 
    40 if [ ! -f /usr/bin/gcc ]; then
    41     yum install -y gcc gcc-c++ make autoconf libtool-ltdl-devel 
    42         gd-devel freetype-devel libxml2-devel libjpeg-devel 
    43         libpng-devel openssl-devel curl-devel patch 
    44         libmcrypt-devel libmhash-devel ncurses-devel sudo bzip2
    45 fi
    46 
    47 if [ -d $TOP/lanmp/php-$PHP_VER/ext/$PHP_EXT ]; then
    48     cd $TOP/lanmp/php-$PHP_VER/ext/$PHP_EXT
    49 else
    50     cd /tmp
    51     if [ ! -d php-$PHP_VER ]; then
    52       wget -c http://dl.wdlinux.cn:5180/soft/php-$PHP_VER.tar.gz
    53       tar zxvf php-$PHP_VER.tar.gz
    54     fi
    55 fi
    56 
    57 if [ ! -d php-$PHP_VER/ext/$PHP_EXT ]; then
    58   echo "Ext no fount!!"
    59   exit
    60 fi
    61 
    62 cd php-$PHP_VER/ext/$PHP_EXT
    63 /www/wdlinux/php/bin/phpize
    64 ./configure --with-php-config=/www/wdlinux/php/bin/php-config --with-pdo-odbc=unixODBC
    65 make
    66 [ $? != 0 ] && exit
    67 make install
    68 echo 
    69 grep -q "$ext_dir" /www/wdlinux/etc/php.ini
    70 if [ $? != 0 ]; then
    71     echo '' >> /www/wdlinux/etc/php.ini
    72     echo "extension_dir=/www/wdlinux/php/lib/php/extensions/$ext_dir" >> /www/wdlinux/etc/php.ini
    73 fi
    74 grep "$PHP_EXT.so" /www/wdlinux/etc/php.ini
    75 if [ $? != 0 ]; then
    76     echo '' >> /www/wdlinux/etc/php.ini
    77     echo "extension=$PHP_EXT.so" >> /www/wdlinux/etc/php.ini
    78 fi
    79 if [ -d /www/wdlinux/apache ]; then
    80     service httpd restart
    81 else
    82     service nginxd restart
    83 fi
    84 echo 
    85 echo "$PHP_EXT install is OK"
    86 echo
    正式安装的脚本

    需要注意的是与参考脚本不同的是php版本的变更和config配置中中加入了--with-pdo-odbc=unixODBC,还有本脚本只适用与pdo_odbc模块的安装,其它模块没有安装过,config的参数可能需要修改。

    上述脚本起名pdo_odbc.sh,放到linux服务器下,然后运行:

    sh pdo_odbc.sh

    按照步骤填写,正常的话会安装成功,然后查看下phpinfo()是否安装成功。

    以上就是安装过程,wdlinux论坛中有其它类似pdo_mysql等其它扩展的shell脚本,可以下载下来打开查看其安装方式步骤来参照修改,再次提醒本脚本只适用于lanmp3.1环境下的php5.3.29版本下pdo_odbc模块安装,其它不同的则需要修改集成环境路径、版本、编译参数等才能正常运行。

    ----------------------------------

    后续,还是太年轻,在实际应用中打脸了,因为在linux下只有pdo_odbc是不行的,还需要有access相关的驱动,在windows下可以用类似DRIVER={Microsoft Access Driver (*.mdb)}来访问,但是在linux下是不行的,目前通过搜索相关资料发现可用的有两种:一个是MDBTools 一个是Easysoft ODBC-Access ,参照这个,mdb tools免费,easysoft收费而且价格不菲。

    下面只大体说下mdbtools,其github地址点这里,可以自己下载编译(编译各种报错,缺少文件等,自行搜索),也可以用yum安装(yum install mdbtools),安装完成后,需要找到libmdbodbc.so.1类似的文件的位置,不同版本后缀可能不同,例如0.5版本的是libmdbodbc.so.0,make安装后测试存在/usr/lib64文件夹下,然后可以参照这篇文章来设置:

    在/usr/local/etc下找到odbcinst.ini文件(上方安装时设定的目录):

    [MdbTools]
    Description = MyDriver Driver for MyDBMS
    Driver      = /usr/lib64/libmdbodbc.so.0
    Setup       = 
    FileUsage   = 1
    UsageCount  = 1

    同目录下设定odbc.ini文件

    [MyDsn]
    Description = The Source of My Data
    Driver      = MdbTools(这个是上面文件配置中括号的名称)
    ServerName  = localhost(地址)
    Database    = (你的Access文件路径)
    UserName    = (用户名)
    Password    = (密码)

    然后可以用:

    new PDO(odbc:Driver=MyDsn;DBQ=access路径名称;)//这个MyDsn是odbc.ini文件中中括号的名称
    new PDO(odbc:DSN=MyDsn;DBQ=access路径名称;)

    上面两种我用第二个貌似可以用isql -v命令测试能联通,具体使用时请再搜索查询吧,说实话到这里没有后续了,放弃了,因为mdbtools只支持固定名称的数据库,而我们的需求是数据名称随时变动的,即便配置好也没发适用,参照这个问题。最终我们的解决方法是在另一个windows服务器中远程链接linux数据库来执行这个读取access数据库的计划任务的操作。后续windows下的读取操作可以看另一篇文章

    以上,linux下读取access非常不友好,唉!

  • 相关阅读:
    【转载】FPGA算法设计随笔
    利用ZYNQ SOC快速打开算法验证通路(2)——数据传输最简方案:网络调试助手+W5500协议栈芯片
    学习笔记(二)——直方图均衡化和匹配
    学习笔记(一)——图像的灰度级和动态范围
    摄像头PIN脚功能作用
    详细的摄像头模组工作原理!!!
    图像处理资料分享
    图像处理大神
    gamma校正原理
    ISP基础一
  • 原文地址:https://www.cnblogs.com/vishun/p/6525959.html
Copyright © 2020-2023  润新知