简单的php代码-48个高效的PHP优化编写方法

1 串

1.1 少用正则表达式

如果可以使用PHP内部的字符串操作函数,尽量使用它们来代替正则表达式,因为它们的效率比正则表达式低。

不用说,正则化对性能的消耗最大。

str_replace函数比preg_replace快得多,strtr函数比str_replace快。

有没有什么好用的功能被你忽略了?

例如:strpbrk()、strncasecmp()、strpos()、strrpos()、stripos()、strripos()。

1.2 角色替换

如果需要转换的只是单个字符,请使用字符串作为 strtr() 函数来执行替换,而不是字段:

$addr = strtr($addr,"abcd","efgh"); // 建议

$addr = strtr($addr,array('a' => 'e',)); // 不建议

效率提升:10倍。

str_replace 字符替换比常规替换 preg_replace 快,但 strtr 比 str_replace 快 1/4。

另外,不要进行不必要的替换,即使没有替换,str_replace也会为其参数分配显存。 非常慢!

先用strpos查找(速度非常快)看是否需要替换,需要的话再替换。

如果需要更换,效率几乎相等,相差0.1%左右。

如果不需要更换:使用 strpos 速度快 200%。

1.3 压缩大字符串

使用 gzcompress() 和 gzuncompress() 来压缩和解压缩大容量字符串,然后在数据库中存储和检索它们。

这个外部函数使用gzip算法,可以将字符串压缩90%。

1.4 回显输出

使用冒号而不是点来回显字符串会更快。

虽然 echo 是一种语言构造简单的php代码,而不是真正的函数。

不过,它可以传递多个以冒号分隔的字符串作为“函数”参数,因此速度会更快。

回显$str1,$str2; // 快速地

echo $str1.$str2;// 慢一点

1.5 尝试使用单冒号

PHP引擎允许使用单冒号和双引号来封装字符串变量,但是它们的速度相差很大!

带有双引号的字符串会告诉PHP引擎首先读取该字符串的内容简单的php代码,找到其中的变量,并更改该变量对应的值。

一般来说,字符串没有变量,使用双引号会导致性能较差。

最好使用字符串连接而不是双引号字符串。

$output = "This is a plain string";// 不好的做法

$output = '这是一个纯字符串';// 好的做法

$type = "混合"; // 不好的做法

$output = "这是一个$type字符串";

$type = '混合'; // 好的做法

$output = '这是一个'.$类型。' 细绳';

1.6 使用isset代替strlen

当测试字符串的粗细时,我们的第一个想法是使用 strlen() 函数。

这个函数非常快,因为它不做任何计算,它只是返回存储在 zval 结构(C 的外部数据结构,用于存储 PHP 变量)中的字符串的已知厚度。

不过,由于strlen()是一个函数,所以或多或少会比较慢,因为函数调用会经过很多步骤,比如小写字母、哈希查找,并且会和被调用的函数一起执行。

在极少数情况下,您可以使用 isset() 技巧来加快代码的执行速度。 例如:

