搜索
首页后端开发PHP问题php代码怎么优化?

php代码怎么优化?

Oct 11, 2019 pm 02:27 PM
php代码优化

php代码怎么优化?下面本篇文章就来给大家介绍一些PHP代码优化的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

php代码怎么优化?

PHP代码优化

1、尽量静态化

如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍。

当然了,这个测试方法需要在十万级以上次执行,效果才明显。

其实静态方法和非静态方法的效率主要区别在内存:静态方法在程序开始时生成内存,实例方法(非静态方法)在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例再调用,静态速度很快,但是多了会占内存。

任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例方法申请的是离散的空间,所以当然没有静态方法快。

静态方法始终调用同一块内存,其缺点就是不能自动进行销毁,而实例化可以销毁。

2、echo效率高于print

因为echo没有返回值,print返回一个整型。测试:

echo
0.000929 - 0.001255 s (平均 0.001092 seconds)

print
0.000980 - 0.001396 seconds (平均 0.001188 seconds)

相差8%左右,总体上echo是比较快的。

注意:echo输出大字符串的时候,如果没有调整就会严重影响性能。打开Apache的mod_deflate进行压缩,或者打开ob_start将内容放进缓冲区可以改善性能问题。

3、循环最大次数

在循环之前设置循环的最大次数,而非在在循环中。

4、及时销毁变量

数组和对象在 PHP 中特别占内存的,这个由于 PHP 的底层的zend引擎引起的。一般来说,PHP数组的内存利用率只有 1/10, 也就是说,一个在C语言里面100M 内存的数组,在PHP里面就要1G。

特别是在PHP作为后台服务器的系统中,经常会出现内存耗费太大的问题。

5、避免使用像__get、__set、__autoload等魔术方法

(仅供参考,有待商榷)

对于__开头的函数就命名为魔术函数,此类函数都在特定的条件下触发的。总得来说,有下面几个魔术函数__construct()、__destruct()、__get()、__set()、__unset()、__call()、__callStatic()、__sleep()、__wakeup()、__toString()、__set_state()、__clone()、__autoload()。

其实,如果__autoload() 不能高效的将类名与实际的磁盘文件(注意,这里指实际的磁盘文件,而不仅仅是文件名)对应起来,系统将不得不做大量的文件是否存在判断(需要在每个include path中包含的路径中去寻找),而判断文件是否存在需要做磁盘I/O操作,众所周知磁盘I/O操作的效率很低,因此这才是使得autoload机制效率降低的原因。

因此,我们在系统设计时,需要定义一套清晰的将类名与实际磁盘文件映射的机制。这个规则越简单越明确,autoload机制的效率就越高。

结论:autoload机制并不是天然的效率低下,只有滥用autoload,设计不好的自动装载函数才会导致其效率的降低.

所以说尽量避免使用__autoload魔术方法,有待商榷。

6、requiere_once() 和 include_once() 比较耗资源

这是因为requiere_once()和include_once()需要判断该文件是否被引用过,所以能不用尽量不用。常用require/include方法避免。鸟哥在其博客中就多次声明尽量不要用require_once和include_once。

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

如果包含相对路径,PHP会在include_path里面遍历查找文件。

用绝对路径就会避免此类问题,因此解析操作系统路径所需的时间会更少。

8、使用$_SERVER['REQUSET_TIME']

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

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

9、用内置函数替代正则表达式

能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率高于正则。

没得说,正则最耗性能。

有没有你漏掉的好用的函数?例如:strpbrk()、strncasecmp()、strpos()、strrpos()、stripos()、strripos()。

strtr() 函数用于转换指定字符,如果需要转换的全是单个字符的时候,用字符串而不是数组:

