php性能

介绍一下强大的纯PHP高性能的socket服务器框架workerman

Workerman是什么样的框架?很多新手php程序员或中级程序员不一定知道也没有接触过这类框架。

Workerman是一款纯PHP开发高性能的socket服务器框架。目前在市场被广泛的用于移动通讯,手游服务端、网络游戏、聊天室、硬件通讯、智能家居、物联网等领域的开发。并且完美支持TCP长连接,支持网页Websocket、HTTP等通信协议,还有其它常见的通信组件比如Redis等。

为什么PHP在消息通信,物联网智能开发都需要Workerman?我们看下它的对php开发在socket的主要特点。

php开发网站我们一般都会配置好环境才能正常运行,而Workerman纯PHP开发不依赖php-fpm、apache、nginx这些容器就可以独立运行,而且可以多个独立运行,完全分开不受其他影响。

Workerman支持PHP多进程高并发,万人同时在线聊天打游戏完全无压力。

Workerman支持长连接,这个主要使用在实时通信领域,比如保持长连接,比如聊天室、游戏等。

Workerman支持各种应用层协议,也可以自己设计协议,目前使用的的协议都可以支持。

Workerman其他优势特点:支持服务平滑重启,支持HHVM,支持TCP、UDP,支持异步IO等等。

对于PHP开发者Workerman是一个难得的服务框架。

展开
收起

PHP 8 性能基准测试

外国科技媒体 Phoronix 发布了针对 PHP 8 的性能基准测试报告。由于 PHP 8 Alpha1 大约要到6月中旬才发布,所以 Phoronix 从 PHP 8 最新的 Git 代码(截至5月底)构建了用于测试的版本。PHP 8 重要新特性除了新的 JIT 编译器,还包括新的静态返回类型、union types 2.0(联合类型)和 attributes(属性)等。

用于参考对比的版本包括:PHP 7.4.6, 7.3.18, 7.2.31, 7.1.33, 7.0.33, 5.6.39, 5.5.38 和 5.4.44,以及启用了 JIT (Just In Time) 的 PHP 8。

所有受测试的版本都是在相同系统中使用相同的编译器和 PHP 配置文件以相同的方式进行构建,测试环境如下:

测试结果如下:

上图显示了使用 PHPbench 测试各版本 PHP 的性能结果。可以看到,从 PHP 7.4 stable 到 PHP 8 有小幅度改进,大约是 7% 的提升,但如果 PHP 8 启用了 JIT,性能改进可以说是非常明显,比 PHP 7.4 stable 提升了 92%。至于更旧的版本,PHP 8 with JIT 的性能是 PHP 5.4 的 5 倍。

上图是各版本 PHP 微服务基准测试的结果,通过一些 PHP 自带的内置测试,可以看到 PHP 8.0 的速度比已经很快的 PHP 7.4 略有提高,而启用 JIT 支持后,其速度更是碾压全场。

上图的测试结果显示,在使用 Phoronix Test Suite Self Tests 进行测试的过程中,无论是否开启 JIT,PHP 8 的性能

与 PHP 7 的成绩都没有明显的改进,主要是遇到了 I/O 瓶颈,所以总体上没有产生太大的差异。

同样的,在渲染测试和合并测试方面,启用 JIT 的 PHP 8 没有产生明显的优势,不过与旧版本 PHP 5 相比,PHP 8 的性能有了显著的提升。

上图是综合了各测试结果的评分数据对比,就目前的开发状态来看,PHP 8.0 的速度是 PHP 5.4-5.6 的 3 倍左右,启用 JIT 后,就变成了 4 倍左右的差距。

从数据来看,PHP 8.0 是一个相当值得期待的版本,无论是性能方面的提升还是语言特性的增加。

展开
收起

php7.4候选版发布,性能又有了稳定提升

最近,万众期待的php7.4候选版本终于正式发布了。

接下来我们看看php7.4主要有哪些改进,以及在性能上有哪些提升。

首先,php7.4修复了大量的bugs,其中有些是内核的bug。

其次,这次发布的版本是所有新功能的增加的集合,也是锁定版,之后的正式版将不会增加新的功能,只会是修改bug和提升性能。

然后,php7.4的正式版发布日期也确定了下来,不出意外的话,会在2019年11月份发布。