if(strlen($foo) < 5){

echo "Foo 太短";

// 使用 isset()

if(!isset($foo{5})){

echo "Foo 太短";

1.7 用split分割字符串

分割字符串时,split()比explode()更快。

分裂()

0.001813 - 0.002271 秒(平均 0.002042 秒)

爆炸()

0.001678 - 0.003626 秒(平均 0.002652 秒)

1.8 echo 效率低于 print

因为 echo 没有返回值,所以 print 返回一个整数。

注意:当echo输出大字符串时,如果不进行调整,会严重影响性能。

打开Apache的mod_deflate进行压缩,或者打开ob_start将内容放入缓冲区,这样可以改善性能问题。

2 条陈述

2.1 最好不要使用@

用@屏蔽错误会提高脚本运行的速度,并且后台会有很多额外的工作。

与不使用@相比,效率相差3倍。 特别是不要在循环中使用@。

在5个周期的测试中,即使先用error_reporting(0)关闭错误,循环完成后再打开,也比使用@更快。

2.2 避免使用魔法方法

以 __ 开头的函数被称为魔术函数,它们都是在特定条件下触发的。

这些神奇的函数包括:__construct()、__get()、__call()、__autoload()等。

以__autoload()为例,如果无法将类名与实际磁盘文件匹配,则需要进行大量的文件存在判断。

但判断文件是否存在需要c盘I/O操作。 众所周知,磁盘I/O操作的效率很低,所以这就是autoload机制提高效率的原因。

因此,在设计系统时,需要定义一个明确的机制来将类名映射到实际的磁盘文件。

这个规则越简单、越清晰,__autoload() 机制就越高效。

自动加载机制本质上并不是低效的。 只有滥用自动加载和设计不当的手动加载功能才会降低其效率。

因此,是否尽量避免使用 __autoload 等魔术是值得商榷的。

2.3 不要在循环中使用函数

例如:

for($x=0;$x < 计数($array);$x++){

这种写法每次循环都会调用count()函数,效率会大大提高。 建议:

$len = 计数($array);

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

让函数在循环外获取一次循环计数。

2.4 使用三元运算符

在简单的决策语句中,三元运算符?:更加简洁高效。

2.5 使用替代分支句

switch 和 case 比使用多个 if 和 else if 语句更好,并且代码更易于阅读和维护。

2.6 屏蔽敏感信息

使用 error_reporting() 函数可以防止向用户显示潜在的敏感信息。

理想情况下,应该在 php.ini 文件中完全禁用错误报告。

如果您使用的是共享虚拟主机,则php.ini无法更改,最好添加error_reporting()函数。

将其放在每个脚本文件的第一行,或者使用require_once()加载,可以有效保护敏感的SQL查询和路径,并且在发生错误时不会显示。

2.7 不切实际的段标签

不要使用简写作为开始标志,如果你使用这样的符号,你应该鼓励使用完整的方法,可以使代码更加简洁。

2.8 没有结束标签的纯PHP代码

如果文件内容是纯PHP代码,最好删除文件末尾的PHP结束标记?>。

如果您不小心在结束 PHP 标记后添加空格或换行符(此时不打算在脚本中输出),这可以防止 PHP 开始输出空格。

2.9 切勿使用 register_globals 和魔术引号

这是两个非常古老的功能,在当时(十年前)可能是一个好主意,但在今天却不是。

旧版本的 PHP 安装时默认打开这两个功能,这可能会导致安全漏洞、编程错误和其他问题。

例如,仅当用户输入数据时才创建变量等。

这两个函数从PHP5.4.0开始就被废弃了,所以每个程序员都应该避免使用它们。

如果您过去的程序使用了这两个函数,请尽快删除它们。

3个功能

3.1 尝试使用PHP内部函数

内置函数采用C语言实现,并经过PHP官方优化,效率更高。

3.2 使用绝对路径

尝试在 include 和 require 中使用绝对路径。

如果包含相对路径,PHP将遍历include_path来查找文件。

使用绝对路径将避免这个问题,并且解析路径所需的时间会更少。

3.3 包含文件

尽量不要使用 require_once 和 include_once 来包含文件。 他们有一个额外的判断文件是否被引用的过程,所以尽量不要使用。

相反,使用 require 和 include 方法。

鸟哥在博客中多次表示尽量不要使用require_once和include_once。

3.4 函数比类更快

调用一个只有一个参数且函数体为空的函数所需的时间相当于 7-8 个 $localvar++ 操作。

同一函数的类方法大约有15个$localvar++操作。

3.5 使用泛型

只将可重用的方法放在基类上,其他功能尽可能用泛型实现。 子类中的方法的性能优于泛型中的方法。

3.6 一个类的表现与它的技巧数无关

向测试类添加 10 个或更多新方法后,性能没有任何差异。

3.7 读取文件内容

在可以使用file_get_contents()代替file()、fopen()、feof()、fgets()等系列方法的情况下,尽量使用file_get_contents()。

因为他效率高多了!

3.8 通过引用传递参数

通过参数地址引用的形式,实现函数的多个返回值,比按值传递效率更高。

方法是在参数变量前加一个&。

3.9 不细分太多的方法

仔细想想你真正要重用哪些代码?

3.10 尽量保持静态

如果一个方法可以静态,声明为静态,速度可以提升1/4,甚至我测试的时候,这个提升也接近3倍。

当然,这个测试方法需要执行到10万次以上的级别,效果才显着。

事实上,静态方法和非静态方法效率的主要区别在于显存。

静态模式在程序开始时生成显存,实例模式(非静态模式)在程序运行时生成显存。

因此,静态方法可以直接调用,而实例方法在调用之前需要生成实例。 静态速度很快,但是如果太多就会占用显存。

任何语言都在显存和c盘上运行。 至于是否面向对象,只是软件层的问题。 底层是一样的,只是实现方法不同。

静态内存是连续的,因为它是在程序开始时生成的,而实例方法申请的是离散空间,所以实际上没有静态方法快。

静态方法总是调用同一块显存,其缺点是不能手动销毁,但实例化可以销毁。

3.11 用C扩展方法实现

如果代码中有大量耗时的函数,可以考虑以C扩展的形式实现。

4个变量

4.1 及时销毁变量

PHP中数组、对象、GLOBAL变量占用大量内存,这是PHP底层zend引擎造成的。

一般来说,PHP数组的内存利用率只有1/10。

也就是说,C语言中100M内存的链表,在PHP中需要1G。

特别是在使用PHP作为后台服务器的系统中,经常会出现显存消耗过多的问题。

4.2 使用$_SERVER变量

如果需要获取脚本执行时间,$_SERVER['REQUSET_TIME'] 比 time() 更好。

一种是现成的,可以直接使用,另一种需要函数的结果。

4.3 在方法中构建局部变量

以类方式构造局部变量是最快的,几乎与在技巧中调用局部变量一样快。

4.4 局部变量比全局变量更快

因为局部变量是保存在栈上的。

当函数占用的堆栈空间不是很大时,这部分显存很可能会命中缓存,CPU访问的效率非常高。

相反,如果一个函数同时使用全局变量和局部变量,当两个地址相差较大时,cpu缓存需要来回切换,效率就会提高。

4.5 局部变量代替对象属性

创建对象属性(类之上的变量,例如:$this->prop++)比局部变量慢 3 倍。