PHP性能如何优化?性能是网站运行是否良好的关键因素,网站的性能和效率影响着公司的运营成本和长远发展,编写优质高效的代码是我们每个开发人员必备的素质,也是我们良好的职业素养。
PHP性能如何优化?PHP性能优化与安全策略
在什么情况下会遇到 PHP 性能问题?
1:PHP语法使用不当。
2:用PHP语言做它不擅长的事情。
3:使用PHP语言连接的服务功能不够强大。
4:PHP自身的缺点(PHP本身不能做的事情)。
5:还有什么我们不知道的问题?(探索、分析、寻找解决方案,提高发展水平)。
在做在线网站压力测试的时候,一定要把请求数和并发数,特别是并发度设置得比较低,不能让在线网站,不管是我们自己的还是别人的,出现压力问题。
PHP性能问题一般不会超过整个项目性能的50%,通常在30%到40%之间。
PHP 性能问题的解决方法,三个层次
1:PHP语言级性能优化,指的是PHP语法的基本功能,这部分的优化比较简单、快速、可行,而且能比较快的看到效果。
a:少写PHP代码,利用PHP自身的能力来解决问题。
性能问题
自己写的代码冗余度比较大,可读性比较差,性能也比较低,比如代码很长...PHP代码越长,PHP的执行效率就越慢。
为什么性能很慢?
PHP代码需要解析编译成C语言,底层的C语言需要编译成汇编语言、机器语言才可以执行,每次请求进来都要处理这个过程,所以开销很大(如果项目变大的话……)。
解决方案:
多使用PHP内置的变量、常量和函数,我们用PHP代码实现的函数和用PHP内置函数实现的相同函数是有区别的。
b:PHP内置函数的性能优缺点。
情况描述:
PHP 内置函数之间仍然存在速度差异;少用 PHP 魔术方法;
建议:
了解更多有关 PHP 内置函数的执行复杂性。
测试方法:对比效率测试,如使用microtime()函数取差值,精确到毫秒;Linux time命令可以查看开销。
c: 产生额外开销的错误抑制符号“@”
最好不要使用它(无论性能优化和项目健壮性)。
@的逻辑是在代码前后添加Opcode,Opcode的作用是忽略错误,其实相当于添加了error_reporting的设置,忽略错误报告的级别(vld扩展可以查看隐藏的Opcode);
d:合理使用内存。
情况描述:
PHP有内存回收机制作为保障,但是也谨慎使用内存;
建议:
使用unset()及时释放不再使用的内存,比如数据库中一些多余的字段(注意:unset()有时候会退出失败)
e:尽量少使用正则表达式。
情况描述:
正则表达式开销大,使用简单,但性能低,因为需要回溯,正则表达式越长,回溯开销越大,优化正则表达式需要一定的技术,如果你的正则表达式技术不过关,就不要乱用正则表达式。
f:避免在循环内执行计算。
情况描述:
循环中的计算公式会重复计算(在for循环或者while循环中,都会有重复计算,影响性能问题)。
例子:
错误用法:
$str = "你好,世界";
对于($i = 0; $i < strlen($str); $i ++){…}
正确用法:
$str = "你好,世界";
$strlen = strlen($str);
对于($i = 0;$i < $strlen;$i++){…}
g: 减少计算密集型任务
情况描述:
PHP 不适合密集型(大数据量)计算场景。
PHP的语言特性决定了PHP并不适合进行大规模数据操作,PHP是用C编写的,PHP是基于C语言的,所有的PHP操作和处理过程都需要转换成C语言,在性能上PHP肯定不如C。
PHP 有一些环境问题和语言特性,它的开销比 C 大得多,一段较长的 PHP 代码可能用一段较短的 C 代码就可以实现……
PHP 适用于以下场景:
适合连接WebServer与后端服务。当WebServer收到请求后,交给PHP处理,PHP做一些验证和初始化数据处理,将请求转发给后端,并等待后端响应。后端可能是缓存,DB或其他服务。
后端响应之后,PHP 充当一个纽带,把信息传递给 WebServer,这是 PHP 所擅长的。PHP 还擅长 UI 呈现,也就是配合模板引擎做模板输出,其实就是一些字符串文本处理。
h:务必使用带引号的字符串作为键值(数组的关键字段)。
情况描述
PHP 会将不带引号的键值视为常量,从而产生查找常量的开销。如果发现常量包含此字符串,则将常量用作值。
建议:
严格对键值使用引号,单引号就足够了。
2:围绕PHP进行性能优化:(PHP前面有WebServer,后面有数据库)
3:PHP语言本身的分析与优化(底层C层面的优化)
补充:
1:尝试使其静态:
如果一个方法可以变成静态的,然后将其声明为静态的,速度可以提高1/4,甚至当我测试它时,它几乎提高了三倍。
当然这个测试方法需要执行十万次以上才会有效。
其实静态方法和非静态方法在效率上的主要区别就是内存:静态方法在程序启动时就产生内存,而实例方法在程序运行时就产生内存。因此静态方法可以直接调用,而实例方法必须先生成实例,通过实例来调用方法。静态方法速度很快,但是多了会占用内存。
任何语言都是对内存和磁盘进行操作的,是否面向对象只是软件层面的问题,底层都一样,只是实现方式不同,静态内存因为在程序开始时就生成,所以是连续的,而实例申请的是离散的空间,当然没有静态方式快。
静态方法总是调用同一块内存,缺点是不能自动销毁,但是实例化后可以销毁。
2.销毁变量以释放内存,特别是大数组;
数组和对象在 PHP 中占用大量内存。这是由于 PHP 的底层 Zend 引擎造成的。
一般来说PHP数组的内存利用率只有1/10,也就是说C语言中占用100M内存的数组,在PHP中就会占用1G。
特别是在使用PHP作为后端服务器的系统中,经常会出现内存消耗过大的问题。
以下是我在其他博文中收集的PHP性能优化方法:
1.如果可以将某个类方法定义为静态的,那么尽量将其定义为静态的,其速度将提高近4倍。
2. $row['id'] 比 $row[id] 快 7 倍。
3. 取消注册未使用的变量,尤其是大型数组,以释放内存。
4.尽量避免使用__get、__set和__autoload。
5.require_once() 很昂贵。
6、包含文件的时候尽量使用绝对路径,因为这样可以避免PHP在include_path中搜索文件,而且解析操作系统路径所需的时间也更少。
7.如果想知道脚本开始执行的时间(译者注:服务器收到客户端请求的时间),使用$_SERVER['REQUEST_TIME'],而不是time()
8.函数代替正则表达式实现同样的功能。
9、str_replace函数比preg_replace函数速度快,但是strtr函数的效率是str_replace函数的四倍。
10.如果一个字符串替换函数可以接受数组或者字符作为参数,并且参数长度不是太长,那么可以考虑写一段额外的替换代码,使得传递的每个参数都是一个字符,而不是只写一行代码来接受数组作为查询和替换参数。
11.最好使用 switch case 语句,而不是多个 if 和 else if 语句。
12. 使用@来阻止错误信息非常低效,极其低效。
13、开启Apache的mod_deflate模块可以提高网页浏览速度。
14.数据库连接使用完毕后应关闭,不要使用长连接。
15. 在方法中增加局部变量是最快的。它几乎和在函数中调用局部变量一样快。增加全局变量比增加局部变量慢 2 倍。增加对象属性(例如 $this->prop++)比增加局部变量慢 3 倍。增加未定义的局部变量比增加预定义的局部变量慢 9 到 10 倍。
16. 定义局部变量而不在函数中调用它也会减慢进程(与增加局部变量的程度相同)。PHP 可能会检查全局变量是否存在。
17. 方法调用似乎与类中定义的方法数量无关,因为我添加了 10 种方法(在测试方法之前和之后),但性能没有变化。
18. 派生类中的方法比基类中定义的相同方法运行得更快。
19. 调用一个带有一个参数的空函数所花的时间与将局部变量增加 7 到 8 次的时间相同。类似的方法调用需要将局部变量增加近 15 次。
20. Apache 解析 PHP 脚本的时间比解析静态 HTML 页面的时间长 2 到 10 倍。尽量多使用静态 HTML 页面,少使用脚本。
21. 除非脚本可以缓存,否则每次调用时都会重新编译。引入 PHP 缓存机制通常可以提高 25% 到 100% 的性能,避免编译开销。
22. 尽量使用缓存,可以使用 memcached。Memcached 是一个高性能的内存对象缓存系统,可用于加速动态 Web 应用程序并减少数据库负载。它对于缓存操作代码 (OP 代码) 非常有用,这样脚本就不必为每个请求重新编译。
23. 当你使用字符串并需要检查其长度是否满足某些要求时,你自然会使用 strlen() 函数。该函数非常快,因为它不进行任何计算,只返回存储在 zval 结构(用于存储 PHP 变量的内置 C 数据结构)中的字符串的已知长度。但是,由于 strlen() 是一个函数,因此它有点慢,因为函数调用要经过许多步骤,例如小写字母(译者注:指的是小写的函数名,PHP 不区分大小写函数名)、哈希查找,并将与被调用函数一起执行。在某些情况下,你可以使用 isset() 技巧来加快代码的执行速度。
24. 增加或减少变量 $i 时,$i++ 比 ++$i 慢。此差异特定于 PHP,不适用于其他语言,因此请不要修改 C 或 Java 代码并期望它立即变快,它不会。++$i 更快,因为它只需要 3 条指令(操作码),而 $i++ 需要 4 条。后增量实际上会创建一个临时变量,然后将其增加。预增量直接增加原始值。这是一种优化,就像 Zend 的 PHP 优化器所做的那样。记住这个优化是个好主意,因为并非所有操作码都进行相同的优化,并且有很多互联网服务提供商 (ISP) 和服务器没有配备操作码。
25. 并非所有事物都必须面向对象 (OOP)。面向对象编程通常非常昂贵,并且每个方法和对象调用都会消耗大量内存。
26. 并非所有数据结构都需要使用类来实现;数组也非常有用。
27. 尝试尽可能多地使用 PHP 内置函数。
28.如果代码中有大量耗时函数,可以考虑将它们实现为C扩展。
29. 分析代码。分析器会告诉你代码的哪些部分占用了多少时间。Xdebug 调试器包含一个分析器,分析器通常可以显示代码的瓶颈。
30. mod_zip 可用作 Apache 模块来动态压缩数据,并将数据传输量减少 80%。
31、如果可以用file_get_contents代替file、fopen、feof、fgets等方法,尽量使用file_get_contents,效率高很多!但file_get_contents打开URL文件时要注意PHP版本问题;
32、尽量少进行文件操作,虽然PHP的文件操作效率不低;
33、优化Select SQL语句,尽量少做Insert和Update操作(我因为update而被批评)。
34. 不要在循环内声明变量,尤其是大变量:对象(这似乎不仅仅是 PHP 中的一个问题,对吗?);
35. 多维数组中尽量不要循环和嵌套赋值;
36、当可以使用PHP内部字符串操作函数时,不要使用正则表达式;
37. Foreach 更高效。尽量使用 foreach 代替 while 和 for 循环;
38. 使用单引号而不是双引号来引用字符串;
39.“使用i+=1代替i=i+1,符合C/C++的习惯,而且效率更高”;
40. 对于全局变量,使用后应该用unset()方法取消设置;
还没有评论,来说两句吧...