接着,我们来说下php7.4带来了哪些新特性和改进。

新增加了FFI扩展功能,它可以让我们通过php代码,就可以直接访问c语言函数和变量以及结构体。GD库扩展新增加了TGA图片的支持SQLite3支持线上备份OpenSSL版本支持TLS1.3短闭包的支持预加载的支持自定义序列化改进类型差异简化Null合并运算符弃用短标签数组支持展开运算符

amd epyc php benchmarks

最后,我们看下php7.4的性能有怎样的提升。

下面是php7.4, php7.3, php7.2, php7.1, php7.0, php5.6的性能测试比较,测试环境是在debian系统下amd cpu环境下测试的。

php benchphp benchphp bench

从上面的测试结果我们可以看出来,虽然php7.4的性能提升相对来说很小,但是可以看出,在功能增加的情况下,性能依然在稳步提升。这些性能的提升,让我们很期待,也很坚信php8将会有更好的未来。

还有2个月php7.4就会正式发布,让我在接下来的日子来等待属于php的又一次辉煌的到来。

展开
收起

ThinkPHP5提升性能的小窍门

关于使用tp5框架如何提升部分性能,框架中很多影响性能的问题在于,很多请求都要重新加载,如果能避免过度加载的问题,就能提升部分性能,所以我们通过缓存来实现这一功能,具体如下。

首先说明 如果是linux 或者是Mac,需要给予权限才能操作

以下方法建议,在网站稳定后再生成上传。

1 生成路由缓存

php think optimize:route

如果你的应用定义了大量的路由规则,那么建议在实际部署后生成路由缓存文件,可以免去路由注册的开销,从而改善路由的检测效率

这里如果没有权限 会报异常 我这里是Mac 需要加sudo

sudo php think optimize:route

成功以后会在runtime 目录下生成一个 route.php 文件

2 生成类库映射文件

sudo php think optimize:autoload

类库映射文件可以提高自动加载的性能

成功以后会在runtime目录下生成 classmap.php 文件

3 生成数据表字段缓存如果你希望提高查询的性能,可以通过生成字段缓存来减少查询

sudo php think optimize:schema

执行完毕,会在RUNTIME_PATH目录下面创建schema目录,然后在该目录下面按照database.table.php的文件命名生成数据表字段缓存文件。

4 开启请求缓存如果你的数据实时性不是很大 可以开启,

// 是否开启请求缓存 true自动缓存 支持设置请求缓存规则'request_cache' => true, 这里默认是false ,开始后性能有很大的提高

5 可以为应用或者模块生成配置缓存文件

sudo php think optimize:config

默认生成应用的配置缓存文件,调用后会在runtime目录下面生成init.php文件,生成配置缓存文件后,应用目录下面的config.phpcommon.php以及tags.php不会被加载,被runtime/init.php取代。

这里要注意 在本地生成配置缓存时 需要把数据库等重要的配置替换成服务器上的配置以后 ,在生成。

一点PHP,每天一点分享,点点关注支持作者,谢谢。

展开
收起

4种方式优化服务器,可以提高PHP性能

服务器是提供计算服务的设备,具有承担服务和保障服务的能力,一般来说在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面的要求较高。PHP是一种在服务器端执行的嵌入HTML文档的脚本语言,因此服务器的功能关乎到PHP的性能。那么,如何优化服务器来提高PHP性能呢?服务器的运行速度提升了,PHP性能自然也会相应地增强。

接下来,小编就跟大家介绍一下4种优化服务器的方式,希望对大家有所帮助:

1、使用内存数据库

内存数据库,就是将数据放在内存中直接操作的数据库。对比传统的磁盘,内存数据库重新设计了体系结构,在数据缓存、快速算法、并行操作方面也进行了相应的改进,因此内存的数据读写速度较高,能够极大地提高应用的性能。

2、使用RDD

在大数据云计算领域的一些相关应用中,Spark可以用来加快数据处理速度,Spark的核心就是RDD。

3、使用SSD

不仅要优化内存,还可以优化磁盘。SSD(固态磁盘)具有快速读写、质量轻、能耗低以及体积小等特点,有条件的公司可以使用SSD来代替机械硬盘。

4、优化数据库

