>백엔드 개발 >PHP 문제 >PHP 코드를 최적화하는 방법은 무엇입니까?

PHP 코드를 최적화하는 방법은 무엇입니까?

青灯夜游
青灯夜游원래의
2019-10-11 14:27:524105검색

PHP 코드를 최적화하는 방법은 무엇입니까? 다음 기사에서는 PHP 코드를 최적화하는 몇 가지 방법을 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다. ### ## ## ## ## ## ## ## #######php 코드 최적화#🎜🎜 ## ## 🎜🎜 ###### #1. 가능한 한 세 번 정적인 자세를 유지하도록 노력하세요.

물론 이 테스트 방법은 레벨 100,000 이상에서 실행해야 효과가 뚜렷하게 나타납니다. PHP 코드를 최적화하는 방법은 무엇입니까?

사실 정적 메서드와 비정적 메서드 효율성의 주요 차이점은 메모리입니다. 정적 메서드는 프로그램이 시작될 때 메모리를 생성하고, 인스턴스 메서드(비정적 메서드)는 프로그램이 시작될 때 메모리를 생성합니다. 프로그램이 실행 중이므로 정적 메서드를 직접 호출할 때 인스턴스 메서드는 먼저 인스턴스를 만든 다음 호출해야 합니다. 정적 메서드는 매우 빠르지만 너무 많으면 메모리를 차지합니다.

모든 언어가 메모리와 디스크에서 작동하는지 여부는 소프트웨어 계층의 문제일 뿐이지만 구현 방법이 다릅니다. 정적 메모리는 프로그램 시작 시 생성되기 때문에 연속적이지만, 인스턴스 방식은 불연속적인 공간을 적용하므로 당연히 정적 방식만큼 빠르지는 않습니다. 정적 메서드는 항상 동일한 메모리를 호출합니다. 단점은 자동으로 소멸될 수 없지만 인스턴스화는 소멸될 수 있다는 것입니다.

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가 큰 문자열을 출력할 때 조정이 없으면 성능에 심각한 영향을 미칩니다. 압축을 위해 Apache의 mod_deflate를 켜거나 콘텐츠를 버퍼에 넣기 위해 ob_start를 켜면 성능 문제가 개선될 수 있습니다.

3. 최대 루프 수

루프 도중이 아닌 루프 전의 최대 루프 수를 설정합니다.

4. 시간에 따른 변수 삭제

이는 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()가 클래스 이름을 실제 디스크 파일과 효율적으로 일치시킬 수 없는 경우(참고: 이는 파일 이름뿐만 아니라 실제 디스크 파일을 나타냄) 시스템은 다음을 수행해야 합니다. 많은 수의 파일이 존재하는지 확인하고(각 포함 경로에 포함된 경로에서 검색해야 함), 파일이 존재하는지 확인하려면 디스크 I/O 작업이 필요합니다. 우리 모두 알고 있듯이 디스크 I/O 작업의 효율성은 매우 중요합니다. 매우 낮기 때문에 이것이 자동 로드 메커니즘의 효율성이 떨어지는 이유입니다. 따라서 시스템을 설계할 때 클래스 이름을 실제 디스크 파일에 매핑하는 명확한 메커니즘을 정의해야 합니다. 이 규칙이 더 간단하고 명확할수록 자동 로드 메커니즘은 더 효율적입니다.

결론: 자동 로드 메커니즘은 본질적으로 비효율적입니다. 자동 로드의 남용과 잘못 설계된 자동 로드 기능만이 효율성 감소를 초래할 수 있습니다.

그러므로 이를 피하십시오. __autoload 매직 메소드는 의문의 여지가 있습니다.

6. requirere_once() 및 include_once()는 상대적으로 리소스 집약적입니다.

이것은 requirere_once() 및 include_once()가 필요하기 때문입니다. 파일이 이전에 인용되었는지 여부를 확인하므로 가능하면 사용하지 마십시오. 피하기 위해 일반적으로 사용되는 require/include 메소드가 있습니다. Niao 형제는 자신의 블로그에서 require_once와 include_once를 사용하지 말라고 여러 번 언급했습니다.

7. include 및 require에서 절대 경로를 사용합니다.

상대 경로가 포함된 경우 PHP는 파일을 찾기 위해 include_path를 탐색합니다.

절대 경로를 사용하면 이러한 문제를 피할 수 있으므로 운영 체제 경로를 해결하는 데 시간이 덜 걸립니다.

8. $_SERVER['REQUSET_TIME']

을 사용하세요. 스크립트 실행 시간을 얻으려면 $_SERVER['REQUSET_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으로 문의하세요.