收集的php编写大型网站问题集


Posted in PHP onMarch 06, 2007

PHP以其易用性得到迅速的推广,但易用并不是说就能用好它,实际上许多程序员用它很容易的立一个个WEB应用系统,但又有多少人仔细的考虑过他们的代码,是否容易维护、是否足够健壮、否效率足够高、是否足够安全,当PHP用于建立大型网站时这些就成为很关键的因素。下面我们从较轻微的问题开始讨论,直至一些致命的错误。共分三部分。 
  第一部分、较轻微的错误 

  一、Printf(), 
  

该函数主要用来格式化显示数据。当你要改变某个数据的显示格式时才使用。 
  例如以不同的精度来显示PI(3.1415926)的值。 
  <?php 
   /* 
   * The three faces of Π 
   */ 

   printf ("Pi is: %.2f\n<br>\n", M_PI); 
   printf ("Pi is also: %.3f\n<br>\n", M_PI); 
   printf ("Pi is also: %.4f\n<br>\n", M_PI); 
  ?> 

  

但许多程序员仅仅为显示一些变量值和函数返回值使用该函数。因为Printf()在显示数据前要先格式化该数据以速度较慢,因此,仅为了显示数据时应用print和echo,以提高速度。 

  二、语意检查 
  

PHP是一种弱类型语言,也就是说在使用一个变量前不用定义,这样给编程带来了很大的方便和灵活,但你自己必须知道该变量到底应该是哪种类型,因为该变量在运行时仍实际对应着某一种类型(各种类型之间可以自由互相转换),没有类型的变量是不存在的。有可能PHP并不能检查出你的语意错误,但由于变量类型的变化,会导致一些潜在的问题的发生。另外一个值得注意的问题是变量的范围,它也可能会导致一些潜在的问题的发生。 
  在PHP中有以下几种基本变量: 
  Boolean, resource, integer, double, string, array and object。 

  三、临时变量的使用 
  

临时变量的滥用会导致程序运行效率的降低。何时使用临时变量可基于以下两点考虑: 
  1、该变量是否至少使用两次。 
  2、该变量的使用是否会显著提高程序的可读性。 
  如果一条也不满足,则省略该变量的使用。例如: 
  <?php 
   $tmp = date ("F d, h:i a"); /* ie January 3, 2:30 pm */ 
   print $tmp; 
  ?> 
  就应该改成: 
  <?php 
   print date ("F d, h:i a"); 
  ?> 

  又如: 
  <?php 

  // string reverse_characters(string str) 
  // Reverse all of the characters in a string. 
  function reverse_characters ($str) 
  { 
   return implode ("", array_reverse (preg_split("//", $str))); 
  } 

  ?> 
  的可读性不强,可改成: 
  <?php 

  // string reverse_characters(string str) 
  // Reverse all of the characters in a string. 
  function reverse_characters ($str) 
  { 
   $characters = preg_split ("//", $str); 
   $characters = array_reverse ($characters); 

   return implode ("", $characters); 
  } 

  ?> 

  四、客户端和服务器端代码的分离 
  

