PHP技术开发技巧分享

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语言类型或脚本语句段。

(0)

相关推荐

  • PHP技术开发技巧分享

    1. 提高PHP的运行效率 PHP的优点之一是速度很快,对于一般的网站应用,可以说是已经足够了.不过如果站点的访问量很高.带宽窄或者其它的因素令服务器产生性能瓶颈的时候,你可能得想想其它的办法来进一步提高PHP的速度了. 1.1. 代码优化 1.用i+=1代替i=i+1.符合c/c++的习惯,效率还高. 2.尽可能的使用PHP内部函数.自己编写函数之前要详细查阅手册,看有没有相关的函数,否则费力不讨好. 3.能使用单引号字符串尽量使用单引号字符串.单引号字符串的效率要高于双引号字符串. 4.用f

  • Dubbo本地开发技巧分享

    背景 作为后端服务负载.前后分离的主要手段,dubbo在业界中使用率还比较高.随着Dubbo系统的增多,本地开发.调试就出现了麻烦之处 直接在开发本地起同样一份服务 由于Dubbo采用负载均衡的策略,多次请求的情况下总会随机一次到本地的服务上,有点儿看命的感觉. 修改Group 作为Dubbo支持的分Group策略,把各自开发人员独立注册一个Gruop是可行的.这样需求把Consumer端和provider端同步进行修改,稍微有点儿麻烦. 而且还是会想注册中心注册一份服务列表. 直连 直连就是不

  • 7个很棒的Vue开发技巧分享

    目录 1.路由参数解耦 2.功能组件 3.样式范围 4.watch的高级使用 5.watch监听多个变量 6.事件参数$event 7.程序化事件监听器 1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情. export default { methods: { getParamsId() { return this.$route.params.id } } } 在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制组件的灵活性.正确的做法是通

  • 八个一看就觉得很棒的Vue开发技巧分享

    目录 1.路由参数解耦 2.功能组件 3.样式范围 4.watch的高级使用 5.watch监听多个变量 6.事件参数$event 7.程序化事件监听器 8.监听组件生命周期 总结 1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情. export default { methods: { getParamsId() { return this.$route.params.id } } } 在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制

  • Rust如何进行模块化开发技巧分享

    目录 Rust如何进行模块化开发? Package和Create Cargo的惯例 Create的作用 定义module来控制作用域和私有性 路径Path 私有边界(private boundary) pub关键字 super关键字 pub struct pub enum Use关键字 use的习惯用法 as关键字 使用 pub use 重新导出名称 导入外部包 如何将模块放入其他文件? 类似es6的模块化,Rust通过package.create.module来实现代码的模块化管理 Rust如

  • 分享经典的JavaScript开发技巧

    JavaScript开发经典技巧分享给大家: 1.首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 2.使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和!==不会,它们会同时比较值和数据类型,这也使得它们要比==和!=快. [10] === 10    // is false [10]  == 10    // is true '10' == 10     // is true '10' ===

  • 关于TypeScript开发的6六个实用小技巧分享

    目录 1. 开发之前确定实体类型 2. 请求接口时只需要定义自己需要用到的字段 3. 使用枚举类型 4. DOM元素的类型要正常给 5.对象的类型要怎么给 6.结构赋值时类型怎么给 总结 本文总结一下使用TypeScript开发应用程序的一点小经验.说之前,推荐一个VSCODE立即执行TS代码的插件quokka.js, 使用方式,ctrl+shipt+p,输入关键字quokka 回车之后,输入代码之后会立即执行 1. 开发之前确定实体类型 在正式编码之前,如果没有接口文档的话,最好能拿到数据字典

  • Go语言提升开发效率的语法糖技巧分享

    目录 前言 可变长参数 声明不定长数组 init函数 忽略导包 忽略字段 json序列化忽略某个字段 json序列化忽略空值字段 短变量声明 类型断言 切片循环 判断map的key是否存在 select控制结构 前言 哈喽,大家好,我是asong. 每门语言都有自己的语法糖,像java​的语法糖就有方法变长参数.拆箱与装箱.枚举.for-each​等等,Go​语言也不例外,其也有自己的语法糖,掌握这些语法糖可以助我们提高开发的效率,所以本文就来介绍一些Go语言的语法糖,总结的可能不能全,欢迎评论

  • Java中实现代码优化的技巧分享

    目录 1.用String.format拼接字符串 2.创建可缓冲的IO流 3.减少循环次数 4.用完资源记得及时关闭 5.使用池技术 1.用String.format拼接字符串 不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情况. 比如现在有个需求:要用get请求调用第三方接口,url后需要拼接多个参数. 以前我们的请求地址是这样拼接的: String url = "http://susan.sc.cn?userName="+userName+"&a

  • 15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】

    本文总结述了15个值得开发人员关注的jQuery开发技巧和心得.非常精辟实用!分享给大家供大家参考,具体如下: 在这篇文章中,我们将介绍15个让你的jQuery更加有效的技巧,大部分关于性能提升的,希望大家能够喜欢! 1. 尽量使用最新版本的jQuery类库 jQuery项目中使用了大量的创新.最好的方法来提高性能就是使用最新版本的jQuery.每一个新的版本都包含了优化的bug修复.对我们来说唯一要干的就是修改tag,何乐而不为呢? 我们也可以使用免费的CDN服务,例如, Google来存放j

随机推荐