浅谈php优化需要注意的地方


Posted in PHP onNovember 27, 2014

我们在编写程序时,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少。往往我们在追求这些的同时却失去了很多东西。下面我想讲讲我对PHP优化的理解。优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码。

进行大范围的优化,而不是死啃某些程序代码

我这里所说的优化,基本上都是从服务器,Apache,数据库这些方面来进行的优化,而并不是对你的PHP代码加以改进从而提高程序的运行速度,因为比起你将程序中的正则优化为字符串处理函数从而提升程序速度来说,在大范围内进行的优化所需要的代价要比这个小的多,而获得报酬却要丰厚的多。

在非代码处进行优化有以下好处:

1、通常情况下能够大大提高效率

2、不会危及到代码的完整性

3、能够快速部署

缓存技术

下面来说说常用的缓存技术,通过这些缓存技术能够大大的提高效率

在说到缓存技术的时候不得不提到memcached ,memcached是高效、快速的分布式内存对象缓存系统,主要用于加速 WEB 动态应用程序。

Memcached的原理

memcached 是以守护程序方式运行于一个或多个服务器中,等待接收客户端的连接操作,客户端可以由各种语言编写(例如PHP)。PHP 等客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。

说完memcached,下面来说说常用的缓存方法

1、编译与OPCODE缓存

因为PHP是解释型的语言,所以每个PHP文件在运行的时候都需要编译后再执行,同一个文件,不同的用户访问,或者同一个用户不同时间访问同一个文件,每次都需要重新编译然后运行,这样就耗费了大量时间。

通过编译缓存每个文件在修改之后只编译一次这样就减少了文件IO操作,用户访问后机器指令直接从内存中取出并执行而不是硬盘中读出。

最常见的PHP编译缓存工具有:APC,Accelerator,xcache

2、全局页面缓存? Squid Cache

Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器,Squid作为网页服务器的前置cache服务器通过缓存相关请求来提高Web服务器的速度。

3、局部缓存之SQL缓存

在大多数应用程序中主要的瓶颈往往可以追溯到数据库的操作中,一般都是因为复杂的数据库查询而耗费了大量时间,而SQL缓存可以大大降低复杂查询造成的负荷。

SQL缓存的例子(使用了memcached扩展)

代码片段:

$key = md5(“some sort of sql query”);

if (!($result = memcache_get($key))) {

$result = $pdo->query($qry)->fetchAll();

// 缓存查询结果一小时

memcache_set($key, $result, NULL, 3600);

}

4、局部缓存之代码块缓存

为了优化PHP程序,有时候我们不得不优化一个个代码段来减少那么一点点的执行的时间,但是比起优化复杂的不同的PHP代码段还不如通过缓存来直接忽略这些代码段的优化,这样做的好处是:

1、能够很快的看到效果

2、不会破坏以前的代码

3、速度要比优化代码要快得多

代码块缓存的列子(同样使用了memcached扩展)

代码片段:

function complex_function_abc($a, $b, $c) {

$key = __FUNCTION__ . serialize

(func_get_args());

if (!($result = memcache_get($key))) {

$result = //函数代码

// 储存执行结果1小时

memcache_set($key, $result, NULL, 3600);

}

return $result;

}

当然除了上述方法外还可以用到文件缓存(将数据库中的数据取出储存在文件中),还可以生成静态HTML文件等,但是这些方法的缓存还是将文件储存在硬盘上而不是内存中。

输出控制

除了上述缓存技术外还可以通过输出控制来让程序执行的时间更少

下面通过PHP与APACHE来说说输出控制

1、PHP输出控制

这里最主要用到ob_start()以及PHP中的OB系列函数,这些函数可以做什么呢?

第一就是静态模版技术。所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。

代码示例:

<?php

ob_start(); //打开缓冲区

?>

php页面的全部输出

<?php

$content = ob_get_contents(); //取得php页面输出的全部内容

$fp = fopen(“output.html”, “w”); //创建一个文件,并打开,准备写入

fwrite($fp, $content); //把php页面的内容全部写入output.html,然后……

fclose($fp);

?>

当然这个ob系列函数还有其他很多用处我就不在这里一一说明了。

2、apache输出控制

将SendBufferSize设置为页面大小,这样就能将页面一次性放在发送缓冲区从而增加处理速度。

SendBufferSize 指令

说明:TCP发送缓冲区大小(字节)

语法:SendBufferSize bytes

默认值:SendBufferSize 0

作用域:server config

状态:MPM

模块:beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

这个指令设置服务器的TCP发送缓冲区的大小(字节)。提高这个值会导致两个后果:高速度和高潜伏时间(100ms左右)。如果设置为”0″,将使用操作系统默认值。

通过源代码方式编译你的Apache/PHP/Database 可让你的程序增加10?15%的速度

下面再说说在代码优化的时候应该注意的

1、短代码不等于快的代码

很多人在写程序时希望将代码写的越简洁越好,但是越短的代码有时候反而需要更长的执行时间,所以哪怕是用更多的代码也不使用速度慢的代码

2、在写程序的时候更应该注重程序的扩展性,而不是追求速度

3、在优化你的代码之前,先看看跟数据库有关的部分,因为大多数应用程序的瓶颈在数据库而不是代码

4、微优化得不偿失

什么叫做微优化?就像前面所说的将正则表达式部分的代码改用字符串函数代替。这样做有以下缺点:

(1)花费时间较长

(2)不会解决你的性能问题

(3)很有可能会破坏以前的代码从而产生未知的错误

(4)付出大于回报

这里还不得不提到一个误区,有些人为了让程序更加优化,在分析业务逻辑的时候便将优化考虑在内了,从而为了得到更优的代码而改动业务逻辑。这是十分愚蠢的想法,因为程序的目的便是为了处理现实中遇到的问题,是为这些问题服务的,怎么能本末倒置呢。

php优化是个永恒的话题,想全面的做个总结也不太现实,这里仅仅是自己的一些个人经验,不一定全部正确,就当抛砖引玉了吧,给需要的小伙伴们一个参考。

PHP 相关文章推荐
用PHP实现维护文件代码
Jun 14 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
Jun 05 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 PHP
php模拟服务器实现autoindex效果的方法
Mar 10 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
php实现的rc4加密解密类定义与用法示例
Aug 16 PHP
laravel Model 执行事务的实现
Oct 10 PHP
PHP实现文件下载详解
Nov 27 #PHP
thinkphp的URL路由规则与配置实例
Nov 26 #PHP
thinkphp文件引用与分支结构用法实例
Nov 26 #PHP
PHP获取当前所在目录位置的方法
Nov 26 #PHP
thinkphp模板的包含与渲染实例分析
Nov 26 #PHP
PHP中strtr字符串替换用法详解
Nov 26 #PHP
thinkphp模板继承实例简述
Nov 26 #PHP
You might like
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
python字符串查找函数的用法详解
2019/07/08 Python
详解Python在使用JSON时需要注意的编码问题
2019/12/06 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python读取图片的几种方式及图像宽和高的存储顺序
2020/02/11 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
先进工作者获奖感言
2014/02/08 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
二十年同学聚会感言
2015/07/30 职场文书
教导处教学工作总结
2015/08/12 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android