PHP代码优化

  英文原文:

PHP是一种在服务器端执行的脚本语言,它开发了世界上许多知名的网站,包括雅虎和Facebook等。下面介绍6条PHP代码、性能优化的技巧。1.将PHP升级到最新版
提高性能的最简单的方式是不断升级、更新PHP版本。2.使用分析器
网站运行缓慢的原因颇多,Web应用程序极其复杂,让人扑朔迷离。而一种可能性在于PHP代码本身。这个分析器可以帮助你快速找出造成瓶颈的代码,提高网站运行的总体性能。
Xdebug PHP
extension提供了强大的功能,可以用来调试,也可以用来分析代码。方便开发人员直接跟踪脚本的执行,实时查看综合数据。还可以将这个数据导入到可视化的工具
KCachegrind中。3.检错报告
PHP支持强大的检错功能,方便你实时检查错误,从比较重要的错误到相对小的运行提示。总共支持13种独立的报告级别,你可以根据这些级别灵活匹配,生成用户自定义的检测报告。4.
利用PHP的扩展
一直以来,大家都在抱怨PHP内容太过繁杂,最近几年来开发人员作出了相应的努力,移除了项目中的一些冗余特征。即便如此,可用库以及其它扩展的数量还是很可观。甚至一些开发人员开始考虑实施自己的扩展方案。5.使用PHP加速器
一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。如果PHP脚本经过反复编译而得到相同的结果,那为什么不完全跳过编译过程呢?
通过PHP加速器,你完全可以实现这一点,它缓存了PHP脚本编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程。
对PHP开发人员而言,目前提供了两种可用的缓存方案,一种是APC,它是一个可以通过PEAR安装的开源加速器。另一种流行的方案是Zend
Server,它不仅提供了操作码缓存技术,也提供了相应页面的缓存工具。6.通过内存缓存来避免高成本操作
PHP通常在检索和数据分析方面扮演着重要角色,这些操作可能会导致性能降低。实际上有些操作是完全没有必要的,特别是从数据库中反复检索一些常用的静态数据。不妨考虑一下短期使用
Memcached
extension来缓存数据。Memcached的扩展缓存与libMemcached库协同工作,在RAM中缓存数据,也允许用户定义缓存的期限,有助于确保用户信息的实时更新。英文原文:_Gilmore07122011.php3?page=1

31 使用MySQLi或PDO

mysql_*函数已经不被建议使用,建议使用增强型的mysqli_*系列函数或者直接使用PDO。

**  2.使用分析器

30 检查email有效性

使用checkdnsrr()通过域名存在性来确认email地址的有效性,这个内置函数能保证每一个的域名对应一个IP地址。

  6.通过内存缓存来避免高成本操作
  PHP通常在检索和数据分析方面扮演着重要角色,这些操作可能会导致性能降低。实际上有些操作是完全没有必要的,特别是从数据库中反复检索一些常用的静态数据。不妨考虑一下短期使用
Memcached
extension来缓存数据。Memcached的扩展缓存与libMemcached库协同工作,在RAM中缓存数据,也允许用户定义缓存的期限,有助于确保用户信息的实时更新。

7 在include和require中使用绝对路径

如果包含相对路径,PHP会在include_path里面遍历查找文件。
用绝对路径就会避免此类问题,因此解析操作系统路径所需的时间会更少。

  通过PHP加速器,你完全可以实现这一点,它缓存了PHP脚本编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程。

32 试着喜欢使用三元运算符(?:)

1.将PHP升级到最新版
  提高性能的最简单的方式是不断升级、更新PHP版本。

16 方法里建立局部变量

在类的方法里建立局部变量速度最快,几乎和在方法里调用局部变量一样快。

  Xdebug PHP
extension提供了强大的功能,可以用来调试,也可以用来分析代码。方便开发人员直接跟踪脚本的执行,实时查看综合数据。还可以将这个数据导入到可视化的工具
KCachegrind中。

6 内存缓存

PHP通常在检索和数据分析方面扮演着重要角色,这些操作可能会导致性能降低。实际上有些操作是完全没有必要的,特别是从数据库中反复检索一些常用的静态数据。不妨考虑一下短期使用Redis或Memcached
extension来缓存数据。Memcached的扩展缓存与libMemcached库协同工作,在RAM中缓存数据,也允许用户定义缓存的期限,有助于确保用户信息的实时更新。

