问题背景:
正常情况下LAMP安装次序为:
Linux —> Apache —> Mysql —> PHP
PHP 如果想连接Mysql 在编译时就需要用到 Mysql的头文件以及库文件。
PHP连接 Mysql 时需要在 PHP 引擎中使用Mysql.so扩展,此时先安装的PHP,在编译PHP时,Mysql还没有被安装,所以此时就需要手动编译生成 mysql.so 扩展;
解决方案:
使用phpize工具能够生成mysql.so,但是必须加上"--with-mysql=mysql客户端的路径"。也就是mysql.so模块必须用到mysql客户端才行。
可以这样理解,mysql.so内部会调用mysql客户端,以便实现连接mysql数据库服务器。
我们常常用到的mysql_connect()可能就是调用了mysql客户端才能完成连接数据库的操作。
生成 mysql.so 过程:
需要用到php的源码包,通过源码包中提供的phpize文件(一个专门链接php扩展的工具)
phpize的规则:在哪个目录下使用 phpize 工具,就会在哪个目录中生成configure文件。
注:需要安装 autoconf 工具;
root@localhost:/# apt-get install autoconf <— Ubuntu 安装方法
root@localhost:/# yum install autoconf <— Centos 安装方法
安装步骤:
1、进入PHP源代码目录
root@localhost:/# cd /root/php-5.3.27/
2、进入扩展目录
root@localhost:~/php-5.3.27# cd ext/mysql
3、调用已经编译好的php可执行程序 phpize 生成 configure文件:
root@localhost:~/php-5.3.27/ext/mysql
root@localhost: /usr/local/php/bin/phpize
### 此命令执行后会在 /root/php-5.3.27/ext/mysql/ 下生成 configure 文件 ### Cannot find autoconf. Please check your autoconf installation and the
### $PHP_AUTOCONF environment variable. Then, rerun this script.
### 出现此处错误即代表没有安装 autoconf 工具,按上面方法安装即可;
4、执行编译命令:
./configure --with-php-config=/usr/local/php/bin/php-config \
--with-mysql=/usr/include/mysql --with-zlib-dir=/usr/lib/mysql
## Ubuntu 中需要单独安装头与库文件 apt-get install libmysqlclient-dev
注:--with-mysql 用来指定mysql 头文件位置;
--with-zlib-dir 用来指定 Mysql 库文件位置;
make && make install
编译成功后会输出一个目录:
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
## 此目录为 php 扩展动态库存放目录,编译成功后会将 mysql.so 放到此目录中;
5、修改 PHP 配置文件:
注意:刚刚生成的模块名字叫 mysql.so(可进入扩展目录中用 ls 查看),而 php.ini 此配置文件中默认叫 msql.so ,必须更改php配置文件让配置文件中所指的模块名与生成的模块同名;
vim /etc/php/php.d/php.ini
extension=mysql.so <<<— 此处大约在 944 行左右;
6、重启 Apache:
/usr/local/apache/bin/apachectl restart <<— 安装方法不同,重启办法不同。
最后附上两段 php 检测代码:
测试PHP 工作是否正常:
测试 PHP 连接Mysql 是否正常:
### 成功则会输出 "connected!",失败会输出 "connect error!";