php5.6数据库连接失败--could not find driver 一一详解

这个问题很多人经常遇到,解决这个问题首先我们得深究问题原因,下面我们一一详解

问题描述很明确:php连接连接数据库的时候,找不到数据库驱动,比如mysql驱动

这个问题大多数和mysql有关

我们目前的配置信息如下:

1
2
3
4
5
6
7
[root@VM_0_14_centos think]# mysql --version
mysql Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1
[root@VM_0_14_centos think]# php -v
PHP 5.6.40 (cli) (built: Jan 12 2019 13:11:15)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

php 5.6版本,mysql 5.5版本

在PHP中连接数据库需要PDO和相应数据库的驱动
PDO,PHP Data Objects
查看php配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
; extension=modulename.extension
;
; For example, on Windows:
;
; extension=msql.dll
;
; ... or under UNIX:
;
; extension=msql.so
;
; ... or with a path:
;
; extension=/path/to/extension/msql.so
;
; If you only provide the name of the extension, PHP will look for it in its
; default extension directory.

;;;;
; Note: packaged extension modules are now loaded via the .ini files
; found in the directory /etc/php.d; these are loaded by default.
;;;;

这个配置就是告诉你扩展库的书写方式是
extension = mysql.so

还有默认PHP内的扩展模块都已经配置在 /etc/php.d/ 里面的ini文件了,php会自动加载,于是我们看下有哪些配置呢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@VM_0_14_centos think]# ll /etc/php.d/
total 144
-rw-r--r-- 1 root root 47 Jan 12 2019 bz2.ini
-rw-r--r-- 1 root root 57 Jan 12 2019 calendar.ini
-rw-r--r-- 1 root root 51 Jan 12 2019 ctype.ini
-rw-r--r-- 1 root root 49 Jan 12 2019 curl.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 dom.ini
-rw-r--r-- 1 root root 49 Jan 12 2019 exif.ini
-rw-r--r-- 1 root root 57 Jan 12 2019 fileinfo.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 ftp.ini
-rw-r--r-- 1 root root 45 Jan 12 2019 gd.ini
-rw-r--r-- 1 root root 55 Jan 12 2019 gettext.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 gmp.ini
-rw-r--r-- 1 root root 51 Jan 12 2019 iconv.ini
-rw-r--r-- 1 root root 49 Jan 12 2019 intl.ini
-rw-r--r-- 1 root root 49 Jan 12 2019 json.ini
-rw-r--r-- 1 root root 57 Jan 12 2019 mbstring.ini
-rw-r--r-- 1 root root 645 Jan 12 2019 opcache-default.blacklist
-rw-r--r-- 1 root root 3321 Jan 12 2019 opcache.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 pdo.ini
-rw-r--r-- 1 root root 59 Sep 14 20:56 pdo_mysql.ini
-rw-r--r-- 1 root root 61 Jan 12 2019 pdo_sqlite.ini
-rw-r--r-- 1 root root 49 Jan 12 2019 phar.ini
-rw-r--r-- 1 root root 51 Jan 12 2019 posix.ini
-rw-r--r-- 1 root root 51 Jan 12 2019 shmop.ini
-rw-r--r-- 1 root root 59 Jan 12 2019 simplexml.ini
-rw-r--r-- 1 root root 55 Jan 12 2019 sockets.ini
-rw-r--r-- 1 root root 55 Jan 12 2019 sqlite3.ini
-rw-r--r-- 1 root root 55 Jan 12 2019 sysvmsg.ini
-rw-r--r-- 1 root root 55 Jan 12 2019 sysvsem.ini
-rw-r--r-- 1 root root 55 Jan 12 2019 sysvshm.ini
-rw-r--r-- 1 root root 59 Jan 12 2019 tokenizer.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 xml.ini
-rw-r--r-- 1 root root 59 Jan 12 2019 xmlreader.ini
-rw-r--r-- 1 root root 49 Jan 12 2019 xml_wddx.ini
-rw-r--r-- 1 root root 59 Jan 12 2019 xmlwriter.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 xsl.ini
-rw-r--r-- 1 root root 47 Jan 12 2019 zip.ini

发现就是没有 pdo_mysql.ini ,也就是跟mysql相关的驱动动态共享库

