PHP技术开发技巧分享


Posted in PHP onMarch 23, 2010

1. 提高PHP的运行效率

PHP的优点之一是速度很快,对于一般的网站应用,可以说是已经足够了。不过如果站点的访问量很高、带宽窄或者其它的因素令服务器产生性能瓶颈的时候,你可能得想想其它的办法来进一步提高PHP的速度了。

1.1. 代码优化

1、用i+=1代替i=i+1。符合c/c++的习惯,效率还高。

2、尽可能的使用PHP内部函数。自己编写函数之前要详细查阅手册,看有没有相关的函数,否则费力不讨好。

3、能使用单引号字符串尽量使用单引号字符串。单引号字符串的效率要高于双引号字符串。

4、用foreach代替while遍历数组。遍历数组时foreach的效率明显高于while循环,而且不需要调用reset函数。两种遍历方法如下:
程序1:

reset ($arr); 

while (list($key, $value) = each ($arr)) { 

echo "Key: $key; Value: $value\n"; 

}

 程序2:
foreach ($arr as $key => $value) { 

echo "Key: $key; Value: $value\n"; 

}

1.2. 压缩页面

HTTP1.1协议支持页面压缩传送,也就是说服务器把一个页面压缩传送到客户端,然后在客户端将页面解压缩再显示给客户。在服务器端有两种传输方式,一种是页面事先已经压缩好了,传送时只要将压缩页面传送到客户端就行,这种适用于静态网页多的情况,但是对于大多数站点,动态页面比较多,这种方法不太适合,因为很多传到客户端的页面其实是没有的,是服务器接到客户端用户请求动态产生的,所以就要求每生成一个动态页面都要在传到客户端以前先打包压缩。从PHP的4.0.4版以后,可以在php.ini文件中增加一行配置“output_handler = ob_gzhandler”,这样每个动态生成的页面在传送到客户端之前都会进行压缩,但是根据PHP官方站点的说明,这个参数不能与“zlib.output_compression = on”参数同时使用,因为容易引起PHP工作不正常,另外它只能压缩PHP程序的动态生成的页面,对于大量的静态页面尤其是图像文件就不行了。但是mod_gzip模块为Apahe提供了将静态页面在传给客户端以前先压缩的功能,它的压缩比最大能到10,一般情况下可以到 3,也就是说网站的传输速率一下提高了三倍多。要使用mod_gzip还要对Apache进行相应的配置,需要在httpd.conf文件中加入一些参数:

mod_gzip_on Yes(模块是否生效) 
mod_gzip_minimum_file_size 1002(最小压缩文件大小) 

mod_gzip_maximum_file_size 0(最大压缩文件大小,0表示没有限制) 

mod_gzip_maximum_inmem_size 60000(最大可占用内存) 

mod_gzip_item_include file "..gif102SINA>DOUBLE_QUOTATION (以gif结尾的文件要压缩传送) 

mod_gzip_item_include file ".txt102SINA>DOUBLE_QUOTATION 

mod_gzip_item_include file ".html102SINA>DOUBLE_QUOTATION 

mod_gzip_item_exclude file ".css102SINA>DOUBLE_QUOTATION

1.3. 文件缓存

这种方法通常是针对PHP、PERL等CGI程序而言的,因为这些程序有一个共同的特征就是接到用户的请求后不是马上将结果返回给用户,而是经过解释器解释执行后将执行结果返回给客户,这期间通常都要涉及到数据库的访问。这样就会出现一个问题,当两个用户访问同一个页面时,系统将分别对两个请求进行操作,但事实上这两个操作可能是一模一样的,这样无形当中增加了系统的负担。所以通常的解决办法是在系统内存中开辟出一段空间,当用户第一次访问页面后将执行结果存放在该内存中,当有用户再一次访问该页面时,系统就将页面直接从内存中调出而不需要重新解释执行,这段内存空间就叫缓存。目前流行的缓存管理程序是Zend Technologies公司的Zend Cache。
2. 执行系统外部命令

PHP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍。

在PHP中调用外部命令,可以用如下三种方法来实现:

2.1. 用PHP提供的专门函数

PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。

system()

原型:string system (string command [, int return_var])

system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。

例子:
system("/usr/local/bin/webalizer/webalizer");
exec()

原型:string exec (string command [, string array [, int return_var]])

exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。

例子:

 exec("/bin/ls -l"); 
 exec("/bin/ls -l", $res); 
 exec("/bin/ls -l", $res, $rc);

passthru()

原型:void passthru (string command [, int return_var])

passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。

例子:

 header("Content-type: image/gif"); 
 passthru("./ppmtogif hunte.ppm");

