`

(转)php 5.3编译PDO问题

 
阅读更多
http://www.cnxct.com/category/%e6%89%80%e8%b0%93%e6%8a%80%e6%9c%af/

我们的一个项目,用了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的参数

查看源代码打印帮助1 ... 

2 tar zxvf $soft_dir/php-5.3.8.tar.gz -C $soft_tmp 

3 cd  $soft_tmp/php-5.3.8 

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 && make install

5 ...

之后再次编译 pdo_mysql 拓展

查看源代码打印帮助1 ... 

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 && make install

5 ...

之后, 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作为数据库连接驱动了。而在将来的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作为连接驱动。

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: In function `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: In function `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: In function `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: undefined reference to `mysql_init' 

10 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:976: undefined reference to `mysql_options' 

11 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:980: undefined reference to `mysql_real_connect' 

12 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:1002: undefined reference to `mysql_options' 

13 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:706: undefined reference to `mysql_get_client_version' 

14 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:844: undefined reference to `mysql_init' 

15 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:850: undefined reference to `mysql_options' 

16 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:853: undefined reference to `mysql_real_connect' 

17 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:871: undefined reference to `mysql_options' 

18 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:989: undefined reference to `mysql_error' 

19 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:992: undefined reference to `mysql_errno' 

20 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:898: undefined reference to `mysql_ping' 

21 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:899: undefined reference to `mysql_errno' 

22 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:901: undefined reference to `mysql_real_connect' 

23 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:911: undefined reference to `mysql_options' 

24 /data/sa/suse-soft/soft_tmp/php-5.3.8/ext/mysql/php_mysql.c:862: undefined reference to `mysql_error'

这种错误,让我手足无措,GOOGLE搜了下,也没找到相关案例,而且,一直被墙,打不开国外网页。百度搜的结果,还是算了。(中文还行,E文的话,百度确实不行,尤其是程序相关)
之后,尝试make clean,清除之前的编译结果缓存之类。
再次make,有个小意外

查看源代码打印帮助1 ERROR: invalid PHP executable specified by TEST_PHP_EXECUTABLE  = .....

再次搜索,这倒是很多网友遇到过,大部分的建议就是无视这个错误,不影响编译。照做。make install ,一路挺顺畅。

接着,php -i / php -m 也没发现pdo_mysql模块。
郁闷无比,决定看下web下的phpinfo结果,发现居然有了。问题终于解决了。。。万岁。。

可是!!!
1,为啥php -i 、php -m 的结果里看不到呢? 思考,为什么呢?
结合刚刚的报错,联想到CLI 模式下的php 脚本(以及相关的php.ini)跟刚刚从web下访问的php程序不是同一个。检查环境变量,以及切换到编译好的目录下执行php -i,发现pdo_mysql、mysqlnd等相关添加的模块了。

2,php.ini里没启用pdo_mysql拓展,为什么还能看的到呢?
这次使用的是PHP内置的类库,不是以新拓展方式加载运行的,所以,不用更改php.ini,再添加相关so路径。

综上所述,文章没有高深的东西,只是有几个需要细心的点。
1,以官方文档为准,一切跟着官方文档来,不轻易采信网络上网友提供的编译参数,包括这边博文。不论对方是老手、大牛,还是其他什么什么有威望的人。他们提供的方法或许跟你当前的环境不一致,时间也相差很大,或许相隔好几年了。
2,确认得到的结果是准确的,怎么说呢,文中的例子中php-i的路径不是我们新编译的,而是之前编译,或者yum安装的,一定要到自己编译的程序目录下,用自己新编译的脚本去执行测试,获得测试结果,下结论,不为了偷懒,不敲路径,直接写程序名进行测试。
3,遇到诡异的错误,我总会想要一个全新的系统,进行安装,以确保不被各种冗余、缓存等垃圾文件干扰。例子中用了make clean进行清除相关缓存,来解决文件缓存问题。(感谢@ivon_lee 的帮助)
4,自动安装脚本要及时更新,当然,不是意味着追求最新版本。例子中的pdo_mysql的拓展,官方提供了更好的方式,不论是效率,资源占用,都有更好的提升,为啥不使用呢。

备注:mysqlnd 的相关有点对比见http://developer.51cto.com/art/200903/115995.htm

分享到:
评论

