10个PHP小秘诀

上传人:仙*** 文档编号:152233613 上传时间:2022-09-15 格式:DOC 页数:24 大小:95KB
返回 下载 相关 举报
10个PHP小秘诀_第1页
第1页 / 共24页
10个PHP小秘诀_第2页
第2页 / 共24页
10个PHP小秘诀_第3页
第3页 / 共24页
点击查看更多>>
资源描述
10个 PHP小秘诀让你的 PHP 更容易重新设定将 PHP 安装成 Apache 服务器的动态共享物件(Apache DSO) PHP 最常被安装在 Linux/Unix 作业系统上,并且搭配 Apache 服务器一起使用。在将 PHP 与 Apache 服务器一起安装的时候,你有三种不同的安装方式可以选择:静态模组,动态共享物件(Dynamic Shared Object, DSO)以及 CGI 程式执行档。 我之所以建议使用动态共享物件的模式来安装 PHP,是因为这种安装方式具有容易维护与升级的重要优点。比方说,假设你一开始安装 PHP 的时候,只加入了PHP 的数据库相关模组。几天以后你决定再加装 PHP 的编码功能相关模组,这时候你只需要在你的系统命令列输入 make clean 指令,然后输入新的 PHP 设定选项,然后再输入 make 与 make install 指令,接下来系统就会产生一个新的 PHP 动态共享物件,并且安装到 Apache 服务器所指定的适当目录位置去了。接下来你要做的只是重新启动 Apache 服务器就行了,你不需要把 Apache 服务器整个重新编译过。 下面几个基本步骤可以让你安装一套全新的 Apache 服务器,并且内含 PHP 动态载入模组: 1. 到 Apache 软体协会网站取得最新版本的 Apache 服务器原始码。2. 将取得的档案复制到某个有意义的目录位置,例如 /usr/local/ 或者 /opt/ ,或者其他你觉得适当的目录位置。3. 将取得的档案解压缩,解开以后你会得到一些 *.tar 档案。 4. 输入下面的指令将这些 *.tar 档案解开,并且将解开的档案放置到一个名叫 apache_version 的目录位置:tar -xvf apache_version.tar 5. 输入 cd 指令将工作目录切换到 /usr/local/apache_version(如果你在上一个步骤把 *.tar 档案解到其他不同目录,那么就切换到你所指定的目录去) 6. 输入下面的指令准备编译程式,记得将下面指令里面的 path 部分代换成你自己的目录名称,例如 /usr/local/apacheversion (不要加上最后面的斜线!)。这个步骤所做的工作是启动 mod_so,如此一来 Apache服务器才可以使用动态共享物件。 ./configure -prefix=path -enable-module=so 7. 等到系统回到命令提示符号,输入 make,然后继续等候系统回到命令提示符号。8. 输入 make install指令。 此时编译程式将会产生最后需要用到的目录与档案,完成以后会再度回到命令提示符号。接下来可以开始安装 PHP 了: 1. 到 PHP 官方网站的下载专区 取得最新版本的 PHP 原始程式码。2. 将取得的档案放置到某个有意义的目录位置,例如 /usr/local/ 或者 /opt/ ,或者其他你觉得适当的目录位置。3. 将取得的档案解压缩,解开以后你会得到一些 *.tar 档案。 4. 输入下面的指令将这些 *.tar 档案解开,并且将解开的档案放置到一个名叫 php-version 的目录位置: tar -xvf php-version 5. 输入 cd 指令将工作目录切换到 /usr/local/php-version (如果你在上一个步骤把 *.tar 档案解到其他不同目录,那么就切换到你所指定的目录去) 现在我们可以开始编译 PHP 动态共享物件了,真正必须的设定选项只有一个:-with-apxs(这是一个位在 Apache 服务器安装位置下的 bin 目录里面的一个档案)。不过在这里我建议把 PHP 的 MySQL 相关模组也一起加入。 ./configure -with-mysql=/path to mysql -with-apxs=/path to apxs 6. 等到系统回到命令提示符号,输入 make指令,然后继续等候系统回到命令提示符号。7. 输入make install指令。 接下来编译程式便会产生我们最后要使用的 PHP 动态共享物件,将它放置到Apache 用来放置动态共享物件的目录下,并且替你修改 Apache 服务器设定档 httpd.conf 的某些部分,最后系统会再度回到命令提示符号。等你回到命令提示符号以后,你必须回头去修改 httpd.conf 档案,里面有些设定必须修改: 1. 找出 ServerAdmin 那一行,把你的 email 信箱加上去,也就是把那一行修改成: ServerAdmin you 2. 找出 ServerName 那一行,并且将服务器名称设定好,例如: ServerName localhost 3. 找出下面这一段设定: # And for PHP 4.x, use:#AddType application/x-httpd-php .php#AddType application/x-httpd-php-source .phps你必须修改这里的设定值,把 AddType 那两行前面的井字符号去掉(这里的井字符号是代表注解),并且加入其它你想要配合 PHP 程式使用的副档名,修改完以后这段设定看起来应该像是(请注意里面的 .php 和 .phtml 就是将来你可以用来分辨 PHP 程式的副档名): # And for PHP 4.x, use:#AddType application/x-httpd-php .php .phtml AddType application/x-httpd-php-source .phps把 httpd.conf 存档,输入 cd 指令回到上一层目录,然后输入下面的指令启动Apache 服务器: ./bin/apachectl start 如果启动过程没有任何错误讯息出现的话,接下来我们就可以开始测试看看刚刚安装好的 Apache 服务器和 PHP 模组是不是真的一切无误了。请建立一个档案,命名为 phpinfo.php,里面只要输入下面这行 PHP 程式码就可以了: 将档案存档,然后把它放置到 Apache 服务器的文件根目录(该目录名称是 htdocs)去。启动你的浏览器,在位址列输入 http:/localhost/phpinfo.php,如果一切安装无误的话,你应该会看到一个很长的网页,上面显示了完整的 PHP系统设定资讯,这表示我们已经顺利安装完成 Apache 服务器和 PHP 了! 在初次安装完成以后,日后当你想要重新设定 PHP 的时候(比方说加入原本没有安装的 PHP 模组),你只需要在系统命令提示符号下输入 make clean指令,然后输入新的 ./configure设定指令,再输入 make和 make install指令,系统便会产生一个新的PHP动态共享物件。 接下来你只需要重新启动 Apache 服务器让它重新载入刚刚建立好的新模组即可。只需要几个简单的步骤便可以解决掉一堆烦人的问题囉!制作与处理图形档动态产生图形档案只要透过一些协力厂商的函式库,再加上一些些几何学知识,你就可以使用 PHP来动态产生图形档案了!事实上那些几何学知识也不一定全都需要啦,像我这在高中时代连几何学都不及格的人还是能用 PHP 来产生图形档! 在开始使用基本的图形产生功能之前,你必须在系统上先安装好GD 函式库。此外如果你想要使用 JPEG 图形相关功能,你必须安装好 jpeg-6b 函式库。如果你需要使用 Type 1 字型档案相关功能,你还必须安装好 t1lib 函式库。 在进行这些环境设定之前有一点需要注意:首先你要安装好 t1lib 函式库并且确定安装无误,接下来再安装 jpeg-6b 函式库,再接下来才开始安装 GD 函式库。记住一定要按照前面提到的顺序来安装这三个函式库,因为在编译 GD 函式库的时候我们必须指定编译程式将 jpeg-6b 函式库给包含进来,如果这时候系统找不到 jpeg-6b 函式库的话,最后编译出来的 GD 函式库就会不能正常使用 JPEG 图形相关功能了。为了避免把自己最后搞得摸不着头绪,请记住前面所说的安装顺序。 安装完成前面提到的三个函式库以后,我们必须重新设定 PHP,让 PHP 把这三个函式库的相关功能包含进来。这时候你就会感受到把 PHP 安装成 Apache 服务器动态分享物件所带来的好处了。首先在系统命令提示字元下输入 make clean指令,然后输入选项设定指令,加入下面这三个选项设定: -with-gd=/path/to/gd-with-jpeg-dir=/path/to/jpeg-6b-with-t1lib=/path/to/t1lib输入完成后请执行 make 指令,然后再执行 make install 指令。最后请重新启动 Apache 服务器,并且写一个简单的 PHP 程式使用 phpinfo() 函数来测试看看上述三项函式库是不是已经正确安装到 PHP 模组里面了。 根据你所安装的 GD 函式库版本的不同,你可能无法使用 GIF 或者 PNG 格式的图档。如果你安装的是 GD 1.6 或者之前的版本,那么你可以使用 GIF 图档但是不能使用 PNG 格式的图形。相反地,如果你安装的是 GD 1.6 以后的版本,那么你可以使用 PNG 图档,但是却无法使用 GIF 格式图档(这是因为拥有 GIF 图档格式专利权的 CompuServ 公司后来开始对 GIF 图形格式收取权利金,在此之后 GD 函式库便不再包含处理 GIF 图档的功能了)。 产生一个简单图片档需要使用一系列不同的函数,以下我会一个一个介绍。 首先必须我们输出一个 HTTP 表头,告诉浏览器我们现在要输出的是何种格式的资料,在这里我们使用 PNG 图档做为范例。 我们的程式码最后看起来便是下面这样: 如果你把上面的程式储存成 skyblue.php,然后使用浏览器浏览这个页面,画面上出现的应该是一个 250x250 像素大小,天蓝色的 PNG 格式图片(请先确认你所使用的浏览器能够正确浏览 PNG 格式的图形)。 除了产生新图片以外,我们也可以使用 PHP 的图形相关功能来处理既有的图片档案,比方说,我们可以替一个大图片制作缩图。 现在假设你要为一张图片档制作一个 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); 请直接参考以下范例程式码的注解: 如果你把上面的程式储存成 resized.php,然后使用浏览器浏览这个页面,画面上出现的应该是一个 35x35 像素大小 PNG 格式缩图(同样请先确认你所使用的浏览器能够正确浏览 PNG 格式的图形)。有效处理资料丰富的阵列相关函数PHP 4.0 提供了超过三十个 PHP 3.0 没有的阵列相关函数以供程式设计师运用。这些函数里面常用的功能有:检查一个阵列里面是否包含某个值,计算某个值在阵列里面出现的次数,新增或者删除阵列元素以及将阵列元素重新排序等等。 如果我们有一个很大的阵列,而我们要做的只是检查阵列里面是否包含某个我们感兴趣的值,那么我们可以使用 in_array()函数来轻松地完成这项功能。下面这个范例程式会在页面上显示在阵列中找不到你要找的值(Not found in this array) 这个字串,因为我们要找的字串Albert的确不在 $namesArray 这个阵列里面: 如果你把变数$lookingFor的值改成Mary然后重新执行一次,那么这次画面上便会显示找到了!(Youve found it!),因为Mary这个值的确存在在$namesArray阵列里面。 如果你想知道阵列所包含的元素总个数,那么你可以使用简单易用的count()函数: 变数$count的值将会是7。 你可以很容易地在阵列的头或者尾端新增一个元素,或者使用array_merge()函数来把两个或以上的阵列元素合并成一个新的阵列。在合并阵列元素的时候,合并的顺序是按照原有阵列被呼叫到的顺序来决定。如果原有阵列本身已经被重新排序过,那么在阵列合并完成以后,你必须针对产生出来的新阵列重新再排序一次。 下面的范例首先示范如何使用 array_push() 函数在阵列的尾端新增元素:? /* 首先我们建立一个阵列 */$fruitArray = array(apple, orange, banana, kiwi, pear); /* 使用array_push()函数在原有阵列尾端新增一些元素 */array_push($fruitArray, grape, pineapple, tomato); /* 现在把该阵列的所有元素的键(key)与值(value)都显示在网页上 */while (list($key,$value) = each($fruitArray) echo $key : $value; ? 显示结果如下:0 : apple1 : orange2 : banana3 : kiwi4 : pear5 : grape6 : pineapple7 : tomato 现在来示范如何从阵列的开头新增一些元素。下面的程式码和前面一个范例几乎完全相同,唯一的差别只是这里使用的函数是array_unshift()而不是 array_push()。 ?/* 首先我们建立一个阵列 */$fruitArray = array(apple, orange, banana, kiwi, pear); /* 使用array_unshift()函数在原有阵列开头新增一些元素 */array_unshift($fruitArray, grape, pineapple, tomato); /* 现在把该阵列的所有元素的键(key)与值(value)都显示在网页上 */while (list($key,$value) = each($fruitArray) echo $key : $value; ? 显示结果如下:0 : grape1 : pineapple2 : tomato3 : apple4 : orange5 : banana6 : kiwi7 : pear array_merge()函数将两个或以上的阵列合并成一个新的阵列,下面这个范例就介绍这个函数的使用方式: ? /* 首先建立第一个阵列 */$fruitArray = array(apple, orange, banana, kiwi, pear); /* 接下来建立第二个阵列 */$vegArray = array(carrot, green beans, asparagus, artichoke, corn); /* 现在使用array_merge()函数将两个阵列合并成一个新的阵列 */$goodfoodArray = array_merge($fruitArray, $vegArray); /* 最后我们把合并后的新阵列的所有元素的键(key)与值(value)都显示在网页上 */while (list($key,$value) = each($goodfoodArray) echo $key : $value; ? 显示结果如下:0 : apple1 : orange2 : banana3 : kiwi4 : pear5 : carrot6 : green beans7 : asparagus8 : artichoke9 : corn 介绍完如何新增元素以及合并阵列以后,现在来介绍如何从阵列中删除一些元素。首先,如果要从阵列的尾端删除元素,我们可以使用 array_pop() 函数。另外还有一个函数叫做 array_shift(),它是用来从阵列的开头删除一些元素。在我们把元素从阵列中删除以后,该阵列就再也找不到我们之前删除的元素了,但是被删除的元素还是可以透过一个变数来取得它的值。 现在我们试着使用array_pop()函数从阵列的尾端删除一些元素: ?/* 首先我们建立一个阵列 */$fruitArray = array(apple, orange, banana, kiwi, pear); /* 使用array_pop()函数从阵列的尾端删除一个元素 */$popped = array_pop($fruitArray); /* 现在我们把删除后的阵列中所有元素的键(key)与值(value)都显示在网页上 */while (list($key,$value) = each($fruitArray) echo $key : $value; echo 最后,刚才被删除的元素的值会储存在 $popped 变数里面,它的值是:$popped; ? 显示结果如下:0 : apple1 : orange2 : banana3 : kiwi 最后,刚才被删除的元素的值会储存在 $popped 变数里面,它的值是: pear 接下来示范如何从阵列的尾端删除元素: ?/* 首先我们建立一个阵列 */$fruitArray = array(apple, orange, banana, kiwi, pear); /* 使用 array_shift()函数从阵列的开头删除一个元素 */$shifted = array_shift($fruitArray); /* 现在我们把删除后的阵列中所有元素的键(key)与值(value)都显示在网页上 */while (list($key,$value) = each($fruitArray) echo $key : $value; echo 最后,刚才被删除的元素的值会储存在 $shifted 变数里面,它的值是:$shifted; ? 显示结果如下:0 : orange1 : banana2 : kiwi3 : pear 最后,刚才被删除的元素的值会储存在 $shifted 变数里面,它的值是:apple PHP 提供了许多函数可以用来将阵列的元素重新排序,但是在这里我只介绍基本的排序方式好让你能了解阵列排序的过程: ? /* 首先我们建立一个阵列 */$fruitArray = array(apple, orange, banana, kiwi, pear);/* 使用 sort()函数将阵列的元素重新排序 */sort($fruitArray); /* reset ($fruitArray) 以便我们能正确的将它从头至尾的显示*/ /* 现在我们把删除后的阵列中所有元素的键(key)与值(value)都显示在网页上 */while (list($key,$value) = each($fruitArray) echo $key : $value; ? 显示结果如下:0 : apple1 : banana2 : kiwi3 : orange4 : pear 显示目录内容使用PHP来维护档案系统PHP 提供了很多与档案系统相关的函数,让我们不仅可以开启档案,还能够显示目录的内容,搬移档案的位置以及其他更多功能。许多人甚至写了能够透过浏览器来管理档案内容的 PHP 程式。 在开始介绍 PHP 的档案系统相关功能之前,我们要先厘清一件事情:在 Windows作业系统里面,档案路径可以使用斜线(/)或者反斜线()来表示,但是在其他作业系统里面我们只会使用到斜线。为了保持统一性,下面的范例里面的档案路径都是使用斜线。 下面的范例程式教你基本的目录内容显示功能,每个步骤都有注解,请直接阅读。 ? /* $dir_name 这个变数的值是你想要读取的目录的完整路径 */ $dir_name = /home/me/; /* opendir()函数会开启某个目录,并且传回一个参考值(handle)让我们可以用来在程式中参照到该目录 */ $dir = opendir($dir_name); /* 开始建立一个字串,这个字串包含了 HTML 的列表标签,用来显示目录中的档案名称。 */ $file_list = ; /* 使用一个 while 回圈叙述将前面开启的目录中的档案全部读取一遍。如果读取到的档名不是.或者.,就把该档名写入前面提到的字串里面去。 */ while ($file_name = readdir($dir) if ($file_name != .) & ($file_name != .) $file_list .= $file_name; /* 替 HTML 列表标签加上结尾 */ $file_list .= ; /* 关闭之前开启的目录并且结束这段 PHP 程式 */ closedir($dir); ? 列出目录中的档案名称 Files in: 恭喜!你已经成功把某个目录中的档案名称显示在网页上了。请记住一点:要读取某个目录或者档案(读取档案内容的做法稍后会介绍),PHP 本身执行所用的身分必须至少拥有该目录或者档案的读取权限才行,否则系统会显示权限不足的错误讯息。 下一个范例教你如何复制一个档案: 上面的范例程式可以用来扩充成为一个档案备份系统程式。当这个程式执行的时候,它会将数据库的资料档案复制到其他目录下面做为备份之用。只要修改系统的排程档案内容(crontab),我们便可以让这个程式自动在每天的固定时刻执行一次,达到系统自动备份,不需要人工手动执行。 如果你的系统上面有安装 Lynx 软体(Lynx 是一种纯文字的 Web 浏览器)的话,你可以在系统排程档案里面加入下面这笔记录来让系统在固定时间自动启动 Lynx 并且呼叫我们之前写好的 PHP 备份程式。当 Lynx 呼叫(浏览)我们的 PHP 程式的时候,该程式就会被执行,并且产生备份档案。下面这个范例教你如何在每天早晨五点钟执行我们的备份程式,并且在执行完以后自动将 Lynx 程式关闭: 0 5 * * * username lynx -dump http:/localhost/copyfile.php 1/dev/null 2&1 如果你的系统安装的是 CGI 版本的 PHP,那么你可以直接呼叫 PHP 执行档而不需要透过 Lynx 来呼叫我们的 PHP 程式: 0 5 * * * username php /path/to/copyfile.php 1/dev/null 2&1让网站维护变得更容易善用包含档案(Include files)不管你所开发的网站的规模是大是小,你都应该要体认到重复使用程式码的重要性,不论你重复使用的是 PHP 程式或者是 HTML 原始码。举个例子来说,网站页尾的版权宣告至少每年都得修改一次,如果你的网站有 1,000 个页面(别说 1,000个,就算只有 10 个页面也一样)怎么办?手动一个一个修改这些页面肯定是个梦魇。 透过 PHP 我们可以用几个不同的方式来重复使用程式码。要使用哪些函数端视你要重复使用的是怎样的内容而定。 这些主要的函数包括: * include() 与 include_once()* require() 与 require_once() include() 函数会将指定的档案读入并且执行里面的程式。例如: include(/home/me/myfile); 被引入的档案中的程式码都会被执行,而且这些程式在执行的时候会拥有和原始档案中呼叫到 include() 函数的位置相同的变数范围(variable scope)。你可以引入同一个服务器中的静态档案,甚至可以透过合并使用 include() 与 fopen() 函数来引入其他服务器上面的档案。 include_once()函数的作用和 include() 是几乎相同的,唯一的差别在于 include_once() 函数会先检查要引入的档案是不是已经在该程式中的其他地方被引入过了,如果有的话就不会再次重复引入该档案(这项功能有时候是很重要的,比方说要引入的档案里面宣告了一些你自行定义好的函数,那么如果在同一个程式重复引入这个档案,在第二次引入的时候便会发生错误讯息,因为 PHP 不允许相同名称的函数被重复宣告第二次)。 require()函数会将目标档案的内容读入,并且把自己本身代换成这些读入的内容。这个读入并且代换的动作是在 PHP 引擎编译你的程式码的时候发生的,而不是发生在 PHP 引擎开始执行编译好的程式码的时候(PHP 3.0 引擎的工作方式是编译一行执行一行,但是到了 PHP 4.0 就有所改变了,PHP 4.0 是先把整个程式码全部编译完成后,再将这些编译好的程式码一次执行完毕,在编译的过程中不会执行任何程式码)。 require() 通常来引入静态的内容,而 include() 则适合用来引入动态的程式码。此外如同 include_once()函数,require_once() 函数会先检查目标档案的内容是不是在之前就已经引入过了,如果是的话,便不会再次重复引入同样的内容。 我个人倾向使用 require() 函数来引入版权宣告(copyrights),静态文字或其他本身不含有变数,或者本身需要倚赖其他执行过的程式才能正确执行的程式码。例如:网页标题一堆内容 另一方面,我通常在程式的开头使用 include() 函数来引入一些函式库或者类似的程式码: 网页标题一堆内容 接下来你可能会问这个挺符合逻辑的问题:这些被引入的档案要放在哪儿呢?简短的答案是:放在服务器档案系统里的任何地方都行。然而,要留意的是如果被引入的档案除了单纯的程式码片段以外还包含了一些敏感资料,例如连结数据库系统要用到的帐号和密码,那么建议你不要把这些档案放在 Web 服务器的文件根目录之下,因为那样的话其他有心人士便可以很容易地窃取到这些资料了。 你可以将这些被包含的档案放在系统的任何一个目录里面,唯一的条件是 PHP 本身用来执行的身分(www,nobody 或者其他身分)必须要有足够的权限能够读取这些档案就可以了。这些档案的副档名也可以任意取,甚至没有附档名也无所谓。 善用include()和 require()来将网站里面经常需要变动的共用内容做合理的分割,在更新网站内容的时候将会容易进行得多。 记住你的网站访客使用 PHP 内建的使用者状态管理(session)功能使用者状态管理(session support)是 PHP 4.0 一个让大家期待已久的新功能。在 PHP 3.0 的时代,程式设计师必须使用其他人写好的函式库来实作状态管理功能,或者就干脆放弃这项功能不用算了。而状态管理功能的缺乏事实上是 PHP 3.0 最让人感到失望的地方之一。嗯,不过现在状况已经不同了,从 PHP 4.0 的早期测试版开始,使用者状态管理便已经成为 PHP 内建的功能之一了。 你可以使用状态管理功能来管理使用者从进入网站开始一直到离开网站为止这段期间内的所有相关变数(只要使用者没有离开网站,那么这些变数就都可以取用,不会因为使用者离开某个单一页面而造成资料消失),而不需要储存许多cookie 或者使用隐藏表单栏位,甚至将这些变数储存在数据库里面,造成数据库服务器的大量负荷。 一旦你在网站中的某一页启动状态管理,PHP 引擎便会开始纪录使用者状态(如果对这个使用者来说系统还没开始纪录该使用者的状态的话),或者继续纪录某个先前已经启动的使用者状态。要启动 PHP 的状态管理功能,你可以使用下面这个语法: session_start(); 一旦启动状态管理,PHP 会透过 cookie 传送一个独一无二的状态代码(这个代码看起来会像是:940f8b05a40d5119c030c9c7745aead9)给使用者,同时在服务器这端,PHP 引擎会自动产生一个档名与状态代码相对应的暂存文字档案(如:sess_940f8b05a40d5119c030c9c7745aead9),该档案会用来储存程式设计师在这个使用者状态纪录中所注册的所有变数。 谈到使用者状态管理,最常使用的范例便是一个页面存取计数器(access counter)了: 现在来开始撰写 PHP 程式码吧。这里要特别注意的是在你尝试启动使用者状态纪录之前,千万不能够输出任何内容(不能有空格,TAB 甚至换行等等空白字元,也不能有任何 HTML 标签,任何内容都不行)给浏览器。这是因为状态管理相关函数会送出 HTTP 表头(header)资讯给浏览器,如果在送出 HTTP 表头资讯给浏览器之前已经有其他内容被输出的话,系统将会出现错误讯息。 ?/ 如果该使用者的状态管理尚未被启动的话,下面这行程式便会启动该使用者的状态管理session_start(); 接下来,注册一个名为count的变数: session_register(count); 一旦你注册了一个变数,PHP 便会在从使用者进入网站一直到离开网站的整个浏览过程中自动替你维护这个变数的值,你可以随持取用这些注册过的变数。刚注册好的变数并没有指定任何值给它,不过一旦我们增加 count 变数的值,它的值便会是 1 了: $count+; 把这些程式码组合起来,我们的程式码就会做下面这些事情了:启动使用者状态纪录功能(如果对该使用者而言尚未启动的话),指定一个独一无二的状态代码(session id)给该使用者,注册一个名为 count 的变数,并且在每次使用者浏览到该页面的时候,将变数 $count 的值加一,这个值就可以用来记录该使用者浏览过该页面的次数了。 如果要将使用者这次的浏览历程中观看了该页面多少次,我们只需要将变数$count 的值印出来就行了: echo 您已经浏览这个页面$count 次了。; 完整的页面浏览计数器程式码看起来就像这样: ?session_start();session_register(count);$count+;echo 您已经浏览这个页面 $count 次了。;? 如果你不断重新载入这个页面,你会发现画面上显示的浏览次数会不断的增加。很刺激吧! 除了注册单纯的变数以外,我们也可以注册一个阵列(array)到使用者状态纪录中。假设我们有下面这个名为 $faves 的阵列: $faves = array (巧克力,咖啡,啤酒,linux); 注册阵列的做法和注册其他单纯变数是完全一样的: session_register(faves); 注册完成阵列以后,在往后的程式码里面要参照到该阵列的做法也没有任何不同,只要单纯地叫用 $faves 这个变数就行了。假设你的使用者在网站中某个页面表单里头选择了一些他所喜欢的东西,而且你将这些项目透过 $faves 阵列注册到该使用者的状态纪录里面,那么在网站中其他页面你可以很容易地把这些项目显示在画面上: ?session_start();echo 我的访客喜欢的东西是:; while (list(,$v) = each ($faves) echo $v; echo ;? 就这么轻轻松松的,你就可以把访客喜欢的东西显示在网页上了。 使用者状态纪录所注册的变数是无法用查询字串(query string)来盖过的,比方说,使用者无法直接在浏览器的位址列输入下面的 URL: http:/ 来企图盖过原本注册在使用者状态纪录中的 $count 变数的值。这是一个非常重要的安全观念:只有你自己能够在你的程式里面注册或者删除使用者状态纪录中的变数,其他使用者无法透过 URL 后面的查询字串企图混淆这些变数的值。 要删除原本注册过的使用者状态变数,你可以使用下面的语法: session_unregister(count); 要将整个使用者状态纪录变数全部删除并且停止纪录,请使用下面的语法: session_destroy(); 适当地善用使用者状态纪录功能的好处多多:它可以让我们不须将使用者状态资料储存在数据库中,减少数据库服务器的负荷。它也可以让我们不需要自己撰写长串的程式码来透过 cookie 纪录这些使用者状态变数(而且,这样一来我们也不用在网站的隐私权声明里头花上很长的篇幅来解释为什么当使用者登入网站的时候,我们要储存五十个 cookie 到他们的硬碟里面去了)。这项功能让我们只需要一个 cookie 来储存一个变数(session id)就行了,其他所有的资讯都透过一个精巧无比的机制来帮我们纪录,让我们的工作变得再简单不过了! 提供档案给已注册的使用者使用 PHP 进行使用者身分认证如果你想要为网站中某些页面加上密码保护,你可以使用 PHP 的 header()函数搭配 $PHP_AUTH_USER 和 $PHP_AUTH_PW 这两个全域变数(global variables)来制作出基本的使用者认证机制。下面是正常的服务器端密码保护机制的运作方式: 1. 使用者想要浏览服务器上面的某个档案,如果这个档案受到密码保护,那么服务器便会回应一个 401(未认证的使用者,Unauthorized User)表头给浏览器。 2. 浏览器接收到这个表头资讯,便会跳出一个对话方块,要求使用者输入使用者名称与密码。 3. 使用者在对话方块中输入使用者名称与密码,然后按下 OK 按钮,浏览器便会将帐号密码传送给服务器以供认证之用。 4. 如果使用者输入的帐号密码是有效的,那么服务器便会将该使用者之前要求浏览的档案传送给使用者。反之如果帐号密码不正确,服务器会再度传送 401 HTTP表头给浏览器,浏览器接收到以后又会再度跳出请使用者输入帐号密码的对话方块,重新按照上面的步骤进行认证,直到帐号密码正确,或者使用者在对话方块中按下取消按钮为止。当使用者通过认证以后,这个认证身分在同一个受保护的区域中都会保持有效。 我们可以设计一个简单的 PHP 程式,透过 PHP 的 header()函数输出 HTTP 表头来模拟上面提到的 HTTP 使用者认证机制。PHP 会自动把使用者在对话方块中所输入的使用者名称与密码分别储存在 $PHP_AUTH_USER 与 $PHP_AUTH_PW 这两个全域变数里面。透过这两个变数,我们就可以检查使用者输入的帐号密码是否有效。有效的帐号密码可以储存在文字档或数据库里面,或者其他任何我们觉得适当的地方都可以。 请注意:$PHP_AUTH_USER,$PHP_AUTH_PW 与 $PHP_AUTH_TYPE这三个全域变数只有在 PHP 以 Apache 模组的型式安装的时候才能使用。如果你的系统安装的是 CGI 版本的 PHP,那么你只能够使用 Linux/Unix 系统的 .htaccess 档案设定来进行 HTTP 使用者验证,或者透过HTML 表单来要求使用者输入帐号密码,并且将取得的认证资讯与文字档或者数据库中取得的资料相比对。 在下面的范例程式中,有效的使用者帐号与密码是写死在程式里面的。不过即使你把有效的帐号密码以其他方式储存(文字档或者数据库),基本的程式运作方式都是一样的。 ?/* 检查$PHP_AUTH_USER与$PHP_AUTH_PW这两个变数的值 */ if (!isset($PHP_AUTH_USER) | (!isset($PHP_AUTH_PW) /* 没有值:表示使用者尚未通过验证,送出 HTTP 表头资讯给浏览器,让浏览器显示认证对话方块 */ header(WWW-Authenticate: Basic realm=我的秘密资料); header(HTTP/1.0 401 Unauthorized); echo 您必须通过使用者认证。; exit; else if (isset($PHP_AUTH_USER) & (isset($PHP_AUTH_PW) /* 这两个变数包含某个值,检查看看是否为有效的帐号与密码 */ if ($PHP_AUTH_USER != validname) | ($PHP_AUTH_PW != goodpassword) /* 如果帐号或密码其中之一是无效的,就再度传送 HTTP 表头资讯给浏览器,让浏览器显示认证对话方块 */ header(WWW-Authenticate: Basic realm=我的秘密资料); header(HTTP/1.0 401 Unauthorized); echo 您必须通过使用者认证。; exit; else if ($PHP_AUTH_USER = validname) | ($PHP_AUTH_PW = goodpassword) /* 如果帐号密码两者皆正确,在页面上显示认证成功的讯息。 */ echo Youre authorized!; ? 请记住:当你使用以档案为基础的保护措施的时候,并非该目录下的所有档案都会自动受到保护。这一点对大多数人来说应该是很容易理解的,但是如果你以为在浏览器端跳出认证对话方块就等于保护某一目录下的所有档案的话,那么的确应该好好想想你的思考模式了。 整合 Java 应用程式PHP 与 JavaPHP 众多功能的另一项是它可以呼叫既有 Java 程式物件的方法(method),让程式设计师能够在 PHP 程式里面整合现有的 Java 应用程式。想像一下你要在公司里面推广 PHP,但是其他同事都说可是我们原本都用 Java 耶,这时候 PHP 这项与 Java 程式整合的功能可就大大有用了! 要使用 PHP 的这项功能,你的服务器上面必须先安装好 Java 虚拟机器(Java Virtual Machine, JVM)。如果你能够安装(或者已经安装了)Sun,Kaffe,IBM或者 Blackdown 等公司提供的 Java 开发套件(JDK)的话,一切都会好办得多。 在设定 PHP 的时候你必须加上 -with-java 设定选项,而且你还必须修改 php.ini 里面的一些设定值。php.ini 的修改请参考下面: Javajava.library.path=/path/to/libraryjava.class.path=/classpath/extension_dir=/path/to/extensions
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!