PHP高级技巧

全球超过300万个互联网网站的管理员都在使用PHP,使得它成为最为普及的服务器端脚本语言之一。其特点是运行速度快、稳定可靠、跨平台,而且是开放源代码软件。随着使用的水平不同,PHP可以很简单,也可以很复杂,可以只使用它发送HTML表示元素,还可以在PHP应用程序中集成Java和 XML。
  
  如果您对PHP有一定的了解或者看过一些初步的教材,这些技巧可以扩展您对PHP的认识,使您掌握一些常见的和高级的PHP功能。
  
  本文主要介绍以下十大PHP高级技巧:一、把PHP安装为Apache的DSO ;二、使用PHP本身的对话;三、文件是我们的朋友;四、PHP和文件系统的维护;五、丰富的数组函数;六、动态图像的创建;七、基于PHP的用户认证;八、PHP和COM;九、PHP和Java;十、PHP和XML
  
  一、把PHP安装为Apache的DSO
  
  PHP在Linux/Unix平台上经常与Apache搭配使用,在安装PHP时,有三种安装方式可供选择:静态模式、动态模式(DSO)、CGI二进制模式。
  
  由于易于维护和升级,我强烈建议以DSO方式安装PHP。例如,初次安装时如果安装的PHP仅支持数据库,随后希望再安装支持加密的模块,只要运行 “make clean”,添加新的配置选项,然后再运行“make”和“make install”即可,一个新的PHP模块就会安装在Apache中适当的位置上,然后重新启动Apache,而无需重新编译Apache。
  
  下面的步骤将安装一个全新的Apache,并以DSO方式安装PHP:
  
  1、从Apache软件基金会得到最新版本的Apache源代码;
  
  2、把得到的源代码放到/usr/local/或者/opt/目录下,或者所指定的任意目录中;
  
  3、运行Gunzip对文件进行解压缩,得到后缀为.tar的文件;
  
  4、运行下面的命令,把文件安装到apache_[version]目录中:
  tar -xvf apache_[version].tar
  
  5、进入/usr/local/apache_[version]目录(或者在步骤4中安装压缩文件的目录);
  
  6、键入下面的命令为编译Apache作准备,用您自己的路径替换其中的[path],例如,/usr/local/apache[version],现在已经设置了mod_so的新值,它将允许Apache使用DSO模块;
  
  7、回到提示符状态后键入make,并等待再次回到提示符状态;
  
  8、执行“make install”命令。
  
  至此,Apache已经安装完毕,系统将重回到提示符状态。接下来我们开始安装PHP:
  
  1、在PHP主页的下载区中找到最新版本的链接;
  
  2、把文件下载到一个适当的目录中,例如/usr/local/或/opt/或者所指定的任意目录中;
  
  3、运行Gunzip对文件进行解压缩,得到后缀为.tar的文件;
  
  4、执行下面的命令把文件安装在php-[version]目录中:
  tar -xvf php-[version]
  
  5、进入/usr/local/php-[version]目录或在步骤4中指定的目录;
  
  至此,已经作好了以DSO方式安装PHP的准备工作,唯一需要修改的配置选项是with-apxs(这是Apache的bin目录中的一个文件)。为了得到较高的性能,我没有安装对MySQL的支持模块。
  
  ./configure –with-mysql=/[path to mysql] –with-apxs=/[path to apxs]
  
  6、回到提示符状态后执行make命令,等待重新返回到提示符状态;
  
  7、执行make install命令。

  至此,系统以DSO方式在Apache的模块目录中安装了PHP,并对Apache的httpd.conf文件作适当的修改后返回到提示符状态。回到提示符状态后,您还需要对Apache的httpd.conf文件作一些修改。
  
  1、找到包含有ServerAdmin的一行,添加您的电子邮件地址,如下所示:
  ServerAdmin you@yourdomain.com
  
  2、找到以ServerName开头的行,把它改为真正的值,例如:
  ServerName localhost
  
  3、找到内容如下所示的小节:
  # And for PHP 4.x, use:
  #
  #AddType application/x-httpd-php .php
  #AddType application/x-httpd-php-source .phps
  
  修改这些行的内容,使PHP 4.0的AddType不再成为注释,并添加希望在PHP中使用的文件后缀名,上面的内容变为如下所示的内容:
  # And for PHP 4.x, use:
  #
  AddType application/x-httpd-php .php .phtml
  AddType application/x-httpd-php-source .phps
  
  保存文件,回到上一级目录,执行下面的命令重新启动Apache:
  ./bin/apachectl start
  
  如果在启动时没有出现错误提示信息,就可以通过创建一个名为phpinfo.php的只有如下所示一行内容的文件,对安装的Apache、PHP进行测试:
    
  把这个文件保存到Apache的文档存储目录(htdocs)中,然后开启浏览器,键入http://localhost/phpinfo.php地址,屏幕上就会出现许多的变量和它们的值。
  
  如果要重新配置PHP,需要再次运行make clean命令,然后执行带有一系列选项的./configure命令,然后再执行make和make install命令,Apache的目录模块中就会出现一个新的模块,只要再重新启动Apache加载这个新的模块,就一切OK了。

  二、使用PHP本身的对话
  
  PHP 4.0中最令人兴奋的特性应该是对对话的支持,PHP 3.0的用户必须使用第三方的软件否则就不能使用对话,不支持对话一直是PHP最大的缺憾之一。
  
  只要用户在浏览您的网站,您就可以利用对话维护与特定用户有关的变量,而无需建立多个cookie、使用隐藏表示字段或将信息存储在数据库中。
  
  在一个网页上启动一个对话,就会使PHP引擎知道您想启动一个对话(如果还没有启动)或者继续当前的对话:
  session_start();
  
  启动一个对话将通过cookie向用户发送一个识别字符串(例如940f8b05a40d5119c030c9c7745aead9),在服务器端,会创建一个与识别字符串匹配的临时文件,例如sess_940f8b05a40d5119c030c9c7745aead9,这个文件中包含注册的对话变量以及它们的值。
  
  用来显示对话的作用的最常见的例子是访问计数器。启动PHP模块,确保PHP代� �是文件的第一行,在PHP代� �之前不要有空� �、HTML代� �和其他的代� �。� 为对话会发送一个头部,� 此如果在session_start()之前有空� �和HTML代� �,就会得到一个出错信息。
    // 如果还不存在一个针对某用户的用户,则启动一个对话:
  session_start();
  
  然后注册一个名字为count的变量:
  session_register(‘count’);
  
  注册一个对话变量后,只要对话存在,名字为count的变量也就存在。现在,count变量还没有被赋值,如果对它执行� 1操作,它的值就变为了1。
  
  $count++;
  
  把上述内容综合在一块儿,如果还没有启动一个对话,就会启动一个对话;如果不存在一个对话id,就为用户指定一个好了,注册一个名字为$count的变量,对$count执行� 1操作表示用户已经首次访问了该网页。

