PHP为什么要连接数据库呢?
如果首次接触PHP,会有这样的疑问。
当然,也可以不连接数据库,PHP程序也可以正常运行。
PHP程序代码,只负责业务逻辑的处理,对于输入的数据进行计算并输出结果。
比如,你给一段计算和值的代码输入1,2….10,程序计算完并返回结果55。
此时,如果想把这个计算过程中,输入数据和输出数据存储下来,就需要数据库了。
PHP可以连接哪些数据库?
只要数据库和程序之间有相应的统一接口,就可以连接,常见的MySQL, PostgreSQL,SQL Server,Oracle,MongoDB,Redis都可以连接,其中以MySQL使用最为广泛。
PHP程序如何与MySQL数据库交互?
PHP与MySQL是互相独立的软件,两者若要进行数据交互,
就必须相互暴露相关的API,这些API通常是基于各自源码开发的扩展程序。
PHP与数据库进行数据交互,主要有以下三种扩展:
1) mysql扩展
2) mysqli扩展
3) PDO_MYSQL扩展
上面3种扩展都是基于PHP核心代码编写的扩展库, 都有对应的库函数和类。
上面3种扩展连接数据库服务器,可以使用以下2种数据库驱动:
- MySQL Client Library [ libmysql ]
- MySQL Native Driver [mysqlnd ]
注意,这两个库是底层的,直接和数据库服务器交互的,没有提供PHP代码编程接口,是安装PHP的时候就指定的。
php扩展-libmysql关系图[1]
注意:
自PHP5.4.x,默认的驱动由libmysql变为mysqlnd,自PHP 5.5.0 libmysql被废弃,自PHP 7.0.0 libmysql开始被移除,这是因为mysqlnd是由PHP官方发布的新一代驱动程序,之前的libmysql的由MySQL AB发布,从而规避了版权问题,这只是一方面的原因,mysqlnd是直接集成在PHP源码中的,使用PHP的内存管理系统,支持PHP的内存限制,比libmysql有更快执行速度和更少的内存使用率。
PHP mysqlnd数据库驱动结构图
mysqlnd和libmysql在内存占用上的对比:
可以看到,libmysql查询的数据在内存中存储了2份,而mysqlnd只存储了一份。
使用mysqlnd,运行PHP的主机可以不用安装数据库,而之前使用libmysql这是必须的。
mysqlnd还有更多特性,例如,增强的持续连接,SSL支持等,所以是时候抛弃libmysql了。
PHP连接MySQL数据库代码示例:
<?php // mysqli $mysqli = new mysqli("example.com", "user", "password", "database"); $result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL"); $row = $result->fetch_assoc(); echo htmlentities($row['_message']); // PDO $pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password'); $statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL"); $row = $statement->fetch(PDO::FETCH_ASSOC); echo htmlentities($row['_message']); // mysql $c = mysql_connect("example.com", "user", "password"); mysql_select_db("database"); $result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL"); $row = mysql_fetch_assoc($result); echo htmlentities($row['_message']); ?>
- mysqli扩展提供了丰富的面向对象编程模式来操作数据库的方式,比只支持函数式编程的mysql扩展好很多。
- PDO方式虽然在编程上稍复杂一点,程序效率稍慢点,但是当业务的数据库类型变化时,基本上不用修改代码,因为它为各个不同的数据库定义了一个统一的接口。
- mysql_connect方式的连接已经淘汰了。
参考资料
[1] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
[2] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
[3] Andrey Hristov <andrey@mysql.com>