




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PHP教程,经验技巧全球超过300万个互联网网站的管理员都在使用PHP,使得它成为最为普及的服务器端脚本语言之一。其特点是运行速度快、稳定可靠、跨平台,而且是开放源代码软件。随你使用的水平不同,PHP可以很简单,也可以很复杂,可以只使用它发送HTML表格元素,还可以在PHP应用程序中集成Java和XML。 如果你对PHP有一定的了解或者看过一些初步的教材,这些技巧可以扩展你对PHP的认识,使你掌握一些常见的和高级的PHP功能。 一、把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/apacheversion,现在已经设置了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 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 Youve been here $count times.; 全部的访问计数器代码如下所示: ? session_start(); session_register(count); $count+; echo Youve 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 ; ? 然后你就得到了一个关于用户爱好的清单。 对话变量不能被查询字符串覆盖,也就是说我们不能输入/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函数。例如: Something a lot of content 另一方面,我经常在文件的开始使用include()来控制许多的函数: Something a lot of content 下一个问题就该是“include和require文件在哪里?”,对这个问题简单的回答是,“系统中的任意地方。”如果你的代码中包含有带有用户名和口令的数据库连接,你肯定不会将它们都放在文档根目录中向所有的人都开放。 included或required文件可以在系统上的任何地方,只要PHP运行的系统上的用户可以访问这些文件即可,你可以使这些文件具有任何后缀,或者不使用后缀。 使用include()和require()对在网站中的元素进行具体化是一种普遍的现象,并在需要对网站升级时,给你带来很大的方便。 四、PHP和文件系统的维护 PHP中有许多与文件系统有关的函数,这些函数不仅可以打开文件,还可以显示目录中的内容、移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器。 关于文件路径的解释:在Windows中,可以在路径中使用/和符号,而在其他的操作系统中只能使用/符号。出于一致性的缘故,我们统一使用/符号。 下面的脚本样例可以显示一个目录清单,注释已经包含在代码中: ? /*把要读取的目录的全路径名存入一个名字为$dir_name的变量中。 */ $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); ? Directory Listing Files in: 好了,我们已经得到了一个目录清单。需要注意的是,要读取一个文件(稍后我们将进行讲解)或目录的内容,PHP运行的系统上的用户必须至少有读取文件的权限。 下面是一个如何拷贝文件的例子: 这个例子是一个文件备份系统的原型。在这段脚本运行时,它把文件拷贝到一个不同的位置进行保存。稍微修改一下守护程序,就可以在一天中你指定的时刻执行它,而无需用户的干预。 假定你在系统上安装了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的值改为Mary,就会得到“Youve found it!”的信息,因为Mary是$namesArray数组中的一个元素。 如果要对一个数组中的元素个数进行计数,只要简单地使用count()函数即可: 返回的$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类型的头部: 这样,创建图像的全部代码如下所示: 如果把这个脚本文件保存为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)。 如果把这一小段脚本保存为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 Youre authorized!; ? 需要注意的是,如果你使用的是基于文件的保护机制,它并不能保证目录中所有的文件的安全。它可能保护大部分的文件,如果你认为它能够保护给定目录中的所有文件,你的这种认识就需要变变了。 八、PHP和COM 如果你喜欢冒险,并且在Windows上运行CGI、ISAPI或Apache模块版本的PHP,就可以访问COM的函数。好了,详细解释COM的工作就交给微软和许多大部头的书了,为了能简单地了解一下COM的功能,下面是一小段常见的脚本。 这一段PHP脚本在后端启动微软的字处理Word,打开一个新的文档,输入一些文字,保存文档,并关闭Word。 Version; / 把它的可见性设置为0(假),如果要使它在最前端打开,使用1(真) / to open the application in the forefront, use 1 (true) $word-Visible = 0; / 在Word中创建新的文档 $word-Documen
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽淮南市招考村级后备干部81人模拟试卷有答案详解
- 2025年新工艺生产的过氧化异丙苯(DCP)项目申请报告
- 爱心午餐:传递温暖的社会实践演讲稿6篇
- 2025金华金开招商招才服务集团有限公司招聘5人考前自测高频考点模拟试题附答案详解(考试直接用)
- 特定领域特定领域承诺书9篇
- 2025年济柴动力有限公司春季高校毕业生招聘(10人)考前自测高频考点模拟试题(含答案详解)
- 山间清泉流淌的画面描写10篇
- 2025广西百色西林县地方志编纂服务中心公开招聘1人考前自测高频考点模拟试题及答案详解(典优)
- 山西省阳泉市2024-2025学年高一下学期期末地理试题(解析版)
- 2025-2026学年四川省巴中市南江县某中学高二上学期入学考试英语试卷(解析版)
- 2025年无线电装接工(中级)职业技能考试题(附答案)
- 2024年秋季新北师大版七年级上册数学全册教案设计
- 2025年地磅租赁合同协议样本
- 2018天成消防B-TG-TC5000火灾报警控制器消防联动控制器安装使用说明书
- (高清版)DB32∕T 4443-2023 罐区内在役危险化学品(常低压)储罐管理规范
- 医院培训课件:《输液泵》
- 量子通信金融应用研究报告
- DBJ51-T 184-2021 四川省预成孔植桩技术标准
- 科技创新园区租赁合同样本
- 2024建筑工程数字化交付技术标准
- 经济职业技术学院教务教学管理制度汇编(2024年)
评论
0/150
提交评论