**  网站运行缓慢的原因颇多,Web应用程序极其复杂,让人扑朔迷离。而一种可能性在于PHP代码本身。这个分析器可以帮助你快速找出造成瓶颈的代码,提高网站运行的总体性能。

43 尽量的少进行文件操作,虽然PHP的文件操作效率也不低的

**  3.检错报告

41 使用选择分支语句

switchcase好于使用多个ifelse if语句,并且代码更加容易阅读和维护。

**  5.使用PHP加速器

40 不要随便复制变量

有时候为了使 PHP 代码更加整洁,一些 PHP
新手(包括我)会把预定义好的变量复制到一个名字更简短的变量中,其实这样做的结果是增加了一倍的内存消耗,只会使程序更加慢。试想一下,在下面的例子中,如果用户恶意插入
512KB 字节的文字到文本输入框中,这样就会导致 1MB 的内存被消耗!

// 不好的实践
$description = $_POST['description'];
echo $description;

// 好的实践
 echo $_POST['description'];

**  4. 利用PHP的扩展

21 类的性能和其方法数量没有关系

新添加10个或多个方法到测试的类后,性能没什么差异。

  对PHP开发人员而言,目前提供了两种可用的缓存方案,一种是APC(Alternative
PHP
Cache,可选PHP缓存),它是一个可以通过PEAR安装的开源加速器。另一种流行的方案是Zend
Server,它不仅提供了操作码缓存技术,也提供了相应页面的缓存工具。

54 mod_deflate压缩输出

打开apache的mod_deflate模块,可以提高网页的浏览速度。(提到过echo
大变量的问题)

**  PHP支持强大的检错功能,方便你实时检查错误,从比较重要的错误到相对小的运行提示。总共支持13种独立的报告级别,你可以根据这些级别灵活匹配,生成用户自定义的检测报告。

22 在子类里方法的性能优于在基类中

**  一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。如果PHP脚本经过反复编译而得到相同的结果,那为什么不完全跳过编译过程呢?

29 使用整型保存IP

使用ip2long()long2ip()函数把IP地址转成整型后,再存放进数据库,而保存非字符型。

这几乎能降低1/4的存储空间。同时可以很容易对地址进行排序和快速查找;

**  一直以来,大家都在抱怨PHP内容太过繁杂,最近几年来开发人员作出了相应的努力,移除了项目中的一些冗余特征。即便如此,可用库以及其它扩展的数量还是很可观。甚至一些开发人员开始考虑实施自己的扩展方案。

38 完全理解魔术引用和SQL注入的危险。

Fully understand “magic quotes” and the dangers of SQL injection. I’m
hoping that most developers reading this are already familiar with SQL
injection. However, I list it here because it’s absolutely critical to
understand. If you’ve never heard the term before, spend the entire rest
of the day googling and reading.

35 屏蔽敏感信息

使用error_reporting()函数来预防潜在的敏感信息显示给用户。

理想的错误报告应该被完全禁用在php.ini文件里。可是如果你在用一个共享的虚拟主机,php.ini你不能修改,那么你最好添加error_reporting()函数,放在每个脚本文件的第一行(或用require_once()来加载)这能有效的保护敏感的SQL查询和路径在出错时不被显示;

23 函数快于类方法

调用只有一个参数、并且函数体为空的函数,花费的时间等于7-8次$localvar++运算,而同一功能的类方法大约为15次$localvar++运算。

47 多维数组尽量不要循环嵌套赋值

44 优化Select SQL语句

在可能的情况下尽量少的进行insertupdate操作(在update上,我被恶批过)。

51 并不是事必面向对象(OOP)

面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

8 使用$_SERVER[‘REQUSET_TIME’]

如果你需要得到脚本执行的时间,$_SERVER['REQUSET_TIME']优于time()

可以想象,一个是现成就可以直接用,一个还需要函数得出的结果。

14 别在循环里用函数

例如:

for($x=0; $x < count($array); $x++) {
}

这种写法在每次循环的时候都会调用 count() 函数,效率大大降低,建议这样:

$len = count($array);
for($x=0; $x < $len; $x++) {
}

让函数在循环外面一次获得循环次数。

18 局部变量而不是对象属性

建立一个对象属性(类里面的变量,例如:$this->prop++)比局部变量要慢3倍。

发表评论

电子邮件地址不会被公开。 必填项已用*标注