继续查看php默认动态共享库路径(查看PHP动态共享库路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@VM_0_14_centos think]# ll /usr/lib64/php/modules/
total 7052
-rwxr-xr-x 1 root root 24816 Jan 12 2019 bz2.so
-rwxr-xr-x 1 root root 33864 Jan 12 2019 calendar.so
-rwxr-xr-x 1 root root 15648 Jan 12 2019 ctype.so
-rwxr-xr-x 1 root root 86992 Jan 12 2019 curl.so
-rwxr-xr-x 1 root root 180784 Jan 12 2019 dom.so
-rwxr-xr-x 1 root root 65592 Jan 12 2019 exif.so
-rwxr-xr-x 1 root root 2901856 Jan 12 2019 fileinfo.so
-rwxr-xr-x 1 root root 57800 Jan 12 2019 ftp.so
-rwxr-xr-x 1 root root 399288 Jan 12 2019 gd.so
-rwxr-xr-x 1 root root 15712 Jan 12 2019 gettext.so
-rwxr-xr-x 1 root root 70408 Jan 12 2019 gmp.so
-rwxr-xr-x 1 root root 45240 Jan 12 2019 iconv.so
-rwxr-xr-x 1 root root 399560 Jan 12 2019 intl.so
-rwxr-xr-x 1 root root 48848 Jan 12 2019 json.so
-rwxr-xr-x 1 root root 1421128 Jan 12 2019 mbstring.so
-rwxr-xr-x 1 root root 154536 Jan 12 2019 opcache.so
-rwxr-xr-x 1 root root 150816 Sep 14 20:54 pdo_mysql.so
-rwxr-xr-x 1 root root 120528 Jan 12 2019 pdo.so
-rwxr-xr-x 1 root root 29248 Jan 12 2019 pdo_sqlite.so
-rwxr-xr-x 1 root root 272168 Jan 12 2019 phar.so
-rwxr-xr-x 1 root root 32984 Jan 12 2019 posix.so
-rwxr-xr-x 1 root root 15712 Jan 12 2019 shmop.so
-rwxr-xr-x 1 root root 54280 Jan 12 2019 simplexml.so
-rwxr-xr-x 1 root root 91488 Jan 12 2019 sockets.so
-rwxr-xr-x 1 root root 51472 Jan 12 2019 sqlite3.so
-rwxr-xr-x 1 root root 19984 Jan 12 2019 sysvmsg.so
-rwxr-xr-x 1 root root 11568 Jan 12 2019 sysvsem.so
-rwxr-xr-x 1 root root 15792 Jan 12 2019 sysvshm.so
-rwxr-xr-x 1 root root 19816 Jan 12 2019 tokenizer.so
-rwxr-xr-x 1 root root 40936 Jan 12 2019 wddx.so
-rwxr-xr-x 1 root root 33008 Jan 12 2019 xmlreader.so
-rwxr-xr-x 1 root root 54264 Jan 12 2019 xml.so
-rwxr-xr-x 1 root root 49232 Jan 12 2019 xmlwriter.so
-rwxr-xr-x 1 root root 37184 Jan 12 2019 xsl.so
-rwxr-xr-x 1 root root 121808 Jan 12 2019 zip.so

发现果然没有 pdo_mysql.so 相关的动态库

查看PHP手册,得知PHP5.1开始,PDO和PDO_SQLITE驱动默认可用,其他特定数据库需要自行启用

因此我们只能 自己编译一个pdo_mysql.so

下载源码 pdo_mysql

1
[root@VM_0_14_centos think]# wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz

解压

1
[root@VM_0_14_centos think]# tar -zxvf PDO_MYSQL-1.0.2.tgz

进入解压后的目录

1
[root@VM_0_14_centos think]# cd -zxvf PDO_MYSQL-1.0.2

执行 phpize
先查找路径,然后执行

1
2
3
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# whereis phpize
phpize: /usr/bin/phpize /usr/share/man/man1/phpize.1.gz
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# /usr/bin/phpize

如果这个过程发现如下错误

1
2
3
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# /usr/bin/phpize 
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.

就先继续安装php-devel

1
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# yum install php56w-devel

注意要安装和php版本一致的php-devel
比如php5.5版本,则安装php55w-devel
比如php5.6版本,则安装php56w-devel
安装完之后,继续 /usr/bin/phpize 执行

生成makefile
执行.configure命令

1
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# ./configure --with-php-config=/usr/bin/php-config --with-pdo-mysql=/usr/bin/mysql

这里就几点注意下
1、–with-php-config 和 –with-pdo-mysql 这两个参数必须添加
2、–width-php-config 是php-config的路径,可以通过whereis php-config查找
3、–with-pdo-mysql 是mysql的路径,同样whereis mysql查找

make编译

1
2
3
4
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# make
...
fatal error: mysql.h: No such file or directory
...

出现类似这样的错误,找不到mysql.h头文件,但是其实头文件是有,只是没找到而已

我们可以编一个软连接,先查找下相关路径

1
2
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# whereis mysql
mysql: /usr/bin/mysql /usr/lib64/mysql /usr/include/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz

对,就是 /usr/include/mysql

1
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# ln -s /usr/include/mysql/* /usr/local/include/

继续执行 make

make install

1
2
[root@VM_0_14_centos PDO_MYSQL-1.0.2]# make install
Installing shared extensions: /usr/lib64/php/modules/

ok,最后我们成功编译了一个 pdo_mysql.so,在php共享库路径也可以查到,最后我们还要修改下 /etc/php.d/ 让PHP自动加载这个动态库

在 /etc/phd.d/ 目录生成一个 pdo_mysql.ini 文件

1
2
; Enable pdo_mysql extension module
extension=pdo_mysql.so

重启Nginx、php-fpm服务,即可生效

成功,连接数据库

坚持原创技术分享,谢谢鼓励我继续创作!