数据量的不断增加,数据库的访问速度也会越来越慢,这时候就需要提升请求处理速度,改变原来的单表。根据公司业务上合适的规则对数据库进行分区分表,可以有效提高数据库的访问速度,提升服务器的整体性能,此外,对于业务上的查询请求,在建表的时候可以根据相关需求设置索引等,方便提高查询速度。

展开
收起

LNMP 性能优化之 PHP 性能优化

PHP 做一门弱类型动态语言,在上手容易和开发快速同时,也会导致一些新手写出不规范的代码。比如在递归当中连接数据库读取数据;一次性从文件中读取大量的数据,处理完后却不主动释放内存;在遍历和循环中重复计算某个变量等等;数组的键没有加引号导致先查找常量集,都会导致 PHP 程序性能下降。

PHP 作为一门 Web 后端脚本语言,好处是能够快速实现 Web Application 所需功能,而且容易部署。缺点就是相对于强类型静态语言如 Java/C/C++ 来说,PHP 的性能较差,在实现计算密集型的业务时没有任何优势。同时也由于 PHP 是同步阻塞的 IO 模型,在高并发请求的场景下容易遇到瓶颈,需要通过 PHP 相关扩展来解决相关技术难题。

PHP 作为一门胶水语言,势必会连接各种各样服务。常见的服务如:MySQL、Redis、MongoDB 等数据库,C/C++、GO、Java 等语言编写的后端服务。倘若 PHP 所连接服务不稳定,势必也会对 PHP 造成一定的性能影响。

在某些情况,某个 PHP 程序或某段 PHP 代码莫名其妙地出现相当耗时的情况,不知道是 PHP 本身出现了问题,还是所用的框架出现了问题,亦或是 PHP 周边甚至是硬件的问题。这个时候就需要通过工具进行排查。常用的工具有:PHP-Xhprof、PHP-XDebug。

PHP 的底层是由 C 语言组成的。每次运行 PHP 的程序,都是需要经过 C 语言编写的 Zend 引擎来解析 PHP 文件,将其编译成为 Opcodes 后再去执行。就这样一来一回就消耗了不少时间和硬件性能。

PHP 运行流程

Scanning(Lexing),将 PHP 代码转换为语言片段(Tokens)。

Parsing,将 Tokens 转换成简单而有意义的表达式(Expression)。

Compilation,将表达式编译成 Opocdes。

Execution,顺次执行 Opcodes,每次一条,从而实现 PHP 脚本的功能。

(*.php) -> scanner -> (Tokens) -> Parser -> (Expression) -> Compilation -> (Opcodes) -> Execution -> (Output)

PHP 语言级性能优化

尽可能地使用内置函数来完成任务

能使用 PHP 内置方法解决的问题,就不要自己手写代码,一是手写代码一般冗余较多,可读性不佳。二是手写代码需要解析编译为底层代码再执行,没有 PHP 内置函数的性能高。

for & range() 实现同一功能

<?phpfor ($i = 0; $i <1000; $i++) {$array1[$i] = $i+1000;}range(1000,1999);

以 foreach、in_array 和 array_merge 实现同一功能对比说明:

以 foreach 和 array_column() 实现同一功能对比说明:

以 foreach 和 array_filter() 实现同一功能对比说明:

从服务器方面进行优化,可以选择将服务器不安装其他后端服务软件,仅仅安装 PHP 以及其必要扩展。使单机的性能全部向 PHP 倾斜。同时也对 PHP 的相关参数进行优化,将 PHP 单机服务器性能最大化。在大数据、高并发的场景下,可以尝试将 PHP 服务器集群化,通过负载均衡,将网络请求分配至不同的 PHP 单机服务器处理。

展开
收起

PHP性能调优之PHP代码最佳实践

我以下面三个例子为例,来说下PHP代码优化。

1、使用require与使用require_once 的对比。

2、提前计算一个for循环的长度。

3、比较for、foreach和while 循环在访问数组元素时的性能。

在这里,具体的理论东西我不会太多说。我将从实际代码的角度让大家比较直观的了解下那个是最佳的代码实践。能够认识到代码的不同写法确实能给我们的整体性能带来提升。

PHP性能调优之PHP代码最佳实践

除此之外,还有一些其他的优化技术,比如file_get_contents获取内容的问题。使用逗号而不是句点来链接字符串,或者在字符串包含变量时使用双引好而不是单引号等等。这些大家可以自己在工作中测试和验证一下。