2.2. 用popen()函数打开进程

上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。

popen()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭它。

例子1
 $fp=popen("/bin/ls -l", "r");

例子2

/* PHP中如何增加一个系统用户 

下面是一段例程,增加一个名字为james的用户, 

root密码是 verygood。仅供参考 

*/ 

$sucommand = "su --login root --command"; 

$useradd = "useradd "; 

$rootpasswd = "verygood"; 

$user = "james"; 

$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user); 

$fp = @popen($user_add,"w"); 

@fputs($fp,$rootpasswd); 

@pclose($fp);

3. 养成良好的程序风格

在很多情况下PHP最可贵的特点也可能是它最薄弱的环节就是它的语法松散性。 PHP能够如此广泛的被使用,因为它使得许多没有经验的Web开发者能够制作出强大的应用程序,而用不着过多的考虑规划、连贯性和文档。不幸的是,正是以上的特点,很多的PHP源代码很臃肿,很难阅读甚至无法维护。决定代码可维护性的重要因素是代码的格式和注释。一个工程的所有代码应该以贯穿始终的形式组织。以下介绍的是如何在PHP程序中养成良好的程序代码风格。

3.1. 缩进

开发者所有的代码应该完全按照缩进的方式书写。这是提高代码可读性最基本的措施。即使你没有注释你的代码,缩进对于让其他人读懂你的代码也是非常大的帮助。

3.2. 增加注释

在编程时添加注释是一个好的习惯.PHP 允许在页面代码中添加注释,具体的注释方法与C语言注释语法相同,在脚本中可以加注释。可以用 "/*" 和 "*/" 来注释一段话。可用双斜杠“//”作为注释符。

3.3. 控制结构

这个很大程度上取决于个人口味。我仍然可以看到很多的控制结构代码不带分支语句造成可读性非常差,如???你使用IF语句时不带分支,不但可读性变差,当其他人修改你的程序时,还会造成很多的bug。请看下例:

不好的例子:
 if ($a == 1) echo 'A was equal to 1';

这是非常难以辨认的。它能够正常工作,但是除了你之外,别人根本不会赞赏这句代码。 有改进的例子:

if ($a == 1)

echo 'A was equal to 1';

现在至少这句代码可以读懂了,但是仍然没有很好的可维护性。如果当$a==1的时候我希望一个附加的事件发生,或者需要添加分支呢?如果后来的程序员忘记了添加大括弧或者else关键字,那么程序中将出现bug。

完美的例子

 if (($a == 1) && ($b==2)) { 
 echo 'A was equal to 1'; //很容易的可以添加其他代码 
 } elseif (($a == 1) && ($b==3)) { //其他操作 
 }

请注意在if和elseif后面的空格,这会将本语句和函数调用区分开来,此外,虽然在elseif的执行程序段中没有语句,只有注释,表面上显得多余可是却给以后维护程序的程序员给予了非常方便的提示,并且非常利于添加功能。

3.4. 利用 Include 来实现功能模块化

可以将常用的功能函数存于一个PHP文件,在其它PHP页中要用其中的功能时,将包含函数的PHP文件包含在调用函数的PHP文件中.这时可使用 Include 函数。具体语法为:

include($FileName);

使用时应该注意:

1、应避免自包含,即 File1 包含 File1;在多个文件中有包含语句时,应避免间接自包含即循环包含,如File1包含File2,File2包含File3,File3包含File1.

2、被包含的脚本语言的类型必须是PHP语言类型或脚本语句段。

PHP 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
使用JSON实现数据的跨域传输的php代码
Dec 20 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
json的键名为数字时的调用方式(示例代码)
Nov 15 PHP
Yii中实现处理前后台登录的新方法
Dec 28 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
php魔法函数与魔法常量使用介绍
Jul 23 PHP
PHP fclose函数用法总结
Feb 15 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 #PHP
PHP5 字符串处理函数大全
Mar 23 #PHP
Smarty Foreach 使用说明
Mar 23 #PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 #PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
Mar 23 #PHP
PHP提取数据库内容中的图片地址并循环输出
Mar 21 #PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 #PHP
You might like
PHP学习 变量使用总结
2011/03/24 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
php输出形式实例整理
2020/05/05 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
JavaScript多种页面刷新方法小结
2019/04/04 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
python编写暴力破解FTP密码小工具
2014/11/19 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
2016/07/11 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
win10安装python3.6的常见问题
2020/07/01 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
揭牌仪式主持词
2014/03/19 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
租房协议书范文
2014/08/20 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
家装业务员岗位职责
2015/04/03 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis