监理公司管理系统 | 工程企业管理系统 | OA系统 | ERP系统 | 造价咨询管理系统 | 工程设计管理系统 | 签约案例 | 购买价格 | 在线试用 | 手机APP | 产品资料
X 关闭
鹰潭网站建设公司

当前位置:工程项目OA系统 > 泛普各地 > 江西OA系统 > 鹰潭OA > 鹰潭网站建设公司

PHP性能优化大全

申请免费试用、咨询电话:400-8352-114

    鹰潭网站建设    www.diyphp.net

 

 

 

       1、 对很多代码文件说,特殊是含有良多包括文件(include or require)。它们需求破费更多的工夫宽和析并发生中心代码。

  2、 即便PHP代码文件没有发作改动,这个执行进程还会严厉的依照流程执行。也就是说,无论你的应该顺序能否发作改动,每次挪用的时分,都需求从新编译生成opcode码。(其实这就是编译缓存存在的来由)

  3、 这个流程不只仅发作在首要的代码文件,关于每一次的include和require来说,都邑执行这个流程。(这是可以持续优化的)

  那些当地可以优化呢?

  1、将mod_php fast-cgi化,防止每次都要加载这个模块,这个模块还要每次都去初始化php的分析情况。

  2、缓存php文件的opcode码,如许话,防止每次都去编译。

  APC可用用来完成第2点。编译缓存去失落了执行PHP进程中的解析进程,所以它对含有很多PHP代码的使用顺序长短常有用的。凡间状况下可以提拔2-3倍以上的速度。关于包括很多include文件的项目,编译缓存更实际出它的优胜性。

  注:include并不会被编译缓存进行缓存。比方目前有两个文件:main.php 和tobeInclude.php,个中main.php中有如许的语句include tobeInclude.php’。假定中心码的后缀为.op(实践上不是如许)。那么加上缓存cache后 main.php=>main.op ,tobeInclude.php=>tobeInclude.op。然则PHP在执行main.php的时分,她照样需求去解析main.op中的include敕令,去挪用tobeInclude.op的内容。详细流程是如许的。

  …=>执行main.op=>执行tobeInclude.op=>…

  而不是之间简略的执行main.op

  所以说“过多的include文件会降低顺序功能的”。

  APC的详细装备。

  Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来供应免费,公开而且强壮的架构来缓存和优化 PHP 的中心代码。

  APC 官方网站为 http://pecl.php.net/package/apc

  1、装置

  以PHP extension 方式装置

  phpize

  ./configure --enable-apc --enable-apc-mmap

  make

  make install

  生成.so,将.so拷贝到php援用modules的目次下,修正权限755

  2、装备

  apc.enabled boolean

  apc.optimization optimization

  选项在剧本中可以改动

  APC PHP.ini装备选项详解

  [APC]

  ; Alternative PHP Cache 用于缓存和优化PHP中心代码

  apc.cache_by_default = On

  ;SYS

  ; 能否默许对一切文件启用缓冲。

  ; 若设为Off并与以加号开首的apc.filters指令一同用,则文件仅在匹配过滤器时才被缓存。

  apc.enable_cli = Off

  ;SYS

  ; 能否为CLI版本启用APC功用,仅用于测试和调试目标才翻开此指令。

  apc.enabled = On

  ; 能否启用APC,假如APC被静态编译进PHP又想禁用它,这是独一的方法。

  apc.file_update_protection = 2

  ;SYS

  ; 当你在一个运转中的效劳器上修正文件时,你该当执行原子操作。

  ; 也就是先写进一个暂时文件,然后将该文件重定名(mv)到最终的名字。

  ; 文本编纂器以及 cp, tar 等顺序却并不是如许操作的,然后招致有能够缓冲了残损的文件。

  ; 默许值 2 透露表现在拜访文件时假如发现修正工夫间隔拜访工夫小于 2 秒则不做缓冲。

  ; 阿谁不幸的拜访者能够获得残损的内容,然则这种坏影响却不会经过缓存扩展化。

  ; 假如你能确保一切的更新操作都是原子操作,那么可以用 0 封闭此特征。

  ; 假如你的系统因为很多的IO操作招致更新迟缓,你就需求增大此值。

  apc.filters =

  ;SYS

  ; 一个以逗号分隔的POSIX扩展正则表达式列表。

  ; 假如源文件名与恣意一个形式匹配,则该文件不被缓存。

  ; 留意,用来匹配的文件名是传递给include/require的文件名,而不是绝对途径。

  ; 假如正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存,

  ; 假如第一个字符是"-"则任何匹配项都不会被缓存。"-"是默许值,可以省略失落。

  apc.ttl = 0

  ;SYS

  ; 缓存条目在缓冲区中答应停留的秒数。0 透露表现永不超时。建议值为7200~36000。

  ; 设为 0 意味着缓冲区有能够被旧的缓存条目填满,然后招致无法缓存新条目。

  apc.user_ttl = 0

  ;SYS

  ; 相似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。

  ; 设为 0 意味着缓冲区有能够被旧的缓存条目填满,然后招致无法缓存新条目。

  apc.gc_ttl = 3600

  ;SYS

  ; 缓存条目在渣滓收受接管表中可以存在的秒数。

  ; 此值供应了一个平安办法,即便一个效劳器历程在执行缓存的源文件时解体,

  ; 并且该源文件曾经被修正,为旧版天职配的内存也不会被收受接管,直抵达到此TTL值为止。

  ; 设为零将禁用此特征。

  apc.include_once_override = Off

  ;SYS

  ; 请坚持为Off,不然能够招致意想不到的后果。

  apc.max_file_size = 1M

  ;SYS

  ; 制止大于此尺寸的文件被缓存。

  apc.mmap_file_mask =

  ;SYS

  ; 假如运用–enable-mmap(默许启用)为APC编译了MMAP支撑,

  ; 这里的值就是传递给mmap模块的mktemp作风的文件掩码(建议值为"/tmp/apc.XXXXXX")。

  ; 该掩码用于决议内存映射区域能否要被file-backed或许shared memory backed。

  ; 关于直接的file-backed内存映射,要设置成"/tmp/apc.XXXXXX"的样子(恰恰6个X)。

  ; 要运用POSIX作风的shm_open/mmap就需求设置成"/apc.shm.XXXXXX"的样子。

  ; 你还可以设为"/dev/zero"来为匿名映射的内存运用内核的"/dev/zero"接口。

  ; 不界说此指令则透露表现强迫运用匿名映射。

  apc.num_files_hint = 1000

  ;SYS

  ; Web效劳器上能够被包括或被恳求的分歧源文件的大致数目(建议值为1024~4096)。

  ; 假如你不克不及确定,则设为 0 ;此设定首要用于拥稀有千个源文件的站点。

  apc.optimization = 0

  ; 优化级别(建议值为 0 ) 。

  ; 正整数值透露表现启用优化器,值越高则运用越急进的优化。

  ; 更高的值能够有十分有限的速度提拔,但当前尚在实验中。

  apc.report_autofilter = Off

  ;SYS

  ; 能否记载一切因为early/late binding缘由而主动未被缓存的剧本。

  apc.shm_segments = 1

  ;SYS

  ; 为编译器缓冲区分派的共享内存块数目(建议值为1)。

  ; 假如APC耗尽了共享内存,而且已将apc.shm_size指令设为系统答应的最大值,

  ; 你可以测验增大此值。

  apc.shm_size = 30

  ;SYS

  ; 每个共享内存块的巨细(以MB为单元,建议值为128~256)。

  ; 有些系统(包罗大大都BSD变种)默许的共享内存块巨细十分少。

  apc.slam_defense = 0

  ;SYS(对立运用该指令,建议该用apc.write_lock指令)

  ; 在十分忙碌的效劳器上,无论是启动效劳照样修正文件,

  ; 都能够因为多个历程希图还缓存一个文件而招致竞争前提。

  ; 这个指令用于设置历程在处置未被缓存的文件时跳过缓存步调的百分率。

  ; 比方设为75透露表现在碰到未被缓存的文件时有75%的概率不进行缓存,然后削减碰撞几率。

  ; 鼓舞设为 0 来禁用这个特征。

  apc.stat = On

  ;SYS

  ; 能否启用剧本更新反省。

  ; 改动这个指令值要十分小心。

  ; 默许值 On 透露表现APC在每次恳求剧本时都反省剧本能否被更新,

  ; 假如被更新则主动从新编译弛缓存编译后的内容。但如许做对功能有晦气影响。

  ; 假如设为 Off 则透露表现不进行反省,然后使功能获得大幅进步。

  ; 然则为了使更新的内容生效,你必需重启Web效劳器。

  ; 这个指令关于include/require的文件相同有用。然则需求留意的是,

  ; 假如你运用的是相对途径,APC就必需在每一次include/require时都进行反省以定位文件。

  ; 而运用绝对途径则可以跳过反省,所以鼓舞你运用绝对途径进行include/require操作。

  apc.user_entries_hint = 100

  ;SYS

  ; 相似于num_files_hint指令,只是针对每个分歧用户而言。

  ; 假如你不克不及确定,则设为 0 。

  apc.write_lock = On

  ;SYS

  ; 能否启用写入锁。

  ; 在十分忙碌的效劳器上,无论是启动效劳照样修正文件,

  ; 都能够因为多个历程希图还缓存一个文件而招致竞争前提。

  ; 启用该指令可以防止竞争前提的呈现。

  apc.rfc1867 = Off

  ;SYS

  ; 翻开该指令后,关于每个恰恰在file字段之前含有APC_UPLOAD_PROGRESS字段的上传文件,APC都将主动创立一个upload_的用户缓存条目(就是APC_UPLOAD_PROGRESS字段值)。

  3、php函数

  apc_cache_info - Retrieves cached information (and meta-data) from APC's data store

  apc_clear_cache - Clears the APC cache

  apc_define_constants - Defines a set of constants for later retrieval and mass-definition

  apc_delete - Removes a stored variable from the cache

  apc_fetch - Fetch a stored variable from the cache

  apc_load_constants - Loads a set of constants from the cache

  apc_sma_info - Retrieves APC's Shared Memory Allocation information

  apc_store - Cache a variable in the data store

  4、留意:

  Apc与apache的历程共享内存,所以只要在执行apache历程时,才可以往apc中存值,通俗的php历程不克不及拜访apc共享内存。

  第二章 进步PHP功能的编码技巧

  0、用单引号替代双引号来包括字符串,如许做会更快一些。由于PHP会在双引号围住的字符串中搜索变量,单引号则不会,留意:只要echo能这么做,它是 一种可以把多个字符串看成参数的“函数”(译注:PHP手册中说echo是言语构造,不是真正的函数,故把函数加上了双引号)。

  1、假如能将类的办法界说成static,就尽量界说成static,它的速度会提拔快要4倍。

  2、$row[’id’] 的速度是$row[id]的7倍。

  3、echo 比 print 快,而且运用echo的多重参数(译注:指用逗号而不是句点)替代字符串衔接,比方echo $str1,$str2。

  4、在执行for轮回之前确定最大轮回数,不要每轮回一次都核算最大值,最好运用foreach替代。

  5、刊出那些不必的变量尤其是大数组,以便释放内存。

  6、尽量防止运用 __get,__set,__autoload。

  7、require_once()价值昂贵。

  8、include文件时尽量运用绝对途径,由于它防止了PHP去include_path里查找文件的速度,解析操作系统途径所需的工夫会更少。

  9、假如你想晓得剧本开端执行(译注:即效劳器端收到客户端恳求)的时辰,运用$_SERVER[‘REQUEST_TIME’]要好于time()。

  10、函数替代正则表达式完成一样功用。

  11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

  12、假如一个字符串交换函数,可承受数组或字符作为参数,而且参数长度不太长,那么可以思索额定写一段交换代码,使得每次传递参数是一个字符,而不是只写一行代码承受数组作为查询和交换的参数。

  13、运用选择分支语句(译注:即switch case)好于运用多个if,else if语句。

  14、用@屏障错误音讯的做法十分低效,极端低效。

  15、翻开apache的mod_deflate模块,可以进步网页的阅读速度。

  16、数据库衔接当运用终了时应关失落,不要用长衔接。

  17、错误音讯价值昂贵。

  18、在办法中递增部分变量,速度是最快的。简直与在函数中挪用部分变量的速度相当。

  19、递增一个全局变量要比递增一个部分变量慢2倍。

  20、递增一个对象属性(如:$this->prop++)要比递增一个部分变量慢3倍。

  21、递增一个未预界说的部分变量要比递增一个预界说的部分变量慢9至10倍。

  22、仅界说一个部分变量而没在函数中挪用它,相同会减慢速度(其水平相当于递增一个部分变量)。 PHP大约会反省看能否存在全局变量。

  23、办法挪用看来与类中界说的办法的数目无关,由于我(在测试办法之前和之后都)添加了10个办法,但功能上没有转变。

  24、派生类中的办法运转起来要快于在基类中界说的相同的办法。

  25、挪用带有一个参数的空函数,其破费的工夫相当于执行7至8次的部分变量递增操作。相似的办法挪用所破费的工夫接近于15次的部分变量递增操作。

  26、Apache解析一个PHP剧本的工夫要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,罕用剧本。

  27、除非剧本可以缓存,不然每次挪用时都邑从新编译一次。引入一套PHP缓存机制凡间可以提拔25%至100%的功能,以免去编译开支。

  28、尽量做缓存,可运用memcached。memcached是一款高功能的内存对象缓存系统,可用来加快动态Web使用顺序,减轻数据库负载。对运算码 (OP code)的缓存很有效,使得剧本不用为每个恳求做从新编译。

  29、当操作字符串并需求查验其长度能否知足某种要求时,你想当然地会运用strlen()函数。此函数执行起来相当快,由于它不做任何核算,只返回在 zval 构造(C的内置数据构造,用于存储PHP变量)中存储的已知字符串长度。然则,因为strlen()是函数,多几多少会有些慢,由于函数挪用会经由诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名巨细写)、哈希查找,会追随被挪用的函数一同执行。在某些状况下,你可以运用isset() 技巧加快执行你的代码。

  (举例如下)

  if (strlen($foo) < 5) { echo “Foo is too short”$$ }

  (与下面的技巧做比拟)

  if (!isset($foo{5})) { echo “Foo is too short”$$ }

  挪用isset()刚巧比strlen()快,由于与后者分歧的是,isset()作为一种言语构造,意味着它的执行不需求函数查找和字母小写化。也就是说,实践上在查验字符串长度的顶层代码中你没有花太多开支。

  34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差别是PHP特有的,并不合用于其他言语,所以请不要修正你的C或Java代码并 盼望它们能立刻变快,没用的。++$i更快是由于它只需求3条指令(opcodes),$i++ 则需求4条指令。后置递增实践上会发生一个暂时变量,这个暂时变量随后被递增。而前置递增直接在原值上递增。这是最优化处置的一种,正如Zend的PHP 优化器所作的那样。切记这个优化处置不掉为一个好主见,由于并不是一切的指令优化器都邑做相同的优化处置,而且存在很多没有装配指令优化器的互联网效劳提 供商(ISPs)和效劳器。

  35、并不是事必面向对象 (OOP),面向对象往往开支很大,每个办法和对象挪用都邑耗费良多内存。

  36、并非要用类完成一切的数据构造,数组也很有效。

  37、不要把办法细分得过多,细心想想你真正计划重用的是哪些代码?

  38、当你需求时,你总能把代码分化成办法。

  39、尽量采用很多的PHP 内置函数。

  40、假如在代码中存在很多耗时的函数,你可以思索用C扩展的方法完成它们。

  41、评价查验(profile)你的代码。查验器会通知你,代码的哪些局部耗费了几多工夫。 Xdebug调试器包括了查验顺序,评价查验总体上可以显示出代码的瓶颈。

  42、mod_zip可作为Apache模块,用来即时紧缩你的数据,并可让数据传输量降低 80%。

  43、在可以用file_get_contents替代file、fopen、feof、fgets等系列办法的状况下,尽量用 file_get_contents,由于他的效率高得多!然则要留意file_get_contents在翻开一个URL文件时分的PHP版本问题;

  44、尽量的少进行文件操作,固然PHP的文件操作效率也不低的;

  45、优化Select SQL语句,在能够的状况下尽量少的进行Insert、Update操作;

  46、尽能够的运用PHP内部函数(然则我却为了找个PHP里面不存在的函数,糜费了本可以写出一个自界说函数的工夫,经历问题啊!);

  47、轮回内部不要**变量,尤其是大变量:对象(这仿佛不只是PHP里面要留意的问题吧?);

  48、多维数组尽量不要轮回嵌套赋值;

  49、在可以用PHP内部字符串操作函数的状况下,不要用正则表达式;

  50、foreach效率更高,尽量用foreach替代while和for轮回;

  51、用单引号替代双引号援用字符串;

  52、“用i+=1替代i=i+1。契合c/c++的习气,效率还高”;

  53、对global变量,应该用完就unset()失落; 

发布:2007-03-31 14:57    编辑:泛普软件 · xiaona    [打印此页]    [关闭]
鹰潭OA
联系方式

成都公司:成都市成华区建设南路160号1层9号

重庆公司:重庆市江北区红旗河沟华创商务大厦18楼

咨询:400-8352-114

加微信,免费获取试用系统

QQ在线咨询

泛普鹰潭网站建设公司其他应用

鹰潭软件开发公司 鹰潭门禁系统 鹰潭物业管理软件 鹰潭仓库管理软件 鹰潭餐饮管理软件 鹰潭网站建设公司