1、require 与 require_once。

说明,我的测试文件路径存放在了 : /var/shared/htdocs/myapp/models/MyModels/ 目录下。

加载四个外部类文件的基本代码:

require_once 代码片段

A类到D类分别是:

A到D类的代码片段

以上4个空类均可以帮助我们模拟一个需要在主脚本中使用外表PHP文件的PHP脚本。我们排除任何额外的函数调用。专注与使用 require_once()文件的加载。

将每一个类放在单独的文件中: classA.php、classB.php、ClassC.php、classD.php

将这些文件与代码放在同一个目录下。重启WEB服务器,使用ab测试工具进行测试。

ab命令模拟10万个请求,同一时间有5个并发请求,命令终止后,应该可以看到类似如下的结果。

ab -c 5 -n 100000 localhost /index.php

require_once ab 测试结果截图

使用此ab命令测试require_once()。我们可以看到,相应时间为99毫秒。我们的结果还说明,该脚本每秒可以支持100.63个请求。

现在,让我们将require_once()函数调用改成required()。重启WEB服务器,然后重新运行 ab 命令。结果如下所示:

require 代码片段

每秒可支持的请求数量有所提升,从 100.63增加到了105.44.这个结果还说明,代码的相应时间从最初的99.37毫秒降低到了94.84毫秒,减少了5毫秒。

require ab 测试结果截图

2、提前计算 for 循环的长度:

在进入循环之前计算循环长度是理工一个可以使用的优化技术。

如下图所示的代码是一个简单的for 循环。它将便利数组$items 并分10此计算出数值。要确定那些地方可以进行优化,你需要一步一步的分析嗲吗做了什么。

没有提前计算数组长度模拟代码片段

如上,代码循环10次,则count($items )计算10次。

如上代码,从10此计算数组长度降低到一次计算数组长度。我们可以使用函数 microtime() 来准确的计算出减少9次count()函数调用可以节省多少时间。如下所示:

计算没有提前计算数组长度时候执行时间片段

执行十次该代码并计算平均值,我们得出,10万次循环的总执行时间为0.046毫秒,重启服务器,然我们测试下如下代码,其中包含优化了的for 循环

提前计算过数组长度执行时间代码片段

我们再次运行10此代码并获取平均值。使用此代码,我们看到,for 循环的平均执行时间为0.0095,减少了0.036毫秒。优化过的代码快了0.036毫秒。

3、使用 foreach 、for 、while 循环访问数组元素。

访问数组数据的方法是可以优化的。方法是使用foreach 循环替代 while 或 for 循环。优化数据访问的方法至关重要。因为很多的web 应用程序需要从数据库或者XML 文件中读取数据并且必须遍历每一条记录后才能将数据显示给用户。为了演示这种优化,我们将使用如下的代码:

foreach 循环代码片段

如上创建了一个数组$items ,其中包含10万个元素,每个元素还有155个字节的字符串,代表数据库中的典型数据。在后该代码设置了开始时间并使用foreach 循环访问数组的每一个元素,最后,我们以毫秒为单位显示所示是时间。我么连续执行10次代码,然后计算出每次执行时间的平均数值,其结果是0.0078毫秒。

while 循环代码片段

重启服务器且运行该代码10此后,我们再次计算平均执行时间。用while 循环访问数组中的单个元素的平均时间为0.0099 毫秒。

最后一组循环比较的是for 循环。我们使用如下代码,按照同样的基准循环流程,重启服务器,执行代码10次并计算:

for 循环执行时间代码片段

上述三种循环基准的结果列于如下表中。表宗结果可以证明,使用foreach 循环访问数组是最好的方法。

三种循环执行时间比较

从上面的几个例子,我们可以感受到代码优化的重要性。

展开
收起

你的PHP项目遇到性能问题了吗?带你走进PHP语言性能处理

你的项目中遇到性能问题了吗?遇到性能问题你是如何解决的呢?你的解决方式是否正确呢?下面就跟大家一起分享php项目的性能问题。

在讨论性能问题时,我们要明白,整个项目的性能问题不仅仅包含php这一块,比如还有数据库服务、缓存服务、文件系统等,因此php性能问题在整个项目中只占一部分,在优化系统性能时要搞清楚是在优化系统整体性能还是在优化PHP单方面的性能。

