社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 4530阅读
  • 2回复

PHP的十个高级技巧(中)(下)

级别: 大掌柜
发帖
7343
铜板
6618
人品值
1388
贡献值
28
交易币
100
好评度
7488
信誉值
10
金币
0
所在楼道
学一楼
三、文件是我们的朋友 @CA{uP;  
$KsB'BZy  
  无论你在开发的网站规模的大小,都应该意识到代码重用的重要性,无论这些代码是HTML、还是PHP代码。例如,你必须至少每年改变一次包含版权信息的页脚,如果你的网站含有1000个页面,每年修改一次也是个很烦人的事儿。 `bNLmTS  
'D^@e0.3  
  在PHP中,至少有几个函数可以帮助你实现代码重用的目的,所使用的函数取决于你所重用的代码,主要的函数有: a.XMeB  
jq(rnbV  
  * include() and include_once() u/` t+-A  
  * require() and require_once() E$4Ik.k  
  include()函数包含并对给定的文件进行计算,例如: wqJ1^>TB  
  include('/home/me/myfile'); '.XR,\g>  
wHs4~"EY9  
  在include文件中的任何代码都在include()出现的代码范围内执行,你可以通过联合使用include()和fopen()在自己的服务器上包含静态文件,在另一台服务器上包含目标文件。 @-O%u* %J  
r3~YGY  
  include_once()的功能与include()相同,二者之间的区别在于它会检查一个文件中的代码是否已经包含在现有的脚本中,如果代码已经存在,则不会再次包含它。 =^w:G=ymS  
v2vtkYQN  
   require()函数用给定文件的内容取代它本身,这一代替过程发生在PHP引擎编译代码期间,而不是在执行期间进行,它不象include()那样会首先进行计算。require()函数更多地用在静态元素中,而include()更多地用于动态元素中。与include_once()类似的是,require_once()将首先检查是否已经插入给定的代码,如果代码已经存在,就不再插入了。 )yS S2  
