多数大学生出来选择的工作和专业无关
首页 > 专业知识

38条PHP编码优化加速技巧

时间:2018-03-06 17:47:14 [来源]:郑州PHP培训学校

   38条PHP编码优化加速技巧

  1. 尽量采用大量的PHP内置函数。
  2. echo 比 print 快。
  3. 不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?
  4. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。
  5. 注销那些不用的变量尤其是大数组,以便释放内存。
  6. 并非要用类实现所有的数据结构,数组也很有用。
  7. $row['id']的效率是$row[id]的7倍。
  8. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。
  9. 如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
  10. 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。
  11. str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
  12. 如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
  13. 使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
  14. 用@屏蔽错误消息的做法非常低效。
  15. 打开apache的mod_deflate模块。
  16. 数据库连接当使用完毕时应关掉。
  18. 错误消息代价昂贵。
  19. 尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。
  20. 在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。
  21. 递增一个全局变量要比递增一个局部变量慢2倍。
  22. 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。
  23. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
  24. 仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
  25. 方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
  26. 派生类中的方法运行起来要快于在基类中定义的同样的方法。
  27. 调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
  28. 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。
  29. 用echo 输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。
  30. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
  31. 除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
  32. 尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码(OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
  33. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset()技巧加速执行你的代码。
  Ex.(举例如下)
  if (strlen($foo) < 5) { echo "Foo is too short"; }
  vs.(与下面的技巧做比较)
  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),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
 
  精通PHP需要注意的十大要点
  要想精通PHP,需要不断学习和积累经验。本文正是重量级人物对于使用PHP的一些重要建议,希望可以给你带来帮助。
  1. 在合适的时候使用PHP - Rasmus Lerdorf
  没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的, 他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变了互联网的世界。 可是, Rasmus并不是因此而创建PHP的。 PHP是为了解决web开发者的实际问题而诞生的。
  和许多开源项目一样,PHP变得流行,流行的动机并不能用正常的哲学来进行解释,甚至流行得有些孤芳自赏。它完全可以作为一个案例,一个解决各种web问题的工具需求所引起的案例,因此当PHP刚出现的时候,这种工具需求全部聚焦到PHP的身上。
  但是,你不能奢望PHP可以解决所有问题。Lerdorf是第一个承认PHP只是一种工具的人,并且PHP也有很多力所不能及的情况。
  根据工作的不同来选择合适的工具。我跑了很多家公司,为了说服他们部署和使用PHP,但是这并不意味着PHP对所有问题都适用。它只是可以一个解决大部分问题的front-end脚步语言。
  作为一个web开发者,尝试用PHP解决所有问题是不科学的,同时也会浪费你的时间。当PHP玩不转的时候,不要犹豫,试用一下其他的语言吧。
  2. 使用多表存储提高规模伸缩性 - Matt Mullenweg没有人愿意质疑Matt Mullenweg在PHP方面的权威性,他开发了这个星球上最流行的blog系统,(依靠一个强大的社区力量支持): Wordpress. 创建Wordpress以后,Matt和他的团队启动了Wordpress.com平台,一个基于Wordpress MU的免费blog站点。现在,Wordpress.com已经拥有大约400万用户, 这些用户每天提供超过 140,000篇的日志。 (要查看更多Wordpress.com的统计情况,请点击这里.)如果有人知道如何让网站的规模伸缩自如,这个人一定是Matt Mullenweg。2006年的时候 Matt对Wordpress的数据结构进行了前瞻性的改进,并且解释了为什么Wordpress MU对每个blog使用独立的MYSQL表格, 而不是把所有的blog数据都塞进一个巨大的表格。
  我们测试过这个方法,但是发现如果要扩展它的伸缩性,代价太高。如果用一个整体的数据结构,在大流量面前,你将会面临服务器硬件的问题。在MU里面。用户们都被分布到独立的表格当中,并且可以轻易地组织起来。举个例子,WordPress.com把用户的数据分散存储到4096个数据库中,这些数据库可以分散大规模的数据访问,实现流量和压力分流。
  数据表的可迁移性让代码(blog)可以运行得更快,并且让系统具备更强的伸缩性。依靠强大的缓存策略和灵活的数据库运用策略, Matt向人们展示了时下最流行的Facebook和Wordpress.com都可以在PHP下稳定运行,并且处理惊人的访问量。
  3. 千万不要相信用户 - Dave Child
  Dave Child是 Added Bytes (previously ilovejackdaniels.com) 网站的核心人物,这个网站以他出色的《cheat sheets for many programming languages》而闻名。 Dave为很多英国的公司服务,并且已经在编程世界里树立起相当的权威。
  Dave为PHP开发者提供了很多深谋远虑的建议,并总结成了《writing secure code in PHP》:千万不要相信你的用户,他们甚至可能会伤害你。
  有一条web开发的基本原则,我重复多少遍都觉得不够,那就是:千万不要相信你的用户,同时要假设你网站中的每个数据单元都是从用户那里收集来的恶意代码。很多时候,你必须用javascript在客户端检验表单提交过来的内容, 如果你习惯了如此,那么,这是一个好习惯。如果安全性对你来说很重要,这就是最重要最需要学习的原则。
  Dave目前正致力于为它的《Writing Secure PHP》系列书籍整理实例,书的最后他说:
  最后,变得偏执一点吧。除非你认为你的站点永远不会受到攻击,否则就正视所有的问题,当问题真正发生的时候,你的情况会变得很糟。你需要把每个用户都看成会带来一场攻防站的黑客,想尽一切办法来保护站点的安全,同时想好相应问题的解决方案。
  4. 多使用PHP缓存 - Ben Balbo
  Ben Balbo开发了Site Point,一个为developers和designers提供指导的网站。他是墨尔本PHP开发和开源俱乐部的成员, 因此他对PHP有一定的了解,同时对PHP caching有一定的想法和经验。
  如果你拥有一个访问量很大,但更新并不频繁的站点(比如blog,基于某种CMS),或许它需要进行一些改造,这些改造不会花费太多的时间,但是对性能有突出的贡献。 如果要为一个复杂/更新频率很快的站点建立缓存机制,过程可能会很曲折,但是好处也是显而易见的。
 
  PHP中的危险函数全解析
  在编译PHP时,如无特殊需要,一定禁止编译生成CLI命令行模式的php解析支持。可在编译时使用–disable-cli。一旦编译生成CLI模式的PHP,则可能会被入侵者利用该程序建立一个WEB Shell后门进程或通过PHP执行任意代码!
  在编译 PHP 时,如无特殊需要,一定禁止编译生成 CLI 命令行模式的 PHP 解析支持。可在编译时使用 –disable-CLI。一旦编译生成 CLI 模式的PHP,则可能会被入侵者利用该程序建立一个WEB Shell 后门进程或通过PHP 执行任意代码。
  phpinfo()
  功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。
  危险等级:中
  passthru()
  功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
  危险等级:高
  exec()
  功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
  危险等级:高
  system()
  功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
  危险等级:高
  chroot()
  功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式PHP 时才能工作,且该函数不适用于 Windows 系统。
  危险等级:高
  scandir()
  功能描述:列出指定路径中的文件和目录。
  危险等级:中
  chgrp()
  功能描述:改变文件或目录所属的用户组。
  危险等级:高
  chown()
  功能描述:改变文件或目录的所有者。
  危险等级:高
  shell_exec()
  功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
  危险等级:高
  proc_open()
  功能描述:执行一个命令并打开文件指针用于读取以及写入。
  危险等级:高
  proc_get_status()
  功能描述:获取使用 proc_open() 所打开进程的信息。
  危险等级:高
  error_log()
  功能描述:将错误信息发送到指定位置(文件)。
  安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,执行任意命令。
  危险等级:低
 

上一篇:PHP下载文件名乱码问题详解

下一篇:php程序开发的字符串操作