php语言级性能分析

php在什么情况下会遇到性能问题呢?

首先,PHP是一门编程语言,我们知道每一门编程语言都有自己的优势及擅长的领域,所以使用php做了它不擅长的事情会很大概率遇到性能问题。再者,编码者在开发时PHP语法使用不恰当,导致php运行慢。最后,就是我们无法预估的问题,没有明确解决思路的性能问题。今天我们主要介绍PHP语言级的性能问题。

1、PHP性能检测的工具:ab(apache benchmark)

ab是由apache提供的压力测试工具,安装Apache时会自动安装此插件。

使用ab工具: ab -n1000 -c100 https://www.test.com

-n表示请求数,后面跟数字,总共发起的请求数

-c表示并发数,后面跟数字,同一时刻的请求数

url最后跟要检测的目标地址

我们对百度进行一个检测,注意:对别的网站进行ab测试时,-n和-c后面的数字小点,不然会对目标网站造成一定的压力,然后人家发现你就把你给kill了:

ab压测结果ab压测结果

这里我们只关注两个数据:

(1)、Requests per second:每秒可处理的请求数,越大越好 。

(2)、Time per request:每个请求处理耗时数,越小越好。

这样我们在每次进行过性能优化后可以通过前后这两项数据的对比确定优化有没有效果。

2、PHP语言级性能优化

(1)、多使用PHP自身携带的功能处理逻辑

如:有一个10000个用户信息的二维数组$userInfoList,要把它转为一维数组,且以uid为键名,username为键值,看多很多人写的代码都是通过foreach循环来实现,实际上这个是可以用PHP自带的数组函数来搞定的:

一般代码:

<?php

$userMap = array();

foreach ($userInfoList as $val) {

$userMap[$val['uid']] = $val['username'];

}

var_dump($userMap);

php数组函数:

<?php

$userMap = array_column($userInfoList, 'username', 'uid');

var_dump($userMap);

这个函数就能实现这种功能,代码简单又容易理解,运行速度还比自己包装的快。

函数参数:array_column($array, $column, [$index_key]);

(2)、php内置函数的也存在快与慢的差异

比如:查找一个index是否存在于数组$array的key中,大家都能想到使用array_key_exists($index, $array),当然有的同学也想到了使用isset($array[$index])这个函数。看下面代码:

<?php

//每项要多测几次,用平均值做比较

$array = rang(2000, 10000);

$start = time();

for ($i = 0; $i < 20000; $i ++) {

isset($array[$i]); //测完这个注释掉

//array_key_exists($i, $array);

}

$end = time();

$time = $end - $start;

echo $time;

没错,这两个函数都能实现相同的功能,然而在经过测算后发现,isset()函数的速度要快于array_key_exists()函数。所以大家平时使用内置函数时,要思考一下什么时候该使用哪个同类型的函数。

建议phper们多了解些内置函数的实现思路及函数计算的时间复杂度,大概知道了运算的时间复杂度的量级,那么在使用的时候就能够选择合适的函数。

(3)、总结几个比较常见的注意点

减少PHP魔法函数的使用,也叫魔术方法最好禁用掉PHP错误抑制符@,虽然很方便,但是最好别用减少在循环体内做大量运算使用带引号字符串做键值好了,今天的分享就到这里,如果喜欢我的内容,欢迎转发~~留言~~

谢谢~~

展开
收起

服务器如何优化来提高 PHP 性能?

据统计,83.6%的网站使用PHP运行。因此,对于Web托管,有必要确保良好的PHP性能。通过优化服务器,预防性维护和全天候监控,您可以从PHP主机获得高水平的响应。目前,香港巨网互联Bignet接受我们在管理客户端服务器时使用的服务器优化技术。

服务器

启用OpCode缓存

这可能是最简单,最有影响力的PHP优化。磁盘访问成本很高。每次访问都包括涉及磁盘访问的脚本,模板,设计和数据库记录。通过将OpCode缓存作为APC,我们能够将磁盘访问量减少近70%。这是因为重复请求是从在系统内存中运行的缓存提供的。

使用快速的PHP引擎和控制器