;Hu`BFXyD  
  为也了解其内容,在版权信息、静态文字和其他不包含变量的元素或者依赖其他正在执行的脚本的元素中我更趋向于使用require函数。例如: I5W#8g!{  
i(S}gH4*o  
   `Oe}OSxnT  
   3Zm;:v4y  
   88zK)k{  
  [a lot of content] PC& (1kJ  
     // insert copyright 5&}p'6*K  
  require('/home/me/mycopyright'); mHc5NkvQC  
  ?> @[O|n)7  
   P2 z~U  
   [:l=>yJ{(  
KK/siG~O  
  另一方面,我经常在文件的开始使用include()来控制许多的函数: 2Jt*s$  
X>eFGCz}I  
     //得到函数库 0G8zFe*p  
  include('/home/me/myfunctions'); H|<Zm:.%$  
  // do PHP things with my functions ?> bqQR";  
   h:r:qk  
   f|{&Y2h(R  
   awOH50R  
  [a lot of content] b25C[C5C  
   ynZfO2kf  
   dK7BjZTJo  
+wm%`N;v<  
  下一个问题就该是“include和require文件在哪里?”,对这个问题简单的回答是,“系统中的任意地方。”如果你的代码中包含有带有用户名和口令的数据库连接,你肯定不会将它们都放在文档根目录中向所有的人都开放。 `q7X(x  
}IV=qW,  
  included或required文件可以在系统上的任何地方,只要PHP运行的系统上的用户可以访问这些文件即可,你可以使这些文件具有任何后缀,或者不使用后缀。 j$r2=~1  
8/W2;>?wKc  
  使用include()和require()对在网站中的元素进行具体化是一种普遍的现象,并在需要对网站升级时,给你带来很大的方便。 [f`7+RHrd  
;<BMgO}N  
四、PHP和文件系统的维护 'I@l$H  
?Nl@K/  
  PHP中有许多与文件系统有关的函数,这些函数不仅可以打开文件,还可以显示目录中的内容、移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器。 4l_~-Peh  
D3C3_ @*  
  关于文件路径的解释:在Windows中,可以在路径中使用/和符号,而在其他的操作系统中只能使用/符号。出于一致性的缘故,我们统一使用/符号。 \!4_m8?  
gLWbd~  
  下面的脚本样例可以显示一个目录清单,注释已经包含在代码中: ")3$. '5Dg  
l  !JTM  
     $dir_name = "/home/me/"; ;Lk07+3G  
  /* 创建一个句柄,其值是打开一个给定目录的结果*/ ~lr,}K,  
  $dir = opendir($dir_name); n fMU4(:  
  /* 建立一个文字块,用以放置列表元素(文件名字)*/ ' -rRD\"q  
  $file_list = " ]=(PtzVa  
"; +?GsIp@>jh  
  /* 使用一个while语句,读取已经打开的目录中的所有元素,如果文件的名字不是“.”或“..”,则显示列表中的名字*/ rpv<'$6  
  while ($file_name = readdir($dir)) { N"zm  
  if (($file_name != ".") && ($file_name != "..")) { \mNN ) K@  
  $file_list .= " &>vfm9  
$file_name"; t:tIzFNv  
  } \T^ptj(0  
  } vFi+ExBU  
  $file_list .= " fD2 )/5j1  
"; mN1n/LNi  
  /*关闭打开的目录,结束PHP模块*/ '~AR|8q?  
  closedir($dir); S H6T\}X:  
  ?> i: VMC NH  
   Ev0=m;@_  
   u56WB9Z  
   "_n})s f  
   <!derr-K  
   M[7$F&&n  
   rchKrw  
   i?'|}tK  
   $SdpF-'  
Files in: B;J8^esypD  
b}Xh|0`b+  
U,Z7n H3_  
   p4z thdN[  
   (E7C9U*  
   sQMfU{S /  
   |}wT/3>\  
vg*~t3{L  
  好了,我们已经得到了一个目录清单。需要注意的是,要读取一个文件(稍后我们将进行讲解)或目录的内容,PHP运行的系统上的用户必须至少有读取文件的权限。 jXYjs8Iy  
  下面是一个如何拷贝文件的例子: F<Ig(Wl#az  
F_nXsKem  
     $original = "/home/me/mydatabasedump"; lF3wTf/j  
  $copied = "/archive/mydatabasedumo_1010"; 1n~^@f#`  
  /* 使用copy()函数拷贝原始文件,如果拷贝没有完成则会显示一个错误信息*/ #:tC^7qk  
  @copy($original, $copied) or die("Couldn't copy file."); Dh)(?"^9A  
  ?> REJHh\:.77  
LMI7Ih;  
  这个例子是一个文件备份系统的原型。在这段脚本运行时,它把文件拷贝到一个不同的位置进行保存。稍微修改一下守护程序,就可以在一天中你指定的时刻执行它,而无需用户的干预。 5GDg_9Bz  
8Bx58$xRq  
  假定你在系统上安装了Lynx,可以创建一个守护程序的条目访问这个文件,访问这个文件会运行这个脚本并建立一个拷贝文件,下面的例子将在上午5点钟运行这个脚本,然后关闭Lynx: )Qh*@=$-  
  0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1 axz.[L_elB  
  如果运行的是CGI版本的PHP,可以跳过Lynx部分,而直接调用二进制文件: Zo}vV2  
  0 5 * * * [username] php /path/to/copyfile.php 1>/dev/null 2>&1 \-r"%@OkW  
z(1`Iy M  
五、丰富的数组函数 ) RNB;K~s9  
\qtdbi|Y  
  PHP 4.0中新添加了30个与组数有关的函数,其中一些常见的函数可以判断一个数组中是否包含某个元素,对一个数组中的元素进行计数,添加或删除数组中的元素或者对数组中的元素进行排序。 u4DrZ-v  
m`Pk)c0  
  如果有一个很大的数组,而你需要找出其中是否包含一个特定的元素,就可以使用in_array()。下面的例子将显示“Not found in this array”,因为在一个名字为$namesArray的数组中查找Albert,而在$namesArray数组中不存在这样一个元素。 Sn[/'V^$a  
)&93YrHgC  
     $lookingFor = "Albert"; v>0} v)<v  
  if (in_array($lookingFor, $namesArray)) { wx_j)Wij6  
  echo "You've found it!"; - 9a4ej5  
  } else { fxc?+<P  
  echo "Not found in this array!"; "0J;H#Y"#  
  } <l<6W-I   
  ?> &o'$uLF~Y  
=kBN&v_(!  
  如果把$lookingFor的值改为Mary,就会得到“You've found it!”的信息,因为Mary是$namesArray数组中的一个元素。 W:O p\  
Oe lf^&m  
  如果要对一个数组中的元素个数进行计数,只要简单地使用count()函数即可: <yw56{w,  
XCyrr 2^  
     $count = count($namesArray); ?> zE i\#Zg$  
aq - |  
  返回的$count的值为7。 xpBQ(6Y  
q$'[&&_  
  可以在一个数组的开头或结尾处添加元素,还可以使用array_merge()来建立一个包含二个或更多数组中元素的新数组,合并时,元素的顺序会按指定的顺序排列,如果原来的数组是被排过序的,在合并后需要对它重新排序。 u]& +TR  
X u2+TK  
  我们可以首先利用array_push()在数组的结尾处添加一个元素: OtoG,~?  
'ji|'x T  
     $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); oObQN;A@6  
  /* 向数组中添加元素 */ xMFEeSzl>S  
  array_push($fruitArray, "grape", "pineapple", "tomato"); e//jd&G  
  /*显示每个元素及其序号*/ )a<MW66  
  while (list($key,$value) = each($fruitArray)) { {TaYkuWS  
  echo "$key : $value ~"r(PCa@  
"; >S]"-0tGD=  
  } .H Pa\b\L>  
  ?> ba^/Ar(B  
-x-EU#.G  
  运行上面的程序将得到下面的结果: 6_>(9&g`zV  
  0 : apple 2Mj_wc   
  1 : orange M"yOWD~s~  
  2 : banana o,{]<Sm  
  3 : kiwi GIhFOK  
  4 : pear 'u6n,yRm  
  5 : grape H{1'- wB  
  6 : pineapple _}tPtHPa/  
  7 : tomato n _kE  
' 1X^@]+6  
  如果需要在数组的开头添加元素,其代码与上面的代码差不多,唯一的不同之处是需要用array_unshift()代替array_push()。 ,>Dpt <  
}H|'W[Q.  
     /* 建立一个数组*/ =ba1::18  
  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 5-UrHbpCZ#  
  /* 向数组中添加元素*/ P2)/!+`a  
  array_unshift($fruitArray, "grape", "pineapple", "tomato"); l YpoS  
  /* 显示每个元素及其序号*/ 9V>C %I  
  while (list($key,$value) = each($fruitArray)) { v1=N?8Hz1  
  echo "$key : $value W=Mdh}u_I  
"; FSYs1Li_C  
  } |\W~+}'g~  
  ?> b(t8TR#-  
  运行上面的程序将得到下面的结果: H\$uRA oo*  
Q;GcV&f;f  
  0 : grape u-*z#e_L0  
  1 : pineapple IUz`\BO4  
  2 : tomato S2>$S^[U  
  3 : apple m;!X{CV  
  4 : orange JA4}B wn  
  5 : banana k}!'@  
  6 : kiwi yJMo/!DZ  
  7 : pear GU]kgwSf i  
  array_merge()函数可以把二个或更多的数组合并为一个数组。 g!^mewtd  
_} K3}}  
     $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 2?:'p[z"]  
  /*/建立第二个数组*/ LuVL <W  
  $vegArray = array("carrot", "green beans", "asparagus", "artichoke", "corn"); $@84nR{>  
  /*把这二个数组合并为一个数组*/ c-U]3`;Q  
  $goodfoodArray = array_merge($fruitArray, $vegArray); U^]@0vR  
  /* 显示每个元素及其序号*/ cUn>gT  
  while (list($key,$value) = each($goodfoodArray)) { yw{r:fy  
  echo "$key : $value o>|DT(Ib  
"; O+]'*~a  
  } .@$ A~/ YU  
  ?> wLNk XC  
jwSPLq%  
  运行上面的脚本将得到下面的结果: ,.0B0Y-X  
D;[%*q*  
  0 : apple tToP7q^  
  1 : orange \UZ7_\  
  2 : banana s"p\-Z  
  3 : kiwi c )=a;_h  
  4 : pear AuZISb%6  
  5 : carrot \i\>$'f*z  
  6 : green beans p3e=~{v*  
  7 : asparagus IkO [R1K  
  8 : artichoke <k {_YRB  
  9 : corn HVK0NI  
 btBu[;  
  现在我们已经掌握了如何添加元素和合并数组,我们再来看看如何从一个数组中删除元素。从一个数组的末尾删除一个元素可以使用array_pop()函数,使用array_shift()函数可以从一个数组的开头删除一个元素。尽管使用array_pop()或 array_shift()从数组中删除了一个元素,你还可以把这个元素当作一个变量来使用。 t%Bh'HkG  
$-]I?cWlQ  
  使用array_pop()从一个数组的末尾删除一个元素: 00@F?|-j  
     /*建立一个数组*/ =sF4H_B  
  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); r_kaS als  
  /* 从数组的末尾删除一个元素*/ z m]R76  
  $popped = array_pop($fruitArray); {a15s6'd  
  /* 显示删除后数组的内容和你删除的元素*/ @!^Y_q  
  while (list($key,$value) = each($fruitArray)) { $k`j";8uR  
  echo "$key : $value &P"13]^@  
"; Uyxn+j 5  
  } 2sp4Mm  
  echo " -)xl?IB%  
and finally, in $popped: $popped"; ct<XKqbI  
  ?> m#4h5_N  
2*a9mi  
  运行上面的脚本会得到下面的结果: ./^8L(  
  0 : apple 8dC RSU  
  1 : orange (G(M"S SC  
  2 : banana ^m AxV7k  
  3 : kiwi Q$sC%P(y  
  and finally, in $popped: pear q(A_k+NL  
j8aH*K-l{  
  我们再来讨论一个从一个数组的末尾删除元素的例子: 9$D}j"  
~+V$0Q;L  
     /* 建立一个数组*/ i:jns>E  
  $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 'H#0-V"=  
  /*从一个数组的开始删除一个元素*/ .{|SKhXk  
  $shifted = array_shift($fruitArray); *\cU}qjk  
  /* 显示删除后数组的内容和你删除的元素*/ 1 1(GCu  
  while (list($key,$value) = each($fruitArray)) { *9aI\#}  
  echo "$key : $value T(Bcp^N  
"; 2p4iir  
  } -*O L+  
  echo " VLJ]OW8cO  
and finally, in $shifted: $shifted"; fxmY,{{  
  ?> ~z")';I|  
p<?lF   
  运行上述脚本会得到如下的显示结果: a*iKpr-:  
  0 : orange OR37  
  1 : banana J :O&2g"g  
  2 : kiwi DLD9  
  3 : pear %@|)&][hO  
  and finally, in $shifted: apple kUfbB#.5L  
@Ae&1O;Zh  
  另外还有几个函数可以对数组中的元素进行排序,但在这里我们将只简要介绍基本的排序函数,说明排序的过程: YY(_g|;?8  
9c[bhGD?  
     $fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 53d`+an2  
  /* 对数组进行排序*/ k'+y  
  sort($fruitArray); d_ x jW  
  /*显示每个元素及其序号*/ e/#6qCE  
  while (list($key,$value) = each($fruitArray)) { 1$`|$V1  
  echo "$key : $value L\5:od[EP  
"; /Ak\Q5O'3  
  } <0? r# }  
  ?> g"kET]KP"  
Q laoa)d#  
  运行上述的脚本会得到如下的显示结果: 4bL? V^@7  
0C\cM92o  
  0 : apple s,AJR [  
  1 : banana AEDBr<  
  2 : kiwi 6y57m;JW/  
  3 : orange (ti!Y"e2  
  4 : pear
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
级别: 终身会员
发帖
24568
铜板
-48938
人品值
-504404
贡献值
12
交易币
0
好评度
26842
信誉值
0
金币
0
所在楼道
学一楼
只看该作者 2 发表于: 2006-03-12
我有一本PHP4.NET的教程,越看越难.哎! [audio07]
级别: 大掌柜
发帖
7343
铜板
6618
人品值
1388
贡献值
28
交易币
100
好评度
7488
信誉值
10
金币
0
所在楼道
学一楼
只看该作者 1 发表于: 2006-02-26
随 机 事 件您的宠物得病了,治疗宠物花去您 152 个宠物币


PHP的十个高级技巧(下) `T{CB) ?9  
N}<!k#d E  
六、动态图像的创建 Iza;~8dH5  
  只要安装一些第三方的库文件并具有一定的几何知识,就可以利用PHP来创建和处理图像了。事实上,这不需要太多的几何知识,因为我大学没有毕业,仍然可以利用PHP创建图像。 SGba6b31  
{P\Ob0)q  
  在使用基本的图像创建函数之前,需要安装GD库文件。如果要使用与JPEG有关的图像创建函数,还需要安装jpeg-6b,如果要在图像中使用Type 1型字体,则必须安装t1lib。 {K}Dpy  
P}(c0/  
  在建立图像创建环境之前,还需要作一些准备工作。首先,安装t1lib;其次安装jpeg-6b,然后再安装GD库文件。在安装时一定要按这里给定的顺序进行安装,因为在编译GD为库时会用到jpeg-6b,如果没有安装jpeg-6b,在编译时就会出错。 a=x &sz\x  
dmcY]m  
  在安装完这三个组件后,还需要重新配置PHP,这也是你对采用DSO方式安装PHP感到庆幸的地方之一。运行make clean,然后在当前的配置中添加下面的内容: L/,g D.h^  
GoH.0eQ^  
  --with-gd=[/path/to/gd] ZNpC& "`G  
  --with-jpeg-dir=[/path/to/jpeg-6b] *uP;rUY  
  --with-t1lib=[/path/to/t1lib] %++S;#)~  
  完成添加后执行make命令,然后再执行make install命令。重新启动Apache后运行phpinfo()来检查一下新的设置是否生效了。现在就可以开始图像创建工作了。  vILB$%I  
a`]ZyG*P  
  根据所安装的GD库文件的版本不同,你也许能或者不能创建GIF或PNG格式的图形文件,如果安装的是gd-1.6或以前的版本,可以使用GIF格式的文件但不能创建PNG格式,如果安装的是gd-1.6以后的版本,可以创建PNG文件但不能创建GIF格式的文件。 E>gLUMG$  
A7&/3C6{H  
  创建一幅简单的图像也需要用到许多的函数,我们将一步一步地进行说明。 p! )tA  
W$&*i1<a+  
  在这个例子中,我们将创建一个PNG格式的图像文件,下面的代码是一个包含所创建的图像的MIME类型的头部: Ag*?>I  
?I:_FT  
   i,% N#  
  使用ImageCreate()创建一个代表空白图像的变量,这个函数要求以像素为单位的图像大小的参数,其格式是ImageCreate(x_size, y_size)。如果要创建一个大小为250X250的图像,就可以使用下面的语句: lbw+!{Ch  
2 e#"JZ=  
  $newImg = ImageCreate(250,250); l0qHoM,1Y[  
g>eWX*Pa|  
  由于图像还是空白的,因此你可能会希望用一些彩色来填充它。然而,你需要首先使用ImageColorAllocate()函数用其RGB值为这种颜色指定一个名字,这一函数的格式为ImageColorAllocate([image], [red], [green], [blue])。如果要定义天蓝色,可以使用如下的语句: i_+e&Bjd4j  
vRD(* S9^  
  $skyblue = ImageColorAllocate($newImg,136,193,255); $:1/`m19  
Ov4 [gHy&  
  接下来,需要使用ImageFill()函数用这种颜色填充这个图像,ImageFill()函数有几个版本,例如ImageFillRectangle()、ImageFillPolygon()等。为简单起见,我们通过如下的格式使用ImageFill()函数: 4>fj @X(3  
5|t-CY{?b  
  ImageFill([image], [start x point], [start y point], [color]) Raetz>rL  
  ImageFill($newImg,0,0,$skyblue); d{) =E8wE  
T+rym8.p  
  最后,建立图像后释放图像句柄和所占用的内存: &gJ@"`r4  
|u$*'EsP  
  ImagePNG($newImg); w)1SZ }  
  ImageDestroy($newImg); ?> zlTLp-^Y  
SB5qm?pT8<  
  这样,创建图像的全部代码如下所示: zQt)>Qx_  
!{ _:k%B  
     $newImg = ImageCreate(250,250); H4{7,n  
  $skyblue = ImageColorAllocate($newImg,136,193,255); 'O9Yu{M  
  ImageFill($newImg,0,0,$skyblue); LWSy"Cs*  
  ImagePNG($newImg); 3m2y<l<  
  ImageDestroy($newImg); dl |$pm@x  
  ?> Z0D&ayzkh^  
T nyLVIP  
  如果把这个脚本文件保存为skyblue.php,并用浏览器访问它,就会看到一个天蓝色的250X250的PNG格式的图像。 0}'/pN>  
!U(KQ:j  
  我们还可以使用图像创建函数对图像进行处理,例如把一个较大图像作成一个小图像: p]Qe5@NT  
  假设你有一幅图像,想从中裁剪出一个35X35大小的图像。你所需要作的是创建一个35X35大小的空白图像,创建一个包含原来图像的图像流,然后把一个经过调整大小的原来的图像放到新的空白图像中。 a9_2b}t  
  要完成这一任务的关健函数是ImageCopyResized(),它要求的格式如下所示: B6\/xKmv?8  
S$R=!3* "V  
ImageCopyResized([new image handle], i.[k"(  
[original image handle], JHVndK4L  
[new image X], %u<r_^w5  
[new Image Y], jGJf[:M&Pm  
[original image X], 'd;aAG  
[original image Y], )cZ KB0*+  
[new image X], [new image Y], .>PwbZ  
[original image X], jv1p'qs4  
[original image Y]) 3/& |Z<f  
Z/v )^VR  
     header("Content-type: image/png"); B>z^W+Unyn  
  /* 建立保存新图像高度和宽度的变量*/ 5H 1x-b  
  $newWidth = 35; @y0kX<M  
  $newHeight = 35; XRyeEwA;pp  
  /* 建立给定高度和宽度的新的空白图像*/ m9jjKu]|  
  $newImg = ImageCreate($newWidth,$newHeight); ;i+(Q%LO  
  /* 从原来较大的图像中得到数据*/ Z3ODZfu>  
  $origImg = ImageCreateFromPNG("test.png"); W=|'&UU Ul  
  /*拷贝调整大小后的图像,使用ImageSX()、ImageSY()得到原来的图像在X、Y方面上的大小 */ T2mZkK?rA  
  ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg)); 4"{g{8  
 /*创建希望得到的图像,释放内存 */ /w2IL7}  
  ImagePNG($newImg); ~{kA;uw  
  ImageDestroy($newImg); ?> $[J\sokpY  
je>gT`8  
  如果把这一小段脚本保存为resized.php,然后用浏览器对它进行访问,就会看到一个35X35大小的PNG格式的图形。 rEU1 VvE  
;;U&mhz`  
七、基于PHP的用户认证 ZX{eggXl  
akHQ&+[j  
  如果希望在每一段脚本上都进行口令保护,可以结合使用header()语句、$PHP_AUTH_USER和$PHP_AUTH_PW来建立基本的认证方案,通常的基于服务器的提问/响应顺序都如下所示: |L-- j  
Aqg$q* Y  
  1、用户从服务器上请求一个文件。如果这个文件在服务器上是被保护的,则在响应的头部向用户返回一个401(示经授权的用户)字符串。 p!?7;  
  2、浏览器收到这个响应后,弹出要求用户输入用户名/口令的对话框。 |Q?$n3-f"  
  3、用户在对话框中输入一个用户名和口令,点击OK按钮将信息返回服务器供认证使用。 [`KQ \4u  
  4、如果用户名和口令有效,被保护的文件将向用户开放,只要用户还在使用文件,认证会一直有效。 tEibxE  
G`;mSq6i  
  一段简单的PHP脚本文件通过向用户发送一个适当的能够引起自动显示用户名/口令对话框的HTTP头部就可以模仿HTTP的提问/响应系统,PHP把用户在用户名/口令对话框中输入的信息存储在$PHP_AUTH_USER和$PHP_AUTH_PW中,使用这二个变量,就可以与存储在文本文件、数据库等文件中的用户名/口令进行比较。 F%{z E ANm  
U^-J_ yq  
  这个例子采用了二个硬编码的值进行认证,但无论用户名和口令放在什么地方,其原理都是相同的。 wjOqCF"  
I9U 8@e!X  
     /* 检查$PHP_AUTH_USER和$PHP_AUTH_PW中的值*/ B8up v~U 6  
  if ((!isset($PHP_AUTH_USER)) || (!isset($PHP_AUTH_PW))) { ?q5HAIZ`  
  /* 如果没有值,则发送一个能够引发对话框出现的头部*/ #SD2b,f  
  header('WWW-Authenticate: Basic realm="My Private Stuff"'); HDu|KW$o1  
  header('HTTP/1.0 401 Unauthorized'); )coA30YR  
  echo 'Authorization Required.'; TFhYu  
  exit; <!|=_W6  
  } else if ((isset($PHP_AUTH_USER)) && (isset($PHP_AUTH_PW))){ )_kEy>YscZ  
  /* 变量中有值,检查它们是否正确*/ 4L,&a+)  
  if (($PHP_AUTH_USER != "validname") || ($PHP_AUTH_PW != "goodpassword")) { G~Y#l@8M+  
  /* 如果输入的用户名和口令中有一个不正确,则发送一个能够引发对话框出现的头部 */ Xa&:Hg<  
  header('WWW-Authenticate: Basic realm="My Private Stuff"'); AJzm/,H  
  header('HTTP/1.0 401 Unauthorized'); }ASBP:c"t  
  echo 'Authorization Required.'; kll ,^A  
  exit; l?;ReK.r  
  } else if (($PHP_AUTH_USER == "validname") || ($PHP_AUTH_PW == "goodpassword")) { f9n4/(C y  
  /* 如果二个值都正确,显示成功的信息 */ >4#\ U!  
  echo " u9+)jN<Yh  
You're authorized! jar?"o  
p4b6TI9;  
"; :4COPUBpPV  
  } J=n^&y  
  } 3|Ar~_]  
  ?> 9@*4^Ks p  
-OfAl~ 4  
  需要注意的是,如果你使用的是基于文件的保护机制,它并不能保证目录中所有的文件的安全。它可能保护大部分的文件,如果你认为它能够保护给定目录中的所有文件,你的这种认识就需要变变了。 UB% ;P-RD  
\OK}DhY#  
八、PHP和COM PKs$Q=Ol<|  
  如果你喜欢冒险,并且在Windows上运行CGI、ISAPI或Apache模块版本的PHP,就可以访问COM的函数。好了,详细解释COM的工作就交给微软和许多大部头的书了,为了能简单地了解一下COM的功能,下面是一小段常见的脚本。 ({!*&DVu  
lPlJL`e  
  这一段PHP脚本在后端启动微软的字处理Word,打开一个新的文档,输入一些文字,保存文档,并关闭Word。 >v%UV:7ap  
     // 建立一个指向新COM组件的索引 ];0:aSi#  
  $word = new COM("word.application") or die("Can't start Word!"); EkN>5).  
  // 显示目前正在使用的Word的版本号 *I9G"R8  
  echo "Loading Word, v. {$word->Version} kaCn@$  
"; b1ZHfe:  
  // 把它的可见性设置为0(假),如果要使它在最前端打开,使用1(真) qEjsAL  
  // to open the application in the forefront, use 1 (true) 6|%HCxWO  
  $word->Visible = 0; Ax!fvcsN  
  // 在Word中创建新的文档 2L1Azx  
  $word->Documents->Add(); 8}^ym^H|j  
  // 在新文档中添加文字 hDEZq>&  
  $word->Selection->TypeText("Testing 1-2-3..."); ]08~bL1Q  
  //把文档保存在Windows临时目录中 $,Y?q n/  
  $word->Documents[1]->SaveAs("/Windows/temp/comtest.doc"); :/NP8$~@j  
  // 关闭与COM组件之间的连接 bHHR^*B  
  $word->Quit(); x1:1Jj:  
  // 在屏幕上显示其他信息 +OUM 4y  
  echo "Check for the file..."; `"bp -/  
  ?> q?&JS  
  如果你有一个intranet网站,数据存储在SQL Server中,用户需要这些数据的Excel格式,则可以让PHP运行必要的SQL查询并对输出进行格式化,然后利用COM打开Excel,把数据转化为Excel格式的数据,然后把数据保存在用户的台式机上。 [3W+h1  
uRw%`J4H  
九、PHP和Java j7HOh|q  
  PHP另一个有趣的功能是它可以调用现有的Java 对象中的方法,使得你可以在基于Java的应用中集成PHP。如果要在工作中推广PHP的应用,这一功能就非常有用了,你得到的结果是,“这里的一切都是基于Java的。” "QY~V{u5  
  要利用这一功能,你的服务器上必须安装有JVM(Java虚拟机器)。如果安装的是由Sun、Kaffe、IBM或Blackdown的JDK,就已经安装有了JVM。 jH4Wu`r;m  
,k/<Nv;  
  在配置PHP时,需要在配置文件中添加with-java小节,然后修改php.ini文件中的一部分,对php.ini文件的修改主要是需要添加下面的内容: K%vGfQ8Er-  
wtGb 3D"am  
  [Java] lHPhZ(Z  
  java.library.path=/path/to/library a.AEF P4N  
  java.class.path=/classpath/ i"hn%u$V  
  extension_dir=/path/to/extensions P`M1sON~  
  extension=libphp_java.so /p@0Q [E  
VU|Cct&)  
  需要注意的是,所作的修改与你的安装类型有关,你需要阅读PHP安装目录下ext/java目录中README文件,学习如何配置Java功能。 v8A{ q  
QOF'SEq"k  
  下面是一段如何创建一个新的Java对象的PHP脚本的例子,这段脚本将访问并在显示器是显示一些Java属性。它与COM的例子同样有趣,应该会给我们一些启发。 E __A1j*gd  
     $system = new Java("java.lang.System"); u+8?'ZT,  
  echo " /M_kJe,%  
Java version = " . $system->getProperty("java.version") . " .ZH5^Sv$vp  
"; :.\h.H;  
  echo "Java vendor = " . $system->getProperty("java.vendor") . " XpOQBXbt  
HM\gOz  
"; %w6lNl  
  ?> e9?y0vT//  
  如果你有Java知识,将会对开发工作带来很大的帮助,这种集成的能力是未来PHP被接受和增长的关健。 #.\X% !  
N" oJ3-~  
十、PHP和XML %] 7.E  
  PHP中包含有一个可选的支持Expat解析的XML扩展,利用PHP中与XML相关的函数,可以创建一个分析程序来处理有效的XML文档。如果你使用的是1.3.7版或版本更高的Apache软件,就不需要再安装额外的库文件了,你所需要作的就只是配置PHP中的with-xml。 |n&EbOmgf  
^kj%Ekt7  
  象Java和COM一样,PHP中对XML的支持也很有趣,而且增长也很快,如果你了解Expat或LibXML,请加入这一方面的开发吧。
描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五