我们的一个项目,用了 PDO_MYSQL 拓展,准备迁移服务器,新环境需要编译安装环境。昨天,运维同事抽空编译了一下,一直编译不上pdo_mysql,同时,公司的一款新webgame临近上线,他们实在太忙,我这个三流运维技术的程序员来试试吧。
运维同事描述:
服务器系统版本:Linux version 2.6.32-71.el6.x86_64 (mockbuild@c6b6.centos.org) (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Fri May 20 03:51:51 BST 2011
编译PHP的参数
2 | tarzxvf $soft_dir/php-5.3.8.tar.gz -C $soft_tmp |
4 | ./configure --prefix=$soft_install/php --with-config-file-path=$soft_install/php/etc --with-mysql=$soft_install/mysql --with-mysqli=mysqlnd --with-gd=$soft_install/gd --with-jpeg-dir=$soft_install/jpeg --with-png-dir=$soft_install/png --with-freetype-dir=$soft_install/freetype --enable-bcmath --with-mcrypt &&make&&makeinstall |
之后再次编译 pdo_mysql 拓展
2 | cd$soft_tmp/PDO_MYSQL-1.0.2/ |
3 | $soft_install/php/bin/phpize |
4 | ./configure --with-php-config=$soft_install/php/bin/php-config --with-pdo-mysql=$soft_install/mysql/ &&make&&makeinstall |
之后, shell里执行 php -i 和 php -m都没有看到 pdo_mysql拓展。搜pdo_mysql,在将路径添加到php.ini中,仍找不到这个扩展,判断为编译失败。
这里是将pdo_mysql作为一个拓展引入使用的。在php5.3中,PHP开发组把mysqlnd作为默认的连接MYSQL的数据库驱动来使用,据官 方描述,节省内存40%,速度更快,当然或许是为了解决许可协议的问题。之前PHP连接MYSQL,是调用MYSQL官方提供的C/C++编写的 lib_mysql的dll/so,来实现。这个类库同样可以给PYTHON等脚本语言调用,只要按照API规范来。我们改用mysqlnd之后,就不用 再为了lib_mysql去安装mysql client了。详情见: mysqlnd插件mysqlnd_ms的介绍 。
两种方法都可以,运维同事都尝试了,由于时间关系,他们没做过多的尝试研究,就转向更紧急的项目了。
运维同事下载使用的PDO_MYSQL拓展的地址是 http://pecl.php.net/package/PDO_MYSQL ,里面用很耀眼的颜色,标注如下几行字
This package is not maintained anymore and has been superseded. Package has moved to channel http://svn.php.net/viewvc/php/php-src/trunk/ext/pdo_mysql/, package ext/pdo_mysql.
也就是说,早在2006年5月1(我是根据最后一个打包文件日期猜的,或许不准)之后,PHP已经将这个pdo拓展放到PHP源码的 ext/pdo_mysql下内置了。这里的这个包,将不会在更新维护了。
在PHP官方文档上对 pdo_mysql 使用 mysqlnd 的时候,是这么描述的
在php5.3中,已经支持mysqlnd作为数据库连接驱动了,无需再使用libmysql。而在将来的php5.4中,将变为默认的连接驱动。如图:
mysqlnd-pdo_mysql
开启这个类库的
1 | ./configure --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd |
之后,我的编译参数如下
1 | ./configure --prefix=/usr/local/services/php --with-config-file-path=/usr/local/services/php/etc --with-pdo-mysql=mysqlnd --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-iconv-dir=/usr/local/services/libiconv --disable-phar --with-gd=/usr/local/services/gd --with-jpeg-dir=/usr/local/services/jpeg --with-png-dir=/usr/local/services/png --with-freetype-dir=/usr/local/services/freetype --enable-bcmath --with-mcrypt |
区别是使用php内置的pdo_mysql类库,使用mysqlnd作为连接驱动,不在使用之前的MYSQL官方提供的libmysql.so。
make之后,提示如下错误
01 | soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1070: undefined reference to `mysql_eof' |
02 | /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1070: undefined reference to `mysql_fetch_row' |
03 | ext/mysql/php_mysql.o: Infunction`zif_mysql_error': |
04 | /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1727: undefined reference to `mysql_error' |
05 | ext/mysql/php_mysql.o: Infunction`zif_mysql_errno': |
06 | /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1758: undefined reference to `mysql_errno' |
07 | ext/mysql/php_mysql.o: Infunction`php_mysql_do_connect': |
08 | /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:705: undefined reference to `mysql_get_client_version' |
09 | /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:963: |
--转自