我们已经看到许多Apache Web托管服务器默认运行PHP 5.6,而mod_php充当控制器。 Mod_php在每个Apache进程中执行PHP解释器。它通过访问站点增加了内存使用量并使服务器负载很重。最重要的是PHP 5.6使用旧的Zend引擎,比上一代与PHPNG引擎兼容的PHP 7慢95%。通过使用PHP 7.2和php-fpm引擎作为控制器,我们可以看到性能和安全性的最佳结果。通过用PHP 7.2 + php-fpm + Nginx替换PHP 5.6 + modPHP + Apache的默认组合,我们能够将站点速度提高近150%。

优化查询,表和数据库配置

几乎所有PHP站点都使用MySQL数据库(或类似)来存储数据。在对网站性能问题进行故障排除时,我们已多次将其爬网到底层数据库。我们看到慢查询,碎片表和非优化配置导致数据库速度变慢,这影响了PHP站点的速度。慢速查询只能通过重写应用程序代码来解决,这对大多数Web服务器来说都是不实用的。在这种情况下,我们通过操作码缓存最小化性能问题的严重性。但是,我们可以通过审计和优化数据库服务器来提高数据库服务器的性能。我们调整的一些常见设置包括:

Innodb_buffer_pool_size:InnoDB数据库中缓冲区的大小(上一个查询的缓存)。通常设置为可用内存的50-70%。

Key_buffer_size:MyISAM数据库的缓冲区大小。通常,它设置为可用内存的20%。Max_ connections:每个用户可用的连接数。它会影响每个用户的内存使用情况。Query_cache_size:用于保存上一个查询的总内存大小。

将SSD用于数据库

硬盘驱动器是服务器中最慢的组件。在繁忙的电子商务托管服务器上,通过在SSD而不是机械硬盘上安装数据库目录,我们能够将性能延迟降低50%以上。然后,如果您尝试了所有操作并且卡在繁重的I/O中,请为/var目录获取SSD。例如,当您选择香港巨网互联Bignet香港服务器时,您可以选择SSD 240G硬盘或添加SSD硬盘来执行此操作。

隔离或限制记忆

并非所有PHP应用程序都是相同的。有些是编码良好,性能分析和性能调整。其他是随机编码的并且包含内存丢失。在共享服务器上,编码错误的PHP站点通常会导致服务器上的负载过大。为了防止这些站点影响服务器的其他用户,我们为其内存分配设置了严格的限制,或者将它们放在具有严格资源限制的虚拟服务器上。通过这种方式,即使一个或两个站点行为不端,大多数PHP客户端也将拥有快速的托管体验。

总之,PHP主宰了Web托管市场,每个Web托管服务提供商都需要调整服务器以提供最快的托管服务。香港巨网互联Bignet云中的所有虚拟主机都已通过之前的配置进行了优化,以提高PHP性能。所有上述配置都是我们在提供超快速PHP托管体验的过程中学到的一些技术。

(注:本文纯属作者原创,未经允许,请勿转载)

展开
收起

提高PHP性能的几个技巧

PHP博客分享关于在PHP编程语言中,如何提高效率问题,往往同样的功能,不一样的代码,出来的效率往往大不一样,博主总结以下几点分享给大家。

1.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它 是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

2.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。$row[’id’] 的速度是$row[id]的7倍。

3.echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。注销那些不用的变量尤其是大数组,以便释放内存。

5.尽量避免使用__get,__set,__autoload。

6.require_once()代价昂贵。include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

7.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

8.函数代替正则表达式完成相同功能。str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

9.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

10.用@屏蔽错误消息的做法非常低效,极其低效。

11.打开apache的mod_deflate模块,可以提高网页的浏览速度。

12.数据库连接当使用完毕时应关掉,不要用长连接。

13.错误消息代价昂贵。

14.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。递增一个全局变量要比递增一个局部变量慢2倍。递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

15.方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。派生类中的方法运行起来要快于在基类中定义的同样的方法。调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

16.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

17.尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

18.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回 在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

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

20.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。并非要用类实现所有的数据结构,数组也很有用。

21.不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?当你需要时,你总能把代码分解成方法。

22.尽量采用大量的PHP内置函数。如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

23.mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

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

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

26.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

27.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

28.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);多维数组尽量不要循环嵌套赋值;

29.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

30.foreach效率更高,尽量用foreach代替while和for循环;

31.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

32.对global变量,应该用完就unset()掉;

一点PHP,每天一点分享

展开
收起