|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
既然选择了PHP,就要坚持学下去!大家有没有问自己为什么会选择学习PHP呢?就我个人而言,完全是因为兴趣,因为我的专业和计算机完全无关,但是就是对编程很赶兴趣,尤其对网络编程、web开发特别赶兴趣。 全球超越300万个互联网网站的办理员都在利用PHP,使得它成为最为普及的办事器端剧本言语之一。其特色是运转速度快、不乱牢靠、跨平台,并且是开放源代码软件。随你利用的程度分歧,PHP可以很复杂,也能够很庞杂,可以只利用它发送HTML表格元素,还可以在PHP使用法式中集成Java和XML。
假如你对PHP有必定的懂得或看过一些初步的教材,这些技能可以扩大你对PHP的熟悉,使你把握一些罕见的和初级的PHP功效。
1、把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停止测试:
<? phpinfo() ?>
把这个文件保留到Apache的文档根目次(htdocs)中,然后开启阅读器,键入http://localhost/phpinfo.php地址,屏幕上就会呈现很多的变量和它们的值。
假如要从头设置装备摆设PHP,需求再次运转make clean号令,然后履行带有一系列选项的./configure号令,然后再履行make和make install号令,Apache的目次模块中就会呈现一个新的模块,只需再从头启动Apache加载这个新的模块,就一切OK了。
2、利用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 "<P>You’ve been here $count times.</p>";
全体的会见计数器代码以下所示:
<?
session_start();
session_register(’count’);
$count++;
echo "<P>You’ve been here $count times.</p>";
?>
假如从头加载上述的剧本文件,就会发明变量count的值增添了1,很酷吧。
还可以在对话中注册一个数组变量,假定咱们注册了一个名字为$faves的变量:
$faves = array (’chocolate’,’coffee’,’beer’,’linux’);
可以象注册一个复杂变量那样注册一个数组变量:
session_register(’faves’);
援用数组变量与援用复杂变量没有甚么二样,假如一个用户在网页上指出在生涯中的喜好时,可以把他的喜好注册到一个被称作$faves的数组变量中,然后可以在另外一个网页中很便利地把这些喜好显示出来:
<?
session_start();
echo "My user likes:
<ul>";
while (list(,$v) = each ($faves)) {
echo "<li>$v"; }
echo "</ul>";
?>
然后你就失掉了一个关于用户喜好的清单。
对话变量不克不及被查询字符串掩盖,也就是说咱们不克不及输出http:///www.yourdomain.com/yourscript.php?count=56给注册变量$count指定一个新值,这一点关于平安很主要:只能在办事器真个剧本中删除一个没有注册的对话变量。
假如要完整删除一个对话变量,起首需求从体系中刊出它:
session_unregister(’count’);
要完整删除一个对话变量的剧本长短常复杂,以下所示:
session_destroy();
利用对话变量可以削减会见数据库的频率,使代码加倍明晰,并且可以削减对用户发送的cookie的数目,它是最复杂的办法了。
3、文件是咱们的伴侣
不管你在开辟的网站范围的巨细,都应当意想到代码重用的主要性,不管这些代码是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函数。例如:
<HTML>
<HEAD><TITLE>Something</TITLE></HEAD>
<BODY>
[a lot of content]
<?
// insert copyright
require(’/home/me/mycopyright’);
?>
</BODY>
</HTML>
另外一方面,我常常在文件的入手下手利用include()来掌握很多的函数:
<?
//失掉函数库
include(’/home/me/myfunctions’);
// do PHP things with my functions ?>
<HTML>
<HEAD><TITLE>Something</TITLE></HEAD>
<BODY>
[a lot of content]
</BODY>
</HTML>
下一个成绩就该是“include和require文件在哪里?”,对这个成绩复杂的回覆是,“体系中的恣意中央。”假如你的代码中包括有带有效户名和口令的数据库毗连,你一定不会将它们都放在文档根目次中向一切的人都开放。
included或required文件可以在体系上的任何中央,只需PHP运转的体系上的用户可以会见这些文件便可,你可使这些文件具有任何后缀,或不利用后缀。
利用include()和require()对在网站中的元素停止详细化是一种广泛的景象,并在需求对网站晋级时,给你带来很大的便利。
4、PHP和文件体系的保护
PHP中有很多与文件体系有关的函数,这些函数不但可以翻开文件,还可以显示目次中的内容、挪动文件和其他一些功效,很多人乃至用PHP开辟基于互联网的文件资本办理器。
关于文件途径的注释:在Windows中,可以在途径中利用/和\符号,而在其他的操作体系中只能利用/符号。出于分歧性的原因,咱们一致利用/符号。
上面的剧本样例可以显示一个目次清单,正文已包括在代码中:
<? /*把要读取的目次的全途径名存入一个名字为$dir_name的变量中。 */
$dir_name = "/home/me/";
/* 创立一个句柄,其值是翻开一个给定目次的了局*/
$dir = opendir($dir_name);
/* 创立一个文字块,用以放置列表元素(文件名字)*/
$file_list = "<ul>";
/* 利用一个while语句,读取已翻开的目次中的一切元素,假如文件的名字不是“.”或“..”,则显示列表中的名字*/
while ($file_name = readdir($dir)) {
if (($file_name != ".") && ($file_name != "..")) {
$file_list .= "<li>$file_name";
}
}
$file_list .= "</ul>";
/*封闭翻开的目次,停止PHP模块*/
closedir($dir);
?>
<!-- Start your HTML -->
<HTML>
<HEAD>
<TITLE>Directory Listing</TITLE>
</HEAD>
<BODY>
<!-- Use PHP to print the name of the directory you read -->
<P>Files in: <? echo "$dir_name"; ?></p>
<!-- Use PHP to print the directory listing -->
<? echo "$file_list"; ?>
</BODY>
</HTML>
好了,咱们已失掉了一个目次清单。需求注重的是,要读取一个文件(稍后咱们将停止解说)或目次的内容,PHP运转的体系上的用户必需最少有读取文件的权限。
上面是一个若何拷贝文件的例子:
<? /*把你要拷贝的原文件的全途径赋给一个名字为$original的变量中,把拷贝的文件的全途径付与一个名字为$copied的变量中*/
$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
5、丰厚的数组函数
PHP 4.0中新添加了30个与组数有关的函数,个中一些罕见的函数可以判别一个数组中是不是包括某个元素,对一个数组中的元素停止计数,添加或删除数组中的元素或对数组中的元素停止排序。
假如有一个很大的数组,而你需求找出个中是不是包括一个特定的元素,就能够利用in_array()。上面的例子将显示“Not found in this array”,由于在一个名字为$namesArray的数组中查找Albert,而在$namesArray数组中不存在如许一个元素。
<? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John");
$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()函数便可:
<? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John");
$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<br>";
}
?>
运转下面的法式将失掉上面的了局:
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<br>";
}
?>
运转下面的法式将失掉上面的了局:
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<br>";
}
?>
运转下面的剧本将失掉上面的了局:
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<br>";
}
echo "<br>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<br>";
}
echo "<br>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<br>";
}
?>
运转上述的剧本会失掉以下的显示了局:
0 : apple
1 : banana
2 : kiwi
3 : orange
4 : pear
6、静态图象的创立
只需装置一些第三方的库文件并具有必定的几何常识,就能够使用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类型的头部:
<? header ("Content-type: image/png");
利用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); ?>
如许,创立图象的全体代码以下所示:
<? header ("Content-type: image/png");
$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格局的图形。
7、基于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 "<P>You’re authorized!</p>";
}
}
?>
需求注重的是,假如你利用的是基于文件的回护机制,它其实不能包管目次中一切的文件的平安。它能够回护大局部的文件,假如你以为它可以回护给定目次中的一切文件,你的这类熟悉就需求变变了。
8、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}<br>";
// 把它的可见性设置为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格局的数据,然后把数据保留在用户的台式机上。
9、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 "<P>Java version = " . $system->getProperty("java.version") . "<br>";
echo "Java vendor = " . $system->getProperty("java.vendor") . "</p>";
?>
假如你有Java常识,将会对开辟任务带来很大的匡助,这类集成的才能是将来PHP被承受和增加的关健。
10、PHP和XML
PHP中包括有一个可选的撑持Expat解析的XML扩大,使用PHP中与XML相干的函数,可以创立一个剖析法式来处置无效的XML文档。假如你利用的是1.3.7版或版本更高的Apache软件,就不需求再装置额定的库文件了,你所需求作的就只是设置装备摆设PHP中的with-xml。学会了PHP,那么学其他的语言,肯定速成,反过来也一样,如果你之前学过其他的语言,那么学PHP肯定快。 |
|