要知道用户在当前的对话中访问本页面的次数,只要显示$count变量的值即可:
  echo ”

You’ve been here $count times.

“;
  
  全部的访问计数器代� �如下所示:
  
    session_start();
  session_register(‘count’);
  $count++;
  echo ”
You’ve been here $count times.

“;
  ?>
  
  如果重新� 载上述的脚本文件,就会发现变量count的值增� 了1,很酷吧。
  
  还可以在对话中注册一个数组变量,假设我们注册了一个名字为$faves的变量:
  $faves = array (‘chocolate’,'coffee’,'beer’,'linux’);
  
  可以象注册一个简单变量那� �注册一个数组变量:
  session_register(‘faves’);
  
  引用数组变量与引用简单变量没有什么二� �,如果一个用户在网页上指出在生活中的爱好时,可以把他的爱好注册到一个被称作$faves的数组变量中,然后可以在另一个网页中很方便地把这些爱好显示出来:
    session_start();
  echo “My user likes:
  
“;
  while (list(,$v) = each ($faves)) {
  echo ”
$v”; }
  echo ”
“;
  ?>
  
  然后� 就得到了一个关于用户爱好的清单。
  
  对话变量不能被查询字符串覆盖,也就是说我们不能输入http:///www.yourdomain.com/yourscript.php? count=56给注册变量$count指定一个新值,这一点对于安全很重要:只能在服务器端的脚本中� 除一个没有注册的对话变量。
  
  如果要完全� 除一个对话变量,首先需要从系统中注销它:
  session_unregister(‘count’);
  
  要完全� 除一个对话变量的脚本是非常简单,如下所示:
  session_destroy();
  
  使用对话变量可以减少访问数据库的频率,使代� �更� 清晰,而且可以减少对用户发送的cookie的数量,它是最简单的方法了。

  三、文件是我们的朋友
  
  � 论� 在开发的网站规模的大小,都应该意识到代� �重用的重要性,� 论这些代� �是HTML、还是PHP代� �。例如,� 必须至少每年改变一次包含版权信息的页脚,如果� 的网站含有1000个页面,每年修改一次也是个很烦人的事儿。
  
  在PHP中,至少有� 个函数可以帮助� 实现代� �重用的目的,所使用的函数取决于� 所重用的代� �,主要的函数有:
  * include() and include_once()
  * require() and require_once()
  
  include()函数包含并对给定的文件进行计算,例如:
  include(‘/home/me/myfile’);
  
  在include文件中的任何代� �都在include()出现的代� �范围内执行,� 可以通过联合使用include()和fopen()在自己的服务器上包含静态文件,在另一台服务器上包含目� �文件。
  
  include_once()的功能与include()相同,二者之间的区别在于它会检查一个文件中的代� �是否已经包含在现有的脚本中,如果代� �已经存在,则不会再次包含它。
  
  require()函数用给定文件的内容取代它本身,这一代替过程发生在PHP引擎编译代� �期间,而不是在执行期间进行,它不象include()那� �会首先进行计算。require()函数更多地用在静态元� 中,而include()更多地用于动态元� 中。与include_once()类似的是, require_once()将首先检查是否已经插入给定的代� �,如果代� �已经存在,就不再插入了。
  
  为也了解其内容,在版权信息、静态文字和其他不包含变量的元� 或者依赖其他正在执行的脚本的元� 中我更趋向于使用require函数。例如:
      
  [a lot of content]
    // insert copyright
  require(‘/home/me/mycopyright’);
  ?>
      
  另一方面,我经常在文件的开始使用include()来控制许多的函数:
    //得到函数库
  include(‘/home/me/myfunctions’);
  // do PHP things with my functions ?>
     
  [a lot of content]
      
  下一个问题就该是“include和require文件在哪里?”,对这个问题简单的回答是,“系统中的任意地方。”如果� 的代� �中包含有带有用户名和口令的数据库连接,� 肯定不会将它们都放在文档� �目录中向所有的人都开放。
  
  included或required文件可以在系统上的任何地方,只要PHP运行的系统上的用户可以访问这些文件即可,� 可以使这些文件具有任何后缀,或者不使用后缀。
  
  使用include()和require()对在网站中的元� 进行具体化是一种普遍的现象,并在需要对网站升级时,给� 带来很大的方便。

  四、PHP和文件系统的维护
  
  PHP中有许多与文件系统有关的函数,这些函数不仅可以打开文件,还可以显示目录中的内容、移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器。
  
  关于文件路径的解释:在Windows中,可以在路径中使用/和符号,而在其他的操作系统中只能使用/符号。出于一致性的缘故,我们统一使用/符号。
  
  下面的脚本� �例可以显示一个目录清单,注释已经包含在代� �中:
  
    $dir_name = “/home/me/”;
  /* 创建一个句柄,其值是打开一个给定目录的结果*/
  $dir = opendir($dir_name);
  /* 建立一个文字块,用以放置列表元� (文件名字)*/
  $file_list = ”

“;
  /* 使用一个while语句,读取已经打开的目录中的所有元� ,如果文件的名字不是“.”或“..”,则显示列表中的名字*/
  while ($file_name = readdir($dir)) {
  if (($file_name != “.”) && ($file_name != “..”)) {
  $file_list .= ”
$file_name”;
  }
  }
  $file_list .= ”
“;
  /*关闭打开的目录,结束PHP模块*/
  closedir($dir);
  ?>
      
Files in:

  好了,我们已经得到了一个目录清单。需要注意的是,要读取一个文件(稍后我们将进行讲解)或目录的内容,PHP运行的系统上的用户必须至少有读取文件的权限。
  
  下面是一个如何拷贝文件的例子:
    $original = “/home/me/mydatabasedump”;
  $copied = “/archive/mydatabasedumo_1010″;
  /* 使用copy()函数拷贝原始文件,如果拷贝没有完成则会显示一个错误信息*/
  @copy($original, $copied) or die(“Couldn’t copy file.”);
  ?>
  
  这个例子是一个文件备份系统的原型。在这段脚本运行时,它把文件拷贝到一个不同的位置进行保存。稍微修改一下守护程序,就可以在一天中� 指定的时刻执行它,而� 需用户的干预。
  
  假定� 在系统上安装了Lynx,可以创建一个守护程序的条目访问这个文件,访问这个文件会运行这个脚本并建立一个拷贝文件,下面的例子将在上午5点钟运行这个脚本,然后关闭Lynx:
  
  0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1
  
  如果运行的是CGI版本的PHP,可以跳过Lynx部分,而直接调用二进制文件:
  
  0 5 * * * [username] php /path/to/copyfile.php 1>/dev/null 2>&1

五、丰富的数组函数
  
  PHP 4.0中新添� 了30个与组数有关的函数,其中一些常见的函数可以判断一个数组中是否包含某个元� ,对一个数组中的元� 进行计数,添� 或� 除数组中的元� 或者对数组中的元� 进行排序。
  
  如果有一个很大的数组,而� 需要找出其中是否包含一个特定的元� ,就可以使用in_array()。下面的例子将显示“Not found in this array”,� 为在一个名字为$namesArray的数组中查找Albert,而在$namesArray数组中不存在这� �一个元� 。
    $lookingFor = “Albert”;
  if (in_array($lookingFor, $namesArray)) {
  echo “You’ve found it!”;
  } else {
  echo “Not found in this array!”;
  }
  ?>
  
  如果把$lookingFor的值改为Mary,就会得到“You’ve found it!”的信息,� 为Mary是$namesArray数组中的一个元� 。
  
  如果要对一个数组中的元� 个数进行计数,只要简单地使用count()函数即可:
    $count = count($namesArray); ?>
  
  返回的$count的值为7。
  
  可以在一个数组的开头或结尾处添� 元� ,还可以使用array_merge()来建立一个包含二个或更多数组中元� 的新数组,合并时,元� 的顺序会按指定的顺序排列,如果原来的数组是被排过序的,在合并后需要对它重新排序。
  
  我们可以首先利用array_push()在数组的结尾处添� 一个元� :
    $fruitArray = array(“apple”, “orange”, “banana”, “kiwi”, “pear”);
  /* 向数组中添� 元� */
  array_push($fruitArray, “grape”, “pineapple”, “tomato”);
  /*显示每个元� 及其序号*/
  while (list($key,$value) = each($fruitArray)) {
  echo “$key : $value
“;
  }
  ?>
  
  运行上面的程序将得到下面的结果:
  0 : apple
  1 : orange
  2 : banana
  3 : kiwi
  4 : pear
  5 : grape
  6 : pineapple
  7 : tomato
  
  如果需要在数组的开头添� 元� ,其代� �与上面的代� �差不多,唯一的不同之处是需要用array_unshift()代替array_push()。
    /* 建立一个数组*/
  $fruitArray = array(“apple”, “orange”, “banana”, “kiwi”, “pear”);
  /* 向数组中添� 元� */
  array_unshift($fruitArray, “grape”, “pineapple”, “tomato”);
  /* 显示每个元� 及其序号*/
  while (list($key,$value) = each($fruitArray)) {
  echo “$key : $value
“;
  }
  ?>
  
  运行上面的程序将得到下面的结果:
  0 : grape
  1 : pineapple
  2 : tomato
  3 : apple
  4 : orange
  5 : banana
  6 : kiwi
  7 : pear
  
  array_merge()函数可以把二个或更多的数组合并为一个数组。
    $fruitArray = array(“apple”, “orange”, “banana”, “kiwi”, “pear”);
  /*/建立第二个数组*/
  $vegArray = array(“carrot”, “green beans”, “asparagus”, “artichoke”, “corn”);
  /*把这二个数组合并为一个数组*/
  $goodfoodArray = array_merge($fruitArray, $vegArray);
  /* 显示每个元� 及其序号*/
  while (list($key,$value) = each($goodfoodArray)) {
  echo “$key : $value
“;
  }
  ?>
  
  运行上面的脚本将得到下面的结果:
  0 : apple
  1 : orange
  2 : banana
  3 : kiwi
  4 : pear
  5 : carrot
  6 : green beans
  7 : asparagus
  8 : artichoke
  9 : corn
  
  现在我们已经掌握了如何添� 元� 和合并数组,我们再来看看如何从一个数组中� 除元� 。从一个数组的末尾� 除一个元� 可以使用array_pop()函数,使用array_shift()函数可以从一个数组的开头� 除一个元� 。尽管使用array_pop()或 array_shift()从数组中� 除了一个元� ,� 还可以把这个元� 当作一个变量来使用。

  使用array_pop()从一个数组的末尾� 除一个元� :
    /*建立一个数组*/
  $fruitArray = array(“apple”, “orange”, “banana”, “kiwi”, “pear”);
  /* 从数组的末尾� 除一个元� */
  $popped = array_pop($fruitArray);
  /* 显示� 除后数组的内容和� � 除的元� */
  while (list($key,$value) = each($fruitArray)) {
  echo “$key : $value
“;
  }
  echo ”
and finally, in $popped: $popped”;
  ?>
  
  运行上面的脚本会得到下面的结果:
  0 : apple
  1 : orange
  2 : banana
  3 : kiwi
  and finally, in $popped: pear
  
  我们再来讨论一个从一个数组的末尾� 除元� 的例子:
    /* 建立一个数组*/
  $fruitArray = array(“apple”, “orange”, “banana”, “kiwi”, “pear”);
  /*从一个数组的开始� 除一个元� */
  $shifted = array_shift($fruitArray);
  /* 显示� 除后数组的内容和� � 除的元� */
  while (list($key,$value) = each($fruitArray)) {
  echo “$key : $value
“;
  }
  echo ”
and finally, in $shifted: $shifted”;
  ?>
  
  运行上述脚本会得到如下的显示结果:
  0 : orange
  1 : banana
  2 : kiwi
  3 : pear
  and finally, in $shifted: apple
  
  另外还有� 个函数可以对数组中的元� 进行排序,但在这里我们将只简要介绍基本的排序函数,说明排序的过程:
    $fruitArray = array(“apple”, “orange”, “banana”, “kiwi”, “pear”);
  /* 对数组进行排序*/
  sort($fruitArray);
  /*显示每个元� 及其序号*/
  while (list($key,$value) = each($fruitArray)) {
  echo “$key : $value
“;
  }
  ?>
  
  运行上述的脚本会得到如下的显示结果:
  0 : apple
  1 : banana
  2 : kiwi
  3 : orange
  4 : pear

六、动态图像的创建
  
  只要安装一些第三方的库文件并具有一定的� 何知识,就可以利用PHP来创建和处理图像了。事实上,这不需要太多的� 何知识,� 为我大学没有毕业,仍然可以利用PHP创建图像。
  
  在使用基本的图像创建函数之前,需要安装GD库文件。如果要使用与JPEG有关的图像创建函数,还需要安装jpeg-6b,如果要在图像中使用Type 1型字体,则必须安装t1lib。
  
  在建立图像创建环境之前,还需要作一些准备工作。首先,安装t1lib;其次安装jpeg-6b,然后再安装GD库文件。在安装时一定要按这里给定的顺序进行安装,� 为在编译GD为库时会用到jpeg-6b,如果没有安装jpeg-6b,在编译时就会出错。
  
  在安装完这三个组件后,还需要重新配置PHP,这也是� 对采用DSO方式安装PHP感到庆幸的地方之一。运行make clean,然后在当前的配置中添� 下面的内容:
  
  –with-gd=[/path/to/gd]
  –with-jpeg-dir=[/path/to/jpeg-6b]
  –with-t1lib=[/path/to/t1lib]
  
  完成添� 后执行make命令,然后再执行make install命令。重新启动Apache后运行phpinfo()来检查一下新的设置是否生效了。现在就可以开始图像创建工作了。
  
  � �据所安装的GD库文件的版本不同,� 也许能或者不能创建GIF或PNG� �式的图形文件,如果安装的是gd-1.6或以前的版本,可以使用GIF� �式的文件但不能创建PNG� �式,如果安装的是gd-1.6以后的版本,可以创建PNG文件但不能创建GIF� �式的文件。
  
  创建一幅简单的图像也需要用到许多的函数,我们将一步一步地进行说明。
  
  在这个例子中,我们将创建一个PNG� �式的图像文件,下面的代� �是一个包含所创建的图像的MIME类型的头部:
  
    
  使用ImageCreate()创建一个代表空白图像的变量,这个函数要求以像� 为单位的图像大小的参数,其� �式是ImageCreate(x_size, y_size)。如果要创建一个大小为250X250的图像,就可以使用下面的语句:
  $newImg = ImageCreate(250,250);
  
  由于图像还是空白的,� 此� 可能会希望用一些彩色来填充它。然而,� 需要首先使用ImageColorAllocate()函数用其RGB值为这种颜色指定一个名字,这一函数的� �式为ImageColorAllocate([image], [red], [green], [blue])。如果要定义天蓝色,可以使用如下的语句:
  $skyblue = ImageColorAllocate($newImg,136,193,255);
  
  接下来,需要使用ImageFill()函数用这种颜色填充这个图像,ImageFill()函数有� 个版本,例如ImageFillRectangle()、ImageFillPolygon()等。为简单起见,我们通过如下的� �式使用ImageFill()函数:
  ImageFill([image], [start x point], [start y point], [color])
  ImageFill($newImg,0,0,$skyblue);
  
  最后,建立图像后释放图像句柄和所� 用的内存:
  ImagePNG($newImg);
  ImageDestroy($newImg); ?>
  
  这� �,创建图像的全部代� �如下所示:
    $newImg = ImageCreate(250,250);
  $skyblue = ImageColorAllocate($newImg,136,193,255);
  ImageFill($newImg,0,0,$skyblue);
  ImagePNG($newImg);
  ImageDestroy($newImg);
  ?>
  
  如果把这个脚本文件保存为skyblue.php,并用浏览器访问它,就会看到一个天蓝色的250X250的PNG� �式的图像。
  
  我们还可以使用图像创建函数对图像进行处理,例如把一个较大图像作成一个小图像:
  
  假设� 有一幅图像,想从中裁剪出一个35X35大小的图像。� 所需要作的是创建一个35X35大小的空白图像,创建一个包含原来图像的图像流,然后把一个经过调整大小的原来的图像放到新的空白图像中。
  
  要完成这一任务的关健函数是ImageCopyResized(),它要求的� �式如下所示:
  ImageCopyResized([new image handle],[original image handle],[new image X], [new Image Y], [original image X], [original image Y], [new image X], [new image Y], [original image X], [original image Y])
  
    header(“Content-type: image/png”);
  /* 建立保存新图像高度和宽度的变量*/
  $newWidth = 35;
  $newHeight = 35;
  /* 建立给定高度和宽度的新的空白图像*/
  $newImg = ImageCreate($newWidth,$newHeight);
  /* 从原来较大的图像中得到数据*/
  $origImg = ImageCreateFromPNG(“test.png”);
  /*拷贝调整大小后的图像,使用ImageSX()、ImageSY()得到原来的图像在X、Y方面上的大小 */
  ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg));
  /*创建希望得到的图像,释放内存 */
  ImagePNG($newImg);
  ImageDestroy($newImg); ?>
  
  如果把这一小段脚本保存为resized.php,然后用浏览器对它进行访问,就会看到一个35X35大小的PNG� �式的图形。

  七、基于PHP的用户认证
  
  如果希望在每一段脚本上都进行口令保护,可以结合使用header()语句、$PHP_AUTH_USER和$PHP_AUTH_PW来建立基本的认证方案,通常的基于服务器的提问/响应顺序都如下所示:
  
  1、用户从服务器上请求一个文件。如果这个文件在服务器上是被保护的,则在响应的头部向用户返回一个401(示经授权的用户)字符串。
  
  2、浏览器收到这个响应后,弹出要求用户输入用户名/口令的对话框。
  
  3、用户在对话框中输入一个用户名和口令,点击OK按钮将信息返回服务器供认证使用。
  
  4、如果用户名和口令有效,被保护的文件将向用户开放,只要用户还在使用文件,认证会一直有效。
  
  一段简单的PHP脚本文件通过向用户发送一个适当的能够引起自动显示用户名/口令对话框的HTTP头部就可以模仿HTTP的提问/响应系统,PHP把用户在用户名/口令对话框中输入的信息存储在$PHP_AUTH_USER和$PHP_AUTH_PW中,使用这二个变量,就可以与存储在文本文件、数据库等文件中的用户名/口令进行比较。
  
  这个例子采用了二个硬编� �的值进行认证,但� 论用户名和口令放在什么地方,其原理都是相同的。
    /* 检查$PHP_AUTH_USER和$PHP_AUTH_PW中的值*/
  if ((!isset($PHP_AUTH_USER)) || (!isset($PHP_AUTH_PW))) {
  /* 如果没有值,则发送一个能够引发对话框出现的头部*/
  header(‘WWW-Authenticate: Basic realm=”My Private Stuff”‘);
  header(‘HTTP/1.0 401 Unauthorized’);
  echo ‘Authorization Required.’;
  exit;
  } else if ((isset($PHP_AUTH_USER)) && (isset($PHP_AUTH_PW))){
  /* 变量中有值,检查它们是否正确*/
  if (($PHP_AUTH_USER != “validname”) || ($PHP_AUTH_PW != “goodpassword”)) {
  /* 如果输入的用户名和口令中有一个不正确,则发送一个能够引发对话框出现的头部 */
  header(‘WWW-Authenticate: Basic realm=”My Private Stuff”‘);
  header(‘HTTP/1.0 401 Unauthorized’);
  echo ‘Authorization Required.’;
  exit;
  } else if (($PHP_AUTH_USER == “validname”) || ($PHP_AUTH_PW == “goodpassword”)) {
  /* 如果二个值都正确,显示成功的信息 */
  echo ”

You’re authorized!

“;
  }
  }
  ?>
  
  需要注意的是,如果� 使用的是基于文件的保护机制,它并不能保证目录中所有的文件的安全。它可能保护大部分的文件,如果� 认为它能够保护给定目录中的所有文件,� 的这种认识就需要变变了。