客户端和服务器端代码的在PHP程序中实际上就是HTML代码和PHP语言代码,很多人把HTML和PHP语句混合在一个文件里,使得这文件很大,这种风格对程序的维护和再开发很不利,不适合大型站点的开发。一般有两种方法把HTML和PHP语句分开: 
  1、编写专用API,例如: 

  index.php ? The Client side 
  <?php include_once ("site.lib"); ?> 
  <html> 
  <head> 
  <title> <?php print_header (); ?> </title> 
  </head> 
  <body> 
  <h1> <?php print_header (); ?> </h1> 
  <table border="0" cellpadding="0" cellspacing="0"> 
  <tr> 
  <td width="25%"> 
  <?php print_links (); ?> 
  </td> 
  <td> 
  <?php print_body (); ?> 
  </td> 
  </tr> 
  </table> 
  </body> 
  </html> 

   
  site.lib ? The server side code 

   
  <?php 

  $dbh = mysql_connect ("localhost", "sh", "pass") 
  or die (sprintf ("Cannot connect to MySQL [%s]: %s", 
  mysql_errno (), mysql_error ())); 
  @mysql_select_db ("MainSite") 
  or die (sprintf ("Cannot select database [%s]: %s", 
  mysql_errno (), mysql_error ())); 

  $sth = @mysql_query ("SELECT * FROM site", $dbh) 
  or die (sprintf ("Cannot execute query [%s]: %s", 
  mysql_errno (), mysql_error ())); 

  $site_info = mysql_fetch_object ($sth); 

  function print_header () 
  { 
   global $site_info; 
   print $site_info->header; 
  } 

  function print_body () 
  { 
   global $site_info; 
   print nl2br ($site_info->body); 
  } 

  function print_links () 
  { 
   global $site_info; 

   $links = explode ("\n", $site_info->links); 
   $names = explode ("\n", $site_info->link_names); 

  for ($i = 0; $i < count ($links); $i++) 
  { 
   print "\t\t\t 
   <a href=\"$links[$i]\">$names[$i]</a> 
   \n<br>\n"; 
  } 
  } 
  ?> 

  这种方法使得程序看起来比较简洁,而且执行速度也较快。 

  2、使用模板的方法 
  这种方法使得程序看起来更简洁,同样实现上面的功能,可用以下代码: 
  <html> 
  <head> 
  <title>%%PAGE_TITLE%%</title> 
  </head> 
  <body %%BODY_PROPERTIES%%> 
  <h1>%%PAGE_TITLE%%</h1> 
  <table border="0" cellpadding="0" cellspacing="0"> 
  <tr> 
  <td width="25%">%%PAGE_LINKS%%</td> 
  <td>%%PAGE_CONTENT%%</td> 
  </tr> 
  </table> 
  </body> 
  </html> 

  

用占位符代替要动态生成的内容,然后用一解析程序分析该模板文件,把占位符用际的内容替换。种方法使得即使不会使用PHP的页面制作人员也能修改模板文件。这种方法的缺点是执行效率不高,因为要解释模板文件。同时实现起来也比较复杂。 

  注: www.thewebmasters.net的 FastTemplate class可方便的实现以上功能。 

  五、不要用过时的函数 
  作为一种自由软件,PHP发展很快,其中的很多函数都已过时,例如: 

  while (1): 
  print "5"; 
  if ($idx++ == 5): 
  break; 
  endif; 
  endwhile; 

  

虽然还能用但效率肯定不高,而且可能在以后的版本中会禁用,导致程序不能运行。因此要经常对照最新PHP手册检查那些函数已过时及时修正。

PHP 相关文章推荐
用PHP调用数据库的存贮过程!
Oct 09 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
PHP对象Object的概念 介绍
Jun 14 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
PHP实现的带超时功能get_headers函数
Feb 10 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
YII2框架中使用yii.js实现的post请求
Apr 09 PHP
详解阿里云视频直播PHP-SDK接入教程
Jul 09 PHP
详解PHP Swoole与TCP三次握手
May 27 PHP
用PHP实现Ftp用户的在线管理的代码
Mar 06 #PHP
个人站长制做网页常用的php代码
Mar 03 #PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
Feb 27 #PHP
给php新手谈谈我的学习心得
Feb 25 #PHP
Smarty+QUICKFORM小小演示
Feb 25 #PHP
php简单封装了一些常用JS操作
Feb 25 #PHP
实现了一个PHP5的getter/setter基类的代码
Feb 25 #PHP
You might like
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
javascript常用功能汇总
2015/07/05 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
2018/03/28 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
解析Python3中的Import
2019/10/13 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
sort命令的作用和用法
2012/11/04 面试题
咖啡书吧创业计划书
2014/01/13 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
股份合作协议书范本
2014/04/14 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
使用python绘制横竖条形图
2022/04/21 Python
Java中的Kotlin 内部类原理
2022/06/16 Java/Android