PHP最佳实践:MySQL的连接

标签: PHP | 发表时间:2014-11-25 23:16 | 作者:标点符
出处:http://www.blogread.cn/it/

标签:   MySQL连接

从PHP 5.5版本开始, mysql函数将被官方废弃,即所有 mysql_* 格式函数 将在5.5版本后当产生一个 E_DEPRECATED 错误。废弃mysql函数的主要原因为:此函数为 的MySQL  3.23版本开发的,而目前的MySQL版本已经到了 5.6,中间产生了非常多的特性没有被函数所支持。

1、预处理语句(Prepared statements)

许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。你可以把它们想成是一种编译过的要执行的SQL语句模板,可以使用不同的变量参数定制它。预处理语句具有两个主要的优点:

  1. 查询只需要被解析(或准备)一次,但可以使用相同或不同的参数执行多次。当查询准备好(Prepared)之后,数据库就会分析,编译并优化它要执行查询的计划。对于复杂查询来说,如果你要重复执行许多次有不同参数的但结构相同的查询,这个过程会占用大量的时间,使得你的应用变慢。通过使用一个预处理语句你就可以避免重复分析、编译、优化的环节。简单来说,预处理语句使用更少的资源,执行速度也就更快。

  2. Prepared Statements通过sql逻辑与数据的分离来增加安全,sql逻辑与数据的分离能防止普通类型的sql注入攻击。传给预处理语句的参数不需要使用引号,底层驱动会为你处理这个。如果你的应用独占地使用预处理语句,你就可以确信没有SQL注入会发生。(如果你仍然在用基于不受信任的输入来构建查询的其他部分,这仍然是具有风险的)。

从 5.1开始,mysql支持服务器端的Prepared Statements,MySQL prepare语法:

  1. PREPARE statement_name FROM preparable_SQL_statement; /*定义*/

  2. EXECUTE statement_name [ USING @var_name [, @var_name] …]; /*执行预处理语句*/

  3. {DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;

2、事务(Transactions)

事务是操作数据的一个单元,是恢复和并发控制的基本单位。例如,用户A给用户B通过ATM机转账1000元,那么A账户上就会少1000元,而B用户会多1000元。在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。使用数据库事务可以确保除事务性单元内的所有操作都成功完成。MySQL中的InnoDB引擎的表才支持transaction,如果是MyISAM引擎的表暂不支持。

数据库事务的特性:

  • 原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

  • 一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。

  • 隔离性:由发并事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

  • 持久性:事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

3、存储过程(Stored procedures)

储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命令,需要使用的时候拿出来用就可以了。

储存过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

存储过程的优点:

  1. 存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

  2. 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

  3. 存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

  4. 存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

  5. 存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

存储过程的缺点

  1. 预存程序的性能调校与撰写,受限于各种数据库系统。MySQL没有提供很好的开发和调试工具,这点SQL Server做的更好;

  2. 可用函数有限,很难写出非常复杂的查询;

  3. 预存程序,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的预存程序。

  4. 目前还无法确定在高并发(百万或者千万级)下存储过程是否会严重影响数据库性能。

4、异步查询(Asynchronous queries)

对于服务器来说,最好的情况就是IO不被阻塞(non-blocking),这样才能充分利用带宽。缺省情况下,mysql使用的是同步操作,如果一个查询在服务器上需要花费10秒钟,你调用函数就会阻塞10秒钟。为了使用异步的功能,我们需要在建立链接或者在prepare的时候加上async选项。

5、多语句执行(Multiple statements)

通常情况MySQL出于安全考虑不允许一次执行多条语句。MySQL 5.1支持在单个查询字符串中指定的多语句的执行。要想与给定的连接一起使用该功能,打开连接时,必须将标志参数中的选项指定。

使用PDO_MYSQL链接数据库

要实现以上的特性,就需要用到新的 MySQLiPDO_MySQL 扩展作为替代。在这里要推荐的是PDO_MySQL。

PDO - PHP Data Objects - 是一个对多种数据库提供统一操作方法的数据库访问层。它并不具备数据库特有的语法,但它将使切换数据库和平台更加容易,多数情况下,只需要简单修改链接字符串。此扩展可以使用 PDO 驱动编写过的所有数据库。下面的数据库支持已经实现:

  • PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase )

  • PDO_FIREBIRD ( Firebird/Interbase 6 )

  • PDO_IBM ( IBM DB2 )

  • PDO_INFORMIX ( IBM Informix Dynamic Server )

  • PDO_MYSQL ( MySQL 3.x/4.x/5.x )

  • PDO_OCI ( Oracle Call Interface )

  • PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) )

  • PDO_PGSQL ( PostgreSQL )

  • PDO_SQLITE ( SQLite 3 and SQLite 2 )

  • PDO_4D ( 4D )

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。 PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

PHP PDO的目标是:提供一种轻型、清晰、方便的 API ,统一各种不同 RDBMS 库的共有特性,但不排除更高级的特性。 通过 PHP 脚本提供可选的较大程度的抽象/兼容性。