八、PHP和COM
  
  如果� 喜欢冒险,并且在Windows上运行CGI、ISAPI或Apache模块版本的PHP,就可以访问COM的函数。好了,详细解释COM的工作就交给微软和许多大部头的书了,为了能简单地了解一下COM的功能,下面是一小段常见的脚本。
  
  这一段PHP脚本在后端启动微软的字处理Word,打开一个新的文档,输入一些文字,保存文档,并关闭Word。
    // 建立一个指向新COM组件的索引
  $word = new COM(“word.application”) or die(“Can’t start Word!”);
  // 显示目前正在使用的Word的版本号
  echo “Loading Word, v. {$word->Version}
“;
  // 把它的可见性设置为0(假),如果要使它在最前端打开,使用1(真)
  // to open the application in the forefront, use 1 (true)
  $word->Visible = 0;
  // 在Word中创建新的文档
  $word->Documents->Add();
  // 在新文档中添� 文字
  $word->Selection->TypeText(“Testing 1-2-3…”);
  //把文档保存在Windows临时目录中
  $word->Documents[1]->SaveAs(“/Windows/temp/comtest.doc”);
  // 关闭与COM组件之间的连接
  $word->Quit();
  // 在屏幕上显示其他信息
  echo “Check for the file…”;
  ?>
  
  如果� 有一个intranet网站,数据存储在SQL Server中,用户需要这些数据的Excel� �式,则可以让PHP运行必要的SQL查询并对输出进行� �式化,然后利用COM打开Excel,把数据转化为Excel� �式的数据,然后把数据保存在用户的台式机上。
  
  九、PHP和Java
  
  PHP另一个有趣的功能是它可以调用现有的Java 对象中的方法,使得� 可以在基于Java的应用中集成PHP。如果要在工作中推广PHP的应用,这一功能就非常有用了,� 得到的结果是,“这里的一切都是基于Java的。”
  
  要利用这一功能,� 的服务器上必须安装有JVM(Java虚拟机器)。如果安装的是由Sun、Kaffe、IBM或Blackdown的JDK,就已经安装有了JVM。
  
  在配置PHP时,需要在配置文件中添� with-java小节,然后修改php.ini文件中的一部分,对php.ini文件的修改主要是需要添� 下面的内容:
  
  [Java]
  java.library.path=/path/to/library
  java.class.path=/classpath/
  extension_dir=/path/to/extensions
  extension=libphp_java.so
  
  需要注意的是,所作的修改与� 的安装类型有关,� 需要阅读PHP安装目录下ext/java目录中README文件,学� 如何配置Java功能。
  
  下面是一段如何创建一个新的Java对象的PHP脚本的例子,这段脚本将访问并在显示器是显示一些Java属性。它与COM的例子同� �有趣,应该会给我们一些启发。
    $system = new Java(“java.lang.System”);
  echo ”
Java version = ” . $system->getProperty(“java.version”) . ”
“;
  echo “Java vendor = ” . $system->getProperty(“java.vendor”) . ”

“;
  ?>
  
  如果� 有Java知识,将会对开发工作带来很大的帮助,这种集成的能力是未来PHP被接受和增长的关健。
  
  十、PHP和XML
  
  PHP中包含有一个可选的支持Expat解析的XML扩展,利用PHP中与XML相关的函数,可以创建一个分析程序来处理有效的XML文档。如果� 使用的是1.3.7版或版本更高的Apache软件,就不需要再安装额外的库文件了,� 所需要作的就只是配置PHP中的with-xml。
  
  象Java和COM一� �,PHP中对XML的支持也很有趣,而且增长也很快,如果� 了解Expat或LibXML,请� 入这一方面的开发吧。

From:http://bbs.verycd.com/topics/280511/

Leave a Reply

You must be logged in to post a comment.