网站建设时php代码优化技巧
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语言php由于是脚本语言,在运行时才对高级语言代码解释执行,运行脚本执行所以跟编译语言(如C)比起来php的效率比较低,稍复杂编译语言比较效率的程序执行起来就需要消耗较多的时间。
作为网页服务器服务器需要消耗时,低效率意味着消耗更多的服务器资源。
所以,有必要服务器消耗必要通过优化php程序代码来提高效率,减小服务器资源消耗。
服务器消耗效率(当然如果你的程序本来就消耗很少执行时间或者你的服消耗执行如果务器足够强,那就不一定要进行优化了)
网上很多文章介绍优化php程序,是通过安装Zend Optimizer之类的加optim网上之类速软件实现的,但具体网站建设时这种加速是有限的。
本文主要从程序代主要本文这种码着手介绍一些优化思路和手段。
程序的抽象层越多,各抽象层分离得越严格,程序效率越严格效率抽象低。
网站建设时最原始的应用于网页的php程序模式莫过于脚本嵌入模式,莫过于应用模式即仅仅在一个网页中需要动态处理或显示数据的地方通过需要数据显示
加入<?php和?>标识符嵌入php脚本。
一般来说这是php程序员一般来说程序员标识符最早学习的模式,它只有一个抽象层,就是网页,故本文学习本文模式称其为单层模式。
网站建设时随着网站规模逐渐增大,程序员可能会发现单层模式很难维护,想对程序修改或扩充功能时,会发现代码维护修改非常混乱,感觉无从下手。
于是模板类诞生了,它使得一无从下手的网页由两个文件组成:一个php程序文件,一个html模板文组成模板网页件。
常用的模板类有PHPLib库带的Template模板类,Smarty模板类等。
由templat smarti phplib于加入了额外的处理程序(模板类),程序效率下降了。
其实一般情况下,不用函数(一般自己情况最原始的编程方法)比用函数(面向过程)的效率高,而原始效率方法用函数的效率又比对象封装(面向对象)高。
所以就算在封装效率所以编译语言中,需要高效率的地方会用C写而不用C,例如编译语言需要例如FreeBSD操作系统的内核;而需要极端高效的地方还要用汇编写freebsd需要操作。
为了使程序可以适应多种数据库系统,或者方便随时转换数据库方便系统数据库系统,常常还会用一个类把跟数据库打交道的函数打交道数据库系统封装起来,这样当转换数据库系统时只要把封装类换掉就数据库这样封装行了,主程序不需要修改。
这里又用了一个类,效率又打主程序需要效率折扣了。
上述模板类的使用,使程序分成两个抽象层:程序层和表使用模板抽象现层。
而数据库类的使用又把程序层分为数据接口层和数数据库使用接口据处理层。
项目越庞大,需要分离的抽象层就越多,这样使得分工清这样需要分工晰,方便管理,但是以牺牲程序执行效率为代价。
对于抽象层造成的效率下降,优化的方法有二:减小抽象对于下降效率层、优化抽象层之间的接口。
一般地,不应该为了提高效之间接口一般率而盲目减小抽象层,这样会使得代码混乱、难于管理。
这样盲目混乱但是不应该为小项目建立过
多的抽象层,除非你有将来把建立将来应该它做得很大的计划。
关于如何恰当分割抽象层,本文不作本文关于分割更深入讨论。
对于上文说的两个分层例子,优化抽象层之间的接口分别对于之间接口是模板类和数据库操作类。
抽象层接口在程序中需要被频数据库需要操作繁调用,以在不同层之间交换信息,所以层接口是很值得之间接口值得优化的。
对于数据库接口类,可能仅仅是封装一些数据库数据库对于接口函数,优化余地恐怕不大。
对于模板类,很多时候是有较对于模板恐怕大优化余地的。
一般地,模板模型越通用,模板类功能越一般模板通用强大,效率就越低,例如PHPLib库带的Template
类就有极大的优化余templat phplib例如地。
而Smarty模板类比PHPLib的Template更复杂,我没有用过,据称有缓templat smarti phplib存机制,不知是否可以弥补其性能损耗。
下面就来看看PHPLibphplib下面损耗的Template 类有多少东西可以优化掉。
1.
读入模板文件时,file函数效率低,改用get_file_content函数。
2.
匹配子模板时,正则表达式替换函数preg_replace效率低,改用strreplac表达式模板_pos函数进行定位和用str_replace函数进行替换操作。
此优化手段replac操作进行后文会详细分析。
3.
模板模型通用性很强,能适应各种情况,但在具体细节的通用性细节各种处理上,通用的方法效率可能很低。
可以对模板模型作适模板可能效率当修改。
我的做法是建一个相对通用的模板类,然后再派模板做法通用生出一个只适用于特定程序的模板类。
在通用模板类的模模板适用通用板模型上可以作些优化(相对于PHPLib的Template),例如在处理二templat phplib例如维数据表的时候用PHPLib的Template处理就比较复杂(具体实现方法templat数据表phplib可参考《优化php嵌套模版》),需要多次调用类方法(本多次需要参考质上是函数调用),所以重写的时候可以把处理二维数据数据处理可以表的功能封装到一个高效率的方法中,直接避免方法的多封装效率方法次调用。
4.
调试功能在小项目上不需要用,跟调试相关的代码全部去需要代码项目掉。
我在按上面4点重写了模板类之后,一个复杂页面的执行执行页面上面时间缩小了一个数量级(除模板外没有作其它优化)。
现在就优化你的程序的抽象层之间的接口,特别是当这些之间这些现在接口是使用现成的函数或类的时候。
因为这些函数或类在使用接口这些设计时会为了适应普遍情况而牺牲一些效率,而且它们的设计效率一些作者也可能没有考虑效率问题。
像如此著名的PHPLib的模板类phplib问题模板的效率也不见得就高。
细节代码优化
优化代码不应总是祈求大刀阔斧式的优化,当大方面已经大刀阔斧已经方面无从入手时,不妨把视线转移到细节上。
1.
上文模板类优化已提到的,正则表达式匹配比一般字符串表达式字符串一般匹配慢得多,尽可能用字符串匹配而不用正则表达式匹配尽可能表达式字符串。
有时候虽然用正则表达式匹配使程序代码更简洁,而一有时候表达式虽然般字符串匹配使代码更冗繁,但很多时候字符串匹配仍比字符串代码很多正则表达式高效。
2.
字符串替换函数str_replace和preg_replace都是可以接受数组参数的。
有replac字符串参数时候需要对字符串进行批量替换,则用数组参数比循环调字符串需要参数用替换函数来得高效。
例如下面的代码:
1.for($i=0;$i<$n;$i){
2.$str=str_replace($search[$i],$replace[$i],$str);
3.}
应该换成:
1.$str=str_replace($search,$replace,$str);
注意:这里$search和$replace都是数组
str_replace和preg_replace的数组用法可参考PHP手册。
3.
对用于赋值的条件语句,可改用?:算符
这里仅举三个细节代码优化的方法。
实际上PHP程序还有很实际上细节这里多细节代码优化方法,要掌握这些方法,需要多看PHP手册细节需要掌握,多了解些函数。
在解决一些细节问题时,用不同的函数细节问题一些作不同的搭配,就产生不同的方法,对不同的方法应进行方法进行产生实际效率测试,得出优化方法。
面向对象、面向过程、类、函数、宏
尽管面向对象方法在程序设计中有很多优点(这里就不罗设计这里方法列了),但一般地说,面向对象程序的执行效率往往不如一般地说效率往往面向过程好,一个显然的理由是面向对象的程序往往要频繁调用对象的方法从而使代码简洁
明了,却降低了程序执简洁方法降低行效率。
对于中小型项目,为程序效率着想,最好在思想上,面向中小型对于思想对象与面向过程兼有,在代码上,类、函数、宏搭配使用使用代码函数。
这里提到一个可能对读者陌生的概念——宏(macro)。
在macro可能这里C语言中有宏,宏汇编中也有宏,但PHP中官方没有定义“ldquo官方定义;宏”的概念。
然而我们可以通过require函数和include函数实现宏的requir includ我们功能。
require和include通常用来在程序代码中包含函数库或类库等includ requir
通常文件,一般很少用来直接包含程序代码文件,因为包含程一般包含直接序代码有时会降低代码易读性。
当有一段代码需要在很多需要降低代码页面中都执行时,通常被想到的是把它打包为函数或封装封装通常执行为类。
但此法有缺点如下:
1.
降低程序效率。
因为增加了函数/类方法调用。
2.
有时此段嵌入代码较复杂,实现功能并不单纯,封进函数代码嵌入实现并不符合函数功能单纯的原则。
3.
有时嵌入代码需要与外部大量交换数据,如果封进函数会需要外部数据使参数表庞大,且处理函数的返回值也变得复杂。
4.
由于有2、3两点缺点,导致当嵌入代码与外部代码交换外部导致缺点的数据有所变化时,函数或类的接口的更改会变得麻烦。
更改接口数据
当遇上以上情况时,我建议使用宏,即把嵌入代码直接写使用建议情况入被包含文件中,供各页面包含。
但此时务必要清晰注释包含此时文件宏的调用方法,输入输出数据等,以弥补代码易读性的降输入数据方法低。
总之,面向对象、面向过程、类、函数、宏,这些都应根这些总之函数据具体实际情况而搭配使用,不应盲目死守某些原则。
SQL数据库
本来SQL数据库的优化不应归入PHP优化,但实际应用中PHP常数据库应用归入与SQL数据库配合构建网站,常用的数据库有MySQL、PostgreSQL等。
于postgresql数据库mysql是SQL查询的效率也直接影响PHP程序的效率,故本文也略为本文效率直接谈一谈。
1.
MySQL中,使用InnoDB或BDB表(支持事务)的效率比MyISAM表(不支持innodb myisam mysql事务)的效率低,尤其InnoDB表效率比MyISAM低很多,而BDB 表的主innodb myisam尤其要劣势在于占用磁盘空间比MyISAM表多很多,且不能查知每个myisam磁盘占用表占用磁盘空间的大小。
而对中小型应用,数据不一致性一致性中小型数据出现的概率是很微的,所以尽可使用MyISAM表提高效率。
(关myisam使用效率于MySQL数据表的更多讨论可参考《MySQL中三种数据表的对比》数据表mysql参考)
2.
恰当建立索引和存储冗余数据。
此话题太大故本文不打算冗余数据打算作详述。
3.
有些SQL查询仅需知道数据库中是否存在符合条件的行,故数据库条件有些只要查得一行,搜索即可结束。
所以对此类查询,可在SQL即可搜索结束句末加上LIMIT1使数据库一旦搜到满足条件的行即不再搜索数据库limit一旦。
4.
尽量少用JOIN,有些低效率的JOIN查询可通过存储冗余数据来冗余数据效率避免。
5.
有时候需要比较现在的时间与数据库某列的时间的差距,有时候数据库需要返回时间差距满足一定条件的行。
在MySQL 4.1之前,是没有mysql条件没有DATEDIFF函数的,但可以用DATE_ADD或DATE_SUB函数简洁实现,例如要返datediff简洁例如回xtime列距今超过10天的行,有两种写法:
法一:
1.SELECT somecolumn FROM sometable WHERE DATE_ADD(xtime,INTERVAL10DAY) <NOW()
法二:
1.SELECT somecolumn FROM sometable WHERE DATE_SUB(NOW(),INTERVAL10 DAY)>xtime
两种写法执行结果等效但效率不同。
如果xtime列建有索引,xtime等效效率则法一的写法无法使用索引,而法二的写法可以用索引,使用可以索引故应采用第二种写法提高效率。
除此之外,SQL数据库优化还大有学问。
延迟输出与缓冲
有时候有些页面无论如何也无法优化到需要的速度,此时无论如何有时候需要可以考虑使用延迟输出与缓冲的技术。
关于延迟输出,可参考《动态网页中慢数据的延迟输出》参考数据延迟,本文不再详述。
而缓冲也是一个大话题,故本文也不打算作详述,但作一打算本文话题简介。
常用的技术,按网站软件层次分,有网页服务软件的缓冲层次常用软件技术,例如Apache的缓冲技术;又有动态脚本的缓冲技术,例apach例如技术如用PHP 编程实现的缓冲技术。
此外又可分为静态缓冲技术和动态缓冲技术。
静态缓冲技技术动态静态术即把动态内容生成静态的html页面存于磁盘,客户端几乎客户几乎内容完全跟静态页面打交道,整个网站犹如一个静态网站。
而打交道犹如网站服务器后台在适当时候调用动态程序更新静态内容(重新服务器重新内容生成静态内容)。
动态缓冲技术则是客户端仍与动态页面客户技术内容打交道,而动态网页在接到客户请求时先检查是否有相应打交道请求客户的缓冲网页,如有,直接把该静态页输出到客户端,如无客户网页直接或缓冲页已过时,则重新生成缓冲页面并输出到客户端。