相关推荐

    ubuntu 同时装php5.3和5.2

    sudo apt-get install php5 php5-common php5-cli php5-dev php5-mysql phpmyadmin php5-pgsql phppgadmin php5-gd php5-mcrypt php5-curl php-pear libapache2-mod-php5 php5-xdebug php5-codesniffer ``` 2. *...

    php5.3 mssql扩展

    通过PDO,开发者可以使用面向对象的方式来操作数据库,同时享受到PDO提供的事务处理、预编译语句和错误处理等特性。 3. 安装与配置: 在Windows环境下,这些DLL文件需要放置在PHP的ext目录下,并在php.ini配置文件...

    Ubuntu12下编译安装PHP5.3开发环境

    同时,还需要安装与PHP5.3编译相关的库,例如XML、libevent、curl、GD库、JPEG支持、PNG支持、libmcrypt、zlib、tidy、MySQL客户端库等。执行以下命令: ```bash sudo apt-get install libxml2 libxml2-dev ...

    pdo_sqlserver_5.2_5.3

    2. "php_pdo_sqlsrv_53_nts_vc6.dll" - 这是PDO SQL Server驱动,同样适用于PHP 5.3版本,非线程安全,也是用Visual C++ 6编译的。这个扩展允许通过PDO接口访问SQL Server数据库。 3. ...

    编译PHP5配置centos6.4

    在CentOS 6.4操作系统上编译安装PHP5的过程是一项技术性的工作,涉及到多个步骤和依赖库的安装。以下是对整个过程的详细说明: 首先,为了编译PHP5,你需要确保系统上已经安装了一些基本的开发工具和库。通过运行`...

    ubuntu+php5.6环境下连接sqlserver2008扩展库 mssql.so+pdo_dblib.so

    ubuntu14.04+php5.6环境下连接sqlserver2008扩展库 mssql.so+pdo_dblib.so,编译方法:http://blog.csdn.net/hanzengyi/article/details/52054862

    Microsoft Drivers for PHP 5.3/5.4/5.5/5.6 for SQL Server

    - 预编译语句:通过预编译的SQL语句提高执行效率,同时防止SQL注入攻击。 - 多结果集处理:允许一个查询返回多个结果集,方便处理复杂的数据需求。 - 高级数据类型支持:包括XML、几何类型、日期/时间类型等,与...

    PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法

    本篇文章将详细阐述如何在PHP 5.3环境下配置Oracle客户端以及安装PDO_OCI模块,以便实现PHP连接Oracle 11g R2数据库。 首先,确保你的系统已经安装了PHP基础环境,包括PHP、PHP-PDO等必要组件。如果尚未安装,可以...

    PHP5.3到7的特性总结

    ### PHP5.3到PHP7的新特性总结 ...通过以上分析可以看出,从PHP5.3升级到PHP7的过程中,不仅解决了许多遗留问题,还引入了许多新特性,极大地提升了开发效率和程序性能。对于开发者而言,掌握这些新特性是非常重要的。

    php-5.5.3 源码

    - **Extensions**:PHP提供了许多内置扩展,如MySQLi、PDO、SPL等,这些扩展位于`ext`目录下,用于增强PHP的功能。 - **Main**:包含启动、初始化和终止PHP运行时环境的代码。 - **lib**:包含PHP的一些基础库,...

    php5.5.10中文手册下载[官方版][2014-02-20最后编译]

    ◦编译问题 ◦使用 PHP ◦Password Hashing — Safe Password Hashing ◦PHP 和 HTML ◦PHP 和 COM ◦从 PHP 4 移植到 PHP 5 ◦杂类问题 •附录◦PHP 及其相关工程的历史 ◦Migrating from PHP 5.5.x to PHP 5.6.x ...

    php-5.5.3 64

    - **OpCache**:从5.5.0版本开始,PHP引入了内置的OpCache,用于存储预编译的PHP代码,从而提高了性能。 - **改进的错误处理**:引入了更友好的错误报告机制,如错误严重性分级和更好的调试信息。 - **更好的性能**...

    php5.5.10手册官方版【2014-02-20编译】

    最新的php手册 2014年02月20号最后编译 by: Mehdi Achour Friedhelm Betz Antony Dovgal Nuno Lopes Hannes Magnusson Georg Richter Damien Seguy Jakub Vrana 其他贡献者 2014-02-20 Edited ...

    php5中文版20110401编译

    ■编译问题 ■使用 PHP ■PHP 和 HTML ■PHP 和 COM ■PHP 和其它语言 ■从 PHP 4 移植到 PHP 5 ■杂类问题 ■附录 ■PHP 及其相关工程的历史 ■从 PHP 5.2.x 移植到 PHP 5.3.x ■Migrating from PHP 5.1.x to PHP ...

    linux上源码安装apache2.4 nginx1.2 php5.3.10 mysql5.3

    ### Linux环境下源码安装Apache 2.4、Nginx 1.20、PHP 5.3.10及MySQL 5.5 #### 一、准备工作:基础软件安装 在Ubuntu系统中,需要先确保一些基础工具的安装,避免后续编译过程中出现问题。...path=/usr/local/...

    PHP官方正版中文帮助手册

     编译问题  使用 PHP  Password Hashing — Safe Password Hashing  PHP 和 HTML  PHP 和 COM  PHP 和其它语言  从 PHP 4 移植到 PHP 5  杂类问题  附录 PHP 及其相关工程的历史  Migrating from PHP ...

    sqlserver的php扩展包

    对于PHP5.4和5.3,需要下载对应版本的sqlsrv和pdo_sqlsrv驱动。通常,这些驱动可以在微软的官方网站上找到,或者通过Composer来安装。安装过程中可能需要配置php.ini文件,将扩展添加到`extension_dir`路径,并启用...

    PHP连接sql server需要的dll.rar

    这里的"53"可能指的是PHP的版本号(例如PHP 5.3),"ts"则可能代表"Thread Safe",表明这是为多线程环境编译的版本。 在PHP中,要连接到SQL Server,通常有两种方法:使用旧的mssql扩展(不推荐)或使用更现代的PDO...

    php官方中文帮助手册

    ■编译问题 ■使用 PHP ■Password Hashing — Safe Password Hashing ■PHP 和 HTML ■PHP 和 COM ■PHP 和其它语言 ■从 PHP 4 移植到 PHP 5 ■杂类问题 ■附录■PHP 及其相关工程的历史 ■Migrating from PHP ...

Global site tag (gtag.js) - Google Analytics