日期:2011-05-02 15:44:00 来源:本站整理
MySQL数据库技术(28)[MySQL防范]
本文“MySQL数据库技术(28)[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
?? 5.2 挑选API
? ? 本节介绍按照各种范例的利用程序挑选A P I的办法,对比C、DBI 和PHP API 的本领,并给出它们相对的长处和缺陷,并指出什么时刻应挑选哪一个.
? ? 首先应当指出,笔者不认为任一种语言优于其他语言.固然笔者的确有自己的爱好,但还是通通利用它们.您也会有自己的爱好,像我的评论家一样.一个评论家会感受应当夸大C 对MySQL 编程的重要性,应将这种重要性上升到更重要的程度,而另一个评论家会认为C
编程相当艰难,应放弃利用它!您该当衡量本节中谈论的这些因素,得出自己的结论.在对特定任务挑选哪个API 时,要考虑以下问题:
? ? ■ 预期的履行环境.盼望利用利用程序的上下文环境.
? ? ■ 性能.当在API 语言中编写时,若何使利用程序高效地履行.
? ? ■ 开辟的简单性.若何便于API 和它的语言编写利用程序.
? ? ■ 可移植性.除MySQL 以外,利用程序能否还将用于其他数据库系统.
? ? 下面进一步解析每个问题.要注意这些因素的彼此影响.比方,您想要一个运行杰出的利用程序,但利用一个可快速开辟该利用程序的语言也平等重要,即便该利用程序不能非常有效地运行也一样.
? ? 5.2.1 履行环境
? ? 当编写利用程序时,普通应考虑利用哪类环境.比方,该利用程序大概是从外壳程序中调用的报告生成器程序,或一个对付账目概要程序,在每月的月底作为cron job 举行运行.从外壳程序或cron 程序中运行的号令普通依靠它们自己,并且很少需求运行环境.别的,可以编写一个利用程序来试图由Web 服务器调用.这样的程序盼望能从它的运行环境中抽出非常特别范例的信息:客户正在利用什么浏览器?在邮件清单定阅恳求格局中输入什么参数?客户供应精确的口令拜候我们个人信息了吗?每种API 语言都以它在这些差别的环境中适于编写利用程序而改变:
? ? ■C 是通用目标的语言,从理论上讲任何任务都可以利用它.在实际中, C 偏向于用于更频繁的独立程序而不是对Web 的编程.其缘由大概是在C 中不像在Perl 或在PHP 中那样简单地实现文本处理和内存管理,并且这些处理和管理在Web 利用程序中大量地利用.
? ? ■ P e r l,像C 一样,合适于编写独立的程序.但是,关于Web 站点的开辟,Perl 也是非常有效的,比方通过利用CGI.pm 模块.这使Perl 成为编写衔接MySQL 和Web 的利用程序的便利的语言.这样的利用程序可以经CGI.pm 模块与Web 接口,并可以利用DBI 与MySQL 彼此作用.
? ? ■ PHP 是计划用来编写Web 利用程序的语言,所以这个环境明显是最合适的.并且,数据库拜候是PHP 最大的上风之一,所以它是实现与MySQL 相关的任务的Web 利用程序最自然的挑选.也可以将PHP 作为一个独立的注释程序(比方,从外壳程序中运行脚本),但不能非常频繁地利用它.
? ? 按照以上这些需求考虑的问题,关于独立的利用程序, C 和Perl 是最佳语言.关于We b利用程序, Perl 和PHP 是最符合的.假如需求编写这两种范例的利用程序,但又不会利用这些语言的任何一种,并想用尽大概少的精神来学习,则Perl 大概是您最佳的挑选.
? ? 5.2.2 性能
? ? 我们普通喜好利用程序尽大概快地运行.但是,实际上性能的重要性取决于所利用的程序的频率.关于一个月运行一次晚上按时工作的程序,性能大概不是非常重要的.而关于在Web 站点上一秒钟运行若干次的程序,则每当解除一点无效性城市带来宏大的差别.后一种
情形下,在站点的有效性和恳求中,性能施展侧重要的作用.一个迟钝的站点是令用户苦恼的,无论站点的内容若何,假如您依靠站点作为一项收入根源,则性能的降低直接影响收入.假如不能一次为多个衔接供应服务,拜候者只会产生讨厌情感而去其他的站点.
? ? 性能评价是一个复杂的问题.当编写特定的API 时,利用程序完成得好坏的最好指标是在这个API 环境下编写并举行测试.并且最好的对比测试是在差别的API 环境下多次运行该利用程序,来对比每个版本.当然,那不是普通的工作.普通来说,您只想获得编写的利用
程序.一旦它工作了,假如它需求运行得更快,您便可以考虑优化它,利用更少的内存,或有某些需求用其他办法提高的方面.但是,至少有以下两个因素会影响性能:
? ? ■ 编译的程序比注释的程序运行得更快.
? ? ■ 关于在Web 上下文环境中利用的注释语言,在注释程序作为We b服务器自身的一部份而不是单独的历程模块被调用时,性能更好.
? ? 1. 相关于注释语言的编译语言
? ? 编译的利用程序比用脚本语言编写的程序的一样版本效率更高、利用的内存更少,并且履行得更快,这是基本规律.这是由于履行脚本的语言的注释程序的开销问题.因为C 是编译的,而Perl 和PHP 是注释的,所以C 程序普通比Perl 或PHP 脚本运行得更快一些.关于大量利用的程序,普通用C 是最好的挑选.在MySQL 分发包中包含的mysql 号令行客户机程序就是最好的样例.
? ? 当然,有一些因素能使这种明显的差别减小.关于一项任务,可用C 编写出更快的程序,但也很有大概编写出低效率的C 程序.用编译语言编写的程序并不自动地保证更好的性能.所以需求不断地考虑所做的事情.此外,假如一个脚本化的利用程序需耗费大部份时间来履行衔接到注释程序引擎的MySQL 客户机库例程的代码,则编译程序和注释程序之间的差别将有所削减.
? ? 2. 相关于语言注释程序模块版本的独立程序
? ? 关于基于Web 的利用程序,脚本语言注释程序普通以两种情势之一来利用,至少对Apache 是这样,当编写Web 利用程序时,Apache 是我们将利用的Web 服务器:
? ? ■ 可以安置Apache 去调用这个注释程序作为单独的历程.当Apache 需求运行Perl 或PHP 脚本时,它启动呼应的程序,并奉告它来履行该脚本.在这种情形下, Apache 利用该注释程序作为CGI 程序,也就是说,它利用大众网关接口( Common Gateway Inter face,CGI)协议与它们通信.
? ? ■ 注释程序可用作直接衔接到Apache 二进制程序和作为其历程自身的一部份运行的模块.在Apache 条件下, Perl 和PHP 注释程序得到mod_perl 和mod_php3 模块的情势.
? ? Perl 和PHP 的倡导者们极力宣扬注释程序有速度上风,但全部的人都赞成之所以喜好注释程序是因为其运行的情势比语言本身有更大的引诱力.在这二者中,注释程序作为模块运行比作为独立的CGI 利用程序运行更快.
? ? 关于独立的利用程序,每当运行一个脚本时都必须启动该注释程序,所以将招致庞大的成立历程的开销.当在已经运行Apache 历程的内部作为模块利用时,注释程序可以当即从Web 页面中拜候.通过削减开销明显地提高了性能,并直接转换为快速处理获得的恳求并发
送它们的本领的增添.
? ? 独立注释程序启动的性能比模块注释程序的性能至少差一个数目级.当考虑Web 页面服务包含少量处理的快速事件处理而不是具有很多处理时,注释程序启动的开销分外重要.假如耗费很多时间只是为了启动而不是用于实际履行该脚本,则大部份资源一向处于等候状况.一天中的大部份时间大概耗费在预备工作上, 4 点到达,然后5 点回家.
? ? 您大概想知道,为什么注释程序的模块版本由于必须一向启动Apache 而能节俭时间呢?.这个缘由是,当Apache 启动时,它当即产生一些子历程,用于处理收到的恳求.当包含脚本履行的恳求到达时,已经有Apache 进程在预备等候去处理它.一样, Apache 的每个实例可服务于多个恳求,所以该进程启动的开销只招致每组恳求一次,而不是每个恳求一次.
? ? 当Perl 和PHP 以模块情势安装时(像mod_perl 和m o d _ p h p 3),哪一个完成得更好一些?那就是争辩的主题,以下是实用于普通性的指南:
? ? ■ Perl 将脚本转换为内部可编译的情势;而PHP 却不这样.因此,一旦该脚本通过语法解析,则Perl 可更快地履行它,分外是关于具有大量迭代的循环.
? ? ■ mod_perl 可以运行脚本高速缓存来提高反复履行的脚本的性能.假如脚本在高速缓存中,则Perl 可更快地开始履行脚本,因为它不需求再一次解析.不然, PHP 开始履行的该脚本的速度更快.
? ? ■ mod_perl 比PHP 有更大的内存覆盖区;操纵mod_perl 衔接的Apache 进程比操纵mod_php3 的更大.PHP 被假定必须在另一个进程的内部协同存在,并且在那个进程内部可以多次激活或撤消.Perl 被计划成从号令行作为独立程序运行,而不是作为被嵌入在Web 服务器进程中的一个语言举行运行.这大概使它付出较大的内存覆盖区;
? ? Perl是模块,因此它不运行在自身环境中.脚本的高速缓存和该脚本利用的附加P e r l模块是付出较大的内存覆盖区的别的的因素.在这两种情形下,有更多的代码利用内存,并将运行的Apache 进程保存在内存中.
? ? 在脚本运行速度方面,Perl 无论有什么可超越PHP 的上风,都被PHP 4 撤除了.PHP 4 在它的本领和接口方面近似于PHP 3,但它归并了Zend,Zend 是一种更高性能的注释程序的引擎.
? ? 无论若何,全部的这些因素只招致Perl 和PHP 的模块版本之间性能比差别.无论您挑选哪类语言,最重要的是尽大概地避免独立的注释程序.
? ? 注释程序的独立版本的确有一个长处超越它的模块版本,便可以安置它在差别的用户I D下运行.模块版本始终运行在与Web 服务器相同的用户ID 下,出于安全缘由,该用户是一个典型的具有很少权限的账号.关于需求特别权限的脚本来说不能很好地运行(比方,假如您需求能读写受保护的文件).假如乐意,可以将模块办法和独立办法结合起来:缺省情形下利用模块版本,而在具有特定用户的权限的脚本的情形下利用独立版本.
? ? 降低mod_perl 的内存需求
? ? 有些技术答应您只能对mod_perl 利用某些的Apache 进程.这样,只对运行Perl 脚本的那些进程产生额外的内存开销.Apache Web 站点的mod_perl 部份有可挑选的各种战略的谈论(有关的具体信息,请参阅h t t p : / / p e r l . a p a c h e . o rg / g u i d e /).综上考虑,也就是说,挑选Perl 还是P H P,您应当试着从Apache 模块中而不是通过调用一个单独的注释程序历程来利用它.只对不能由模块处理的那些情形利用独立的注释程序,比方需求特别权限的脚本.关于这些实例,可以通过利用Apache 的suEXEC 机制在给定的用户ID 下启动注释程序来处理脚本.
? ? 5.2.3 开辟时间
? ? 方才描写的这些因素影呼利用程序的性能,但不能只考虑运行效率.时间及编程的简易性也是重要的,所认为MySQL 编程挑选API 时要考虑的另一个因素是若何很快地开辟出自己的利用程序.假如开辟一样程序,用P e r l脚本只需用C 语言一半的时间,那您大概甘愿利用Perl DBI API,而非C API,即便开辟出的利用程序运行速度不是非常快也如此.考虑程序的运行时间比考虑编写程序时花的时间更少一些普通是公道的,分外是对不常常运行的利用程序更是如此.您的一小时比机械的一小时要值钱得多!
? ? 普通来说,脚本语言编写程序更快,分外是得到利用程序的原型更快,这是由于以下两个缘由:
? ? 第一,脚本语言供应更高级别的构造.这答应您在抽象的更高级别上举行考虑,以便集合考虑要做些什么,而不是考虑若何做.比方, Perl 的关联数组(散列)关于保护具有键/值系(如学生I D /学生姓名对)的数据节俭了大量时间.C 没有这样的构造.假如想在C 中实现这样的事情,则大概需求编写代码来处理很多初级的细节,此中包含内存管理和串操作的问题,并且需求调试它,这也要花时间.
? ? 第二,脚本语言的开辟周期的步骤较少.用C 开辟利用程序时,要阅历普通的编辑—编译—测试的循环周期.每次改正程序时,在测试之前都必须重新编译它.而用Perl 和P H P,由于每次改正后不用编译便可以当即运行脚本,因此,开辟周期可简化为编辑—测试.另一方面,编译程序对程序在严峻的范例查抄情势方面有更多的约束条件.编译程序施加的更多约束条件有助于避免在疏松语言(如Perl 和P H P )中不易捕捉的错误.在C 中,假如您错误地拼写了变量的名称,则编译程序将告诫您.PHP 不这样,Perl 也不这样,除非向它询问.当利用程序变得更大且更难于保护时,这些更严峻的约束条件大概分外有效.
? ? 普通来说,在编译和注释语言之间衡量的是开辟时间与性能的折衷:是想要利用编译语言开辟程序,以便在运行时可以更快,但耗费更多的时间来编写它?还是想要用脚本语言编写程序,以便在缩短编程时间,但要丧失一些运行速度?
? ? 将两种办法归并起来也是大概的.编写一个脚本作为"第一个草案"来快速地开辟出一个利用程序原型以测试其逻辑性,肯定算法的可用性.假如这个程序有效,并且被频繁利用,则性能成为关心的核心,这时可作为编译的利用程序重新对它编写代码.这样做给您带来两种办法的长处:快速得到利用程序的初始开辟原型,同时得到终究产品的最佳性能.从某种严峻的意义来说, Perl DBI 和PHP API 并没有给您在C 客户机库中没有的本领.这是因为这两种API 通过MySQL C 库衔接到Perl 和PHP 注释程序来获得对MySQL 的拜候.但是,关于嵌入MySQL 的环境,C 与Perl 或PHP 有很大的差别.应考虑在与MySQL服务器彼此作用时要做的事情并发问每个API 语言若何帮忙您完成这些事情.下面有一些样例:
? ? ■ 内存管理.在C中,您发现自己对任何任务,包含动态分配数据构造都利用malloc() 和free() 来工作.Perl 和PHP 可为您处理这些任务.比方,数组的大小自动地增添,并且可以利用动态长度的字符串而不用考虑内存管理.
? ? ■ 文本处理.在这点Perl 具有最大的开辟本领,而PHP 位于第二.对比起来,C 是非常初级的.当然,可以用C编写自己的库,将内存管理和文本处理这样一些任务封装成更简单工作的函数.但是,然后还必须调试它们,并且您也想使自己的算法效率更高.在这两个方面,基本上可以断定,由于它们已经具有了通过很多双眼睛查抄过的好处,对这些事情Perl 和P H P中的算法普通是易于调试并且有公道的效率.通过操纵其他人的工作可以节俭您的时间(另一方面,假如注释程序无意有一个错误,您大概必须携带它,直到这个问题改正为止.而用C 编写时,可以更细地掌握程序性能).
? ? 这些语言的差别还在于它们的"安全性".C API 供应对服务器最初级别的接口,并且强迫的原则最少.从这种意义上说,它供应最初级的安全性网络.假如您超越正常次序履行API 函数,则大概得到一个"超越同步"的错误,或使程序崩溃.Perl 和PHP 都供应了很好的保护.假如您没有以得当的次序举行,则脚本失利,但是注释程序并不崩溃.在C 程序中,呈现崩溃错误的另一个非常大概的根源是动态分配内存和与它们相关的指针的利用.Perl 和PHP 为您处理内存管理,所以您的脚本很少大概因为内存管理的错误而瘫痪.
? ? 开辟时间受语言可用的外部支持的影响.C 可用的外部支持是将MySQL C API 函数封装为更简单利用的实例的包装库的情势.这些库关于C 和C++ 都可用.Perl 无疑具有最大数目的附加软件,都是Perl 模块的情势(与在Apache 模块中具有的概念近似).乃至有一个底子构造被计划来简单地定位并获得这些模块(即综合Perl 归档网络Comprehensive Perl Archive Network, CPA N).利用Perl 模块,不用编写代码便可以获得对全部范例的函数的拜候.想要编写从数据库中生成报告的脚本,然后作为一个附件发送给某人吗?只要获得MIME 模块中的一个,就当即具有附件生成的本领.
? ? PHP 没有一样程度的外部支持(这并不令人诧异,因为它是较新的语言).大概所知道的最佳的附加软件是P H P基本库( PHP Base Library,PHP LIB).按照名称和口令机制的一些排序,假定您正在编写需求限定只有经受权的用户才可以对某个Web 页面拜候的Web 利用程序.可以用肆意语言编写对它的支持程序,但是假如利用P H P L I B,则没必要耗费时间重新做这件事情.P H P L I B供应确认并且答应通过会话跟踪经受权的用户(从作为单个逻辑拜候部份的给定客户机中持续页面的命中).还可以分配给用户答应权,这答应您举行像定义具有更多权限的管理用户的工作.
? ? 5.2.4 可移植性
? ? 可移植性的问题与为拜候MySQL 引擎所编写的程序怎样才能简单地改正成利用差别引擎的程序有关.您大概不耽忧这个事情.但是,除非可以预知将来,不然,说"除了MySQL以外,我永久都不会将这个程序用在任何其他的数据库上"大概有些冒险:假定您找到另一
份工作,并想利用自己的旧程序,但您的新老板利用差别的数据库系统呢?假如可移植性是需求优先考虑的事情,则应当考虑在API 之间的辨别:
? ? ■ DBI API的可移植性最好,因为它独立于数据库是DBI 计划的一个明确目标.
? ? ■ PHP 的可移植性稍差,因为它不供应对DBI 供应的各种数据库引擎的一样范例的统一接口.对每个支持数据库的PHP 函数的调用近似于在呼应的底子C API 中的那些.稍有一些差别,但很少,需求更改您调用的数据库相关函数的名称.还有大概要改正一点利用程序的逻辑,因为差别数据库的捏词并不都是以一样的方法工作的.
? ? ■ C API 供应的数据库之间的可移植性最差.因为它生来就是为MySQL 计划的.当需求在同一个利用程序中拜候多个数据库系统时,独立于数据库的可移植性分外重要.这大概包含像将数据从一个RDBMS 移动到另一个RDBMS 中的简单任务,或更复杂的任务,如基于从许大都据库系统中得到的信息生成报告.
? ? DBI 和PHP 都供应对拜候多个数据库引擎的支持,所以对差别的数据库,乃至在差别的主机上,都可以很简单地同时衔接到服务器上.但是, DBI 和PHP 在关于从多个异构数据库系统中检索和处理数据的任务的适合性方面有所差别.而DBI 更好些,因为无论利用哪类数据库,它都利用一组单独的拜候调用.假定想在MySQL、mSQL 和Postgres 数据库之间传送数据.利用DBI,则利用这三种数据库的惟一差别之处在于用于衔接到每个服务器的DBI -> connect( )调用.而用PHP时,大概需求有更复杂的脚本,该脚本将含有三组读取调用和三组写入调用.
? ? 大都据库利用程序的一个极好的例子是MySQL 分发包中的crash-me 脚本,它可测试很多差别的数据库服务器的本领.该脚本是用D B I编写的,关于这样的利用程序,这种挑选是很明显的,因为您可以一样的方法拜候全部的数据库. 以上是“MySQL数据库技术(28)[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论