<?php
$addr = strtr($addr, "abcd", "efgh");       // good
$addr = strtr($addr, array(&#39;a&#39; => &#39;e&#39;, ));  // bad

效率提升:10 倍。

10、用strtr作字符替换

str_replace字符替换比正则替换preg_replace快,但strtr比str_replace又快1/4。

另外,不要做无谓的替换,即使没有替换,str_replace也会为其参数分配内存。很慢!

解决办法:用 strpos 先查找(非常快),看是否需要替换,如果需要,再替换。

效率:如果需要替换,效率几乎相等,差别在 0.1% 左右。如果不需要替换:用 strpos 快 200%。

11、用字符串而不是数组作为参数

如果一个函数既能接受数组,又能接受简单字符做为参数,那么尽量用字符作为参数。例如字符替换函数,参数列表并不是太长,就可以考虑额外写一段替换代码,使得每次传递参数都是一个字符,而不是接受数组做为查找和替换参数。大事化小,1+1>2。

12、最好不用@

用@掩盖错误会降低脚本运行速度,并且在后台有很多额外操作。用@比起不用,效率差距 3 倍。特别不要在循环中使用@,在 5 次循环的测试中,即使是先用error_reporting(0)关掉错误,在循环完成后再打开,都比用@快。

13、数组元素加引号

$row['id']$row[id]速度快7倍,建议养成数组键名加引号的习惯。

14、别在循环里用函数

例如:

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

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

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

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

16、方法里建立局部变量

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

17、局部变量比全局变量快2倍

由于局部变量是存在栈中的,当一个函数占用的栈空间不是很大的时候,这部分内存很有可能全部命中cache,这时候CPU访问的效率是很高的。

相反,如果一个函数里既使用了全局变量又使用了局部变量,那么当这两段地址相差较大时,cpu cache需要来回切换,那么效率会下降。

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

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

19、提前声明局部变量

建立一个未声明的局部变量要比一个已经定义过的局部变量慢9-10倍。

20、谨慎声明全局变量

声明一个未被任何一个函数使用过的全局变量也会使性能降低(和声明相同数量的局部变量一样)。PHP可能去检查这个全局变量是否存在。

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

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

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

23、函数快于类方法

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

24、用单引号代替双引号会快一些

因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。

PHP 引擎允许使用单引号和双引号来封装字符串变量,但是它们的速度是有很大的差别的!使用双引号的字符串会告诉 PHP 引擎,首先去读取字符串内容,查找其中的变量,并改为变量对应的值。一般来说字符串是没有变量的,所以使用双引号会导致性能不佳。最好是使用字符串连接而不是双引号字符串。

$output = "This is a plain string";  // 不好的实践
$output = &#39;This is a plain string&#39;;  // 好的实践

$type = "mixed";                     // 不好的实践
$output = "This is a $type string";

$type = &#39;mixed&#39;;                     // 好的实践
$output = &#39;This is a &#39; . $type .&#39; string&#39;;

25、echo字符串用逗号代替点连接符更快些

echo可以把逗号隔开的多个字符串当作“函数”参数传入,所以速度会更快。(说明:echo是一种语言结构,不是真正的函数,故把函数加上了双引号)。例如:

echo $str1, $str2;       // 速度快
echo $str1 . $str2;      // 速度稍慢

26、尽量静态化

Apache/Nginx解析一个PHP脚本的时间,要比解析一个静态HTML页面慢2至10倍,所以尽量使页面静态化,或使用静态HTML页面。

27、使用缓存

Memchached或者Redis都可以。

高性能的分布式内存对象缓存系统,提高动态网络应用程序性能,减轻数据库的负担。

也对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

28、使用整型保存IP

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

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

29、检查email有效性

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

30、使用MySQLi或PDO

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

31、屏蔽敏感信息

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

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

32、引用传递参数

通过参数地址引用使函数有多个返回值,在参数变量前加个“&”表示按地址传递,而非按值传递。

33、使用++$i递增

当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

34、不要随便复制变量

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

// 不好的实践
$description = $_POST[&#39;description&#39;];
echo $description;

// 好的实践
 echo $_POST[&#39;description&#39;];

35、使用选择分支语句

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

36、用file_get_contents替代file、fopen、feof、fgets

在可以用file_get_contents()替代file()、fopen()、feof()、fgets()等系列方法的情况下,尽量用file_get_contents(),因为他的效率高得多!但是要注意,file_get_contents()在打开一个URL文件时候的PHP版本问题。

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

38、优化Select SQL语句

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

39、尽可能的使用PHP内部函数

40、循环内部不要声明变量,尤其是大变量:对象

这好像不只是PHP里面要注意的问题吧?

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

42、循环用foreach效率更高

尽量用foreach代替while和for循环

43、对global变量,应该用完就unset()掉

44、mod_deflate压缩输出

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

45、数据库连接当使用完毕时应关掉,不要用长连接

46、split比exploade快

split()
0.001813 - 0.002271 seconds (avg 0.002042 seconds)

explode()
0.001678 - 0.003626 seconds (avg 0.002652 seconds)

以上是php代码怎么优化?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
酸与基本数据库:差异和何时使用。酸与基本数据库:差异和何时使用。Mar 26, 2025 pm 04:19 PM

本文比较了酸和基本数据库模型,详细介绍了它们的特征和适当的用例。酸优先确定数据完整性和一致性,适合财务和电子商务应用程序,而基础则侧重于可用性和

PHP安全文件上传:防止与文件相关的漏洞。PHP安全文件上传:防止与文件相关的漏洞。Mar 26, 2025 pm 04:18 PM

本文讨论了确保PHP文件上传的确保,以防止诸如代码注入之类的漏洞。它专注于文件类型验证,安全存储和错误处理以增强应用程序安全性。

PHP输入验证:最佳实践。PHP输入验证:最佳实践。Mar 26, 2025 pm 04:17 PM

文章讨论了PHP输入验证以增强安全性的最佳实践,重点是使用内置功能,白名单方法和服务器端验证等技术。

PHP API率限制:实施策略。PHP API率限制:实施策略。Mar 26, 2025 pm 04:16 PM

本文讨论了在PHP中实施API速率限制的策略,包括诸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之类的库。它还涵盖监视,动态调整速率限制和手

php密码哈希:password_hash和password_verify。php密码哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文讨论了使用password_hash和pyspasswify在PHP中使用密码的好处。主要论点是,这些功能通过自动盐,强大的哈希算法和SECH来增强密码保护

OWASP前10 php:描述并减轻常见漏洞。OWASP前10 php:描述并减轻常见漏洞。Mar 26, 2025 pm 04:13 PM

本文讨论了OWASP在PHP和缓解策略中的十大漏洞。关键问题包括注射,验证损坏和XSS,并提供用于监视和保护PHP应用程序的推荐工具。

PHP XSS预防:如何预防XSS。PHP XSS预防:如何预防XSS。Mar 26, 2025 pm 04:12 PM

本文讨论了防止PHP中XSS攻击的策略,专注于输入消毒,输出编码以及使用安全增强的库和框架。

PHP接口与抽象类:何时使用。PHP接口与抽象类:何时使用。Mar 26, 2025 pm 04:11 PM

本文讨论了PHP中接口和抽象类的使用,重点是何时使用。界面定义了无实施的合同,适用于无关类和多重继承。摘要类提供常见功能

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具