PHP PDO类的特点:

  • 性能。PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训。因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性。

  • 能力。PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问。

  • 简单。PDO 旨在使您能够轻松使用数据库。API 不会强行介入您的代码,同时会清楚地表明每个函数调用的过程。

  • 运行时可扩展。PDO 扩展是模块化的,使您能够在运行时为您的数据库后端加载驱动程序,而不必重新编译或重新安装整个 PHP 程序。例如,PDO_OCI 扩展会替代 PDO 扩展实现 oracle 数据库 API。还有一些用于 MySQL、PostgreSQL、ODBC 和 Firebird 的驱动程序,更多的驱动程序尚在开发。

参考资料: http://www.php.net/manual/zh/book.pdo.php

您可能还对下面的文章感兴趣:

很抱歉,暂时没有......

相关 [php 最佳实践 mysql] 推荐:

PHP最佳实践:MySQL的连接

- - IT技术博客大学习
标签:   MySQL连接. 从PHP 5.5版本开始, mysql函数将被官方废弃,即所有 mysql_* 格式函数 将在5.5版本后当产生一个. E_DEPRECATED 错误. 废弃mysql函数的主要原因为:此函数为 的MySQL  3.23版本开发的,而目前的MySQL版本已经到了 5.6,中间产生了非常多的特性没有被函数所支持.

PHP最佳实践

- xiangqian - 阮一峰的网络日志
虽然名字叫《PHP最佳实践》,但是它主要谈的不是编程规则,而是PHP应用程序的合理架构. 它提供了一种逻辑和数据分离的架构模式,属于MVC模式的一种实践. 我觉得,这是很有参考价值的学习资料,类似的文章网上并不多,所以一边学习,一边就把它翻译了出来. 根据自己的理解,我总结了它的MVC模式的实现方式(详细解释见译文):.

PHP最佳实践(译)

- - CSDN博客Web前端推荐文章
原文:  PHP Best Practices-A short, practical guide for common and confusing PHP tasks. 译者: youngsterxyf. 本文档最后审阅于2013年3月8日. 由我, Alex Cabal,维护该文档. 我编写PHP程序已有很长一段时间了,当前我 经营着 Scribophile,由认真作家组成的一个在线写作团体,  Writerfolio,为自由职业者提供的一个易用写作工具集,以及  Standard Ebooks,一个图文并茂、无数字版权管理的公共领域电子书出版商.

2012DTCC – MySQL性能调优最佳实践

- - Sky.Jian 朝阳的天空
上周受邀于 IT168,在 2012年度的 DTCC 大会上做了一个小的主题分享,内容主要是最近几年在 MySQL 数据库的性能调优过程中积累的一点点经验总结,希望能对大家有用. 其中部分内容在之前的 第二届华东地区数据库大会 上已经有过分享,这次是在当时分享内容的基础上增加了硬件和系统层面的内容,同时根据听众反馈对原有内容进行了部分优化改进.

php mysql读写分离

- - 开源软件 - ITeye博客

MySQL与OLAP:分析型SQL查询最佳实践探索

- - Web前端 - ITeye博客
搞点多维分析,糙快猛的解决方案就是使用ROLAP(关系型OLAP)了. 数据经维度建模后存储在MySQL,ROLAP引擎(比如开源的Mondrian)负责将OLAP请求转化为SQL语句提交给数据库. OLAP计算分析功能导致MySQL需要进行较多复杂SQL查询,性能调优必不可少,本文总结了一些实用原则.

CentOS 6下搭建Apache+MySQL+PHP+SSL

- 〤依然特雷西 - 博客园-首页原创精华区
网上的一些文章都已经比较老了,现在版本高了之后,其实配置是很省力的(不考虑什么负载的话). 分享全过程,出了文中提到的安装epel rpmfushion 源指令不同外,其他的过程也适用与Centos 5. 1.安装CentOS 6 ,可以选择最小安装,也可以安装桌面. 3.安装mysql,并设置mysql开机自启动,同时启动mysql.

PHP查询MySQL大量数据的内存占用分析

- Avenger - OurMySQL
这篇文章主要是从原理, 手册和源码分析在PHP中查询MySQL返回大量结果时, 内存占用的问题, 同时对使用MySQL C API也有涉及.. 昨天, 有同事在PHP讨论群里提到, 他做的一个项目由于MySQL查询返回的结果太多(达10万条), 从而导致PHP内存不够用. 所以, 他问, 在执行下面的代码遍历返回的MySQL结果之前, 数据是否已经在内存中了.

PHP+MySQL环境下SQL Injection攻防总结

- rokeyhu - 老王的技术手册 ( 我的新博客:http://huoding.com )
程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过. 其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报错,然后一点一点的修正参数内容,当程序再次运行成功之时,注入也就随之成功了. 假设你的程序里有类似下面内容的脚本:.

php+mysql+memcache实战型技术测试(答案公布)

- 逆风迎上 - caoz的和谐blog
出两个变态的题目,题目很变态,但是都是实战中遇到的真实案例,. 1:我写一个程序,既要使用mysql也要使用memcache,. 第一行是 mysql_connect,第二行是memcache_connect. 换过来写,第一行是memcache_connect,第二行是mysql_connect.