2006年9月24日星期日
第三节 MySQL 应用
1、Apache、PHP 与 MySQL 的完美组合
目前在开发动态网站时,使用 Apache+PHP+MySQL 的组合是最受欢迎的方式,它们能够满足绝大部分应用场合的需要。
同时管理好 Apache、PHP 和 MySQL 三者并不轻松,好在前面已经将 Apache和 PHP 配置好了,现在可以将精力全部集中在 MySQL 上。PHP 通过它的一个扩展模块来提供对 MySQL 数据的支持,该模块的 RPM 软件包 php-mysql-4.2.2-17.i386.rpm 放在 Red Hat Linux AS 4 的第二张安装光盘上,可以在命令行方式下执行下面的命令进行安装:
[root@kevin ~]#mount /dev/cdrom /mnt/cdrom/
[root@kevin ~]#cd /mnt/cdrom/RedHat/RPMS/
[root@kevin RPMS]#rpm -Uvh php-4.2.2-17.i386.rpm
还记得 info.php 那个 PHP 脚本吧,打开你的浏览器并查看它,从中找到与MySQL 相关的配置信息。如果能够成功看到 MySQL 模块的配置参数,那么 PHP 引擎就已经可以支持 MySQL 数据库了!
现在可以在网站的文档根目录 /var/www/html/ 中创建如下的 PHP 脚本address.php 了。该脚本从 address 数据库中检索出 friend 表中的所有记录,并将其显示出来。
打开浏览器来测试一下吧。
Apache、PHP 和 MySQL 三者的结合为动态网站的开发提供了一个很好的解决方案,小到留言簿,大到网上商城,随时随地都不难发现它们的用武之地。作为Linux 系统管理员的你是不是已经打算在自己的网站上采用这一黄金组合了?
第二节 管理 MySQL
1、安装 MySQL
由于 MySQL 实在是太受欢迎了,因此许多 Linux 发行版都自带了 MySQL 服务器。对于 Red Hat Linux AS 4,只需在安装时选择『SQL数据库服务器』套件中的『mysql-server』就可以安装它了。如果暂时还不清楚当前 Linux 系统中是否安装了 MySQL 软件包,可以在命令行方式下用 rpm 命令查询一下:
[root@kevin ~]#rpm -qagrep mysql
mysql-server-3.23.54a-11 (# MySQL服务器软件)
mysql-3.23.54a-11 (# MySQL客户端工具)
mysql-devel-3.23.54a-11 (# MySQL开发包)
如果没有看到如上的输出信息,则表明在安装 Red Hat Linux AS 4 时,没有选择 MySQL 服务器套件。不要着急,还是按老办法用 root 身份登录 KDE,然后单击 KDE 主菜单,从『系统设置』菜单项下选择『添加/删除应用程序』命令,当『软件包管理』窗口打开之后,在『服务器』区域中将『SQL数据库服务器』套件选中,如图 7-2-1 所示。
由于 MySQ L是一个可选的软件包,所以应该单击右侧的『细节』按钮,打开『SQL Database Server软件包细节』窗口,在『额外软件包』区域中将『mysql-server』项先中,如图 7-2-2 所示。
选择好要安装的软件包后,单击『软件包管理』窗口中的『更新』按钮,然后再按照提示插入安装光盘就可以完成 MySQL 软件包的安装了。
2、启动 MySQL
MySQL 服务器软件包总算是安装好了,不过在正式启动 MySQL 之前,还得先完成另外一项初始化工作,那就是建立 MySQL 的授权访问表。具体的做法是在命令行方式下执行 MySQL 软件包提供的 mysql_install_db 命令:
[root@kevin ~]#mysql_install_db
默认情况下,mysql_install_db 命令负责为 MySQL 服务器在/var/lib/mysql/目录下建立两个数据库:mysql 和 test(在Webmin中启动MySQL时,这两文件如果此时不存在,则也将自动生成),其中 mysql 中包含了 MySQL 运行时所依赖的基本信息,而 test 则仅仅用于测试目的。请注意妥善保护好 mysql,因为它包含了六个对 MySQL 数据库系统来说非常重要的表:user、db、host、tables_priv、columns_priv 和 func。
好了,现在就可以启动 MySQL 服务器了。打开浏览器并登录 Webmin 后,单击『服务』图标,进入服务管理页面,如图 7-2-3 所示。
单击『MySQL数据库服务器』图标,进入『MySQL数据库服务器』页面,如果此时尚未启动 MySQL 服务器,就可以通过单击『启动MySQL服务器』按钮来启动它,如图 7-2-4 所示。
MySQL 数据库服务器正常启动后,就可以在 Webmin 中对其进行管理了。在『MySQL数据库』区域中可以看到 mysql_install_db 命令生成的两个数据库,而『全局选项』区域则用来对各种权限进行管理。如果想停止 MySQL 服务器,可以单击页面底部的『停止服务器』按钮,如图 7-2-5 所示。
如果当前的 Linux 系统是专门作为数据库服务器使用,那就要将其设置成开机时自动启动。首先单击 Webmin 的『系统』图标,进入系统管理页面,然后单击『引导和关机』图标,打开『引导和关机』页面,在列表中找到 MySQL 服务,如图7-2-6 所示。
单击『mysqld』链接,进入『编辑操作』页面。在『引导时启动』区域中选择『是』单选框,就可以在系统启动时自动控制运行 MySQL 服务器了,如图 7-2-7所示。
MySQL 服务器的确已经启动了,可是怎么知道它是否正常工作了?所以还得先测试一下。对 MySQL 服务器的测试可以按下面的三个步骤进行。
步骤一:证实服务器正常运行
MySQL 服务器软件包中有一个管理程序 mysqladmin,使用它可以测试 MySQL服务器当前运行状态。
[root@kevin ~]#mysqladmin status
Uptime: 2128 Threads: 1 Questions: 7 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 0 Queries per second avg: 0.003
输出信息的个体含义如下:
Threads:与 mysqld 相互作用的线程数
Questions:mysqld 执行的 SQL 查询数
Slow queries:超过 long_query_time(mysqld的一个配置参数)的查询数
Opens:自从启动以来,mysqld 打开的表数
Flush tables:执行刷新、重载、更新命令的次数
Open tables:mysqld 当前打开的表数
如果当前 MySQL 服务器无法正常工作,那么将看到类似下面的输出信息:
[root@kevin ~]#mysqladmin status mysqladmin: connect to server at 'localhost' failed ......
步骤二:证实服务器可关闭
一个运行良好的 MySQL 服务器不仅可以正常启动,还应该在需要时可以被顺利关闭。执行下面的命令可以测试 MySQL 服务器是否能够被正常关闭:
[root@kevin ~]#mysqladmin shutdown
MySQL 服务器关闭之后,可以用下面的命令查看 MySQL 是否被关闭了:
[root@kevin ~]#mysqladmin ping
mysqladmin:connect to server at "localhost" failed
errot: 'can't connect to local MySQL server through sochet'/var/lob/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket:'/var/lob/mysql/mysql.sock' exits!
步骤三:功能测试
重新启动 MySQL 服务器后,就可以对其进行功能性测试了。首先用 mysqlshow命令查看 MySQL 服务器中现有的数据库:
[root@kevin ~]#mysqlshow
数据库 mysql 和 test 是 mysql_install_db 命令在进行数据库初始化时所建立的。关系型数据库是由二维表格组成的,如果想知道数据库 mysql 中所包含的表,同样可以用 mysqlshow 命令:
[root@kevin ~]#mysqlshow mysql
最能说明问题的当然还是用 SQL,直接同 MySQL 数据库服务器对话了。没问题,只要使用 mysql 命令就可以达到目的了:
[root@kevin ~]#mysql -e "SELECT host,db,user FROM db" mysql
如果 MySQL 服务器能够顺利通过以上严格的测试,那就说明它的确已经准备好,下面就可以放心的使用了。
3、数据库管理
既然 MySQL 是一个数据库系统,那管理员的任务自然就是管理好大大小小的各个数据库了。使用 mysqladmin 命令或者通过 mysql 这一客户端工具来执行 SQL语句都可以对 MySQL 数据库进行管理,但更便捷的方法仍是使用 Webmin。在『MySQL 数据库服务器』页面的『MySQL数据库』区域中,可以很方便地对数据库进行管理,如图 7-2-11 所示。
如果要创建一个新的数据库,可以先单击『创建新的数据库』链接,进入『创建数据库』页面,然后在『数据库名』文本框中输入要创建的数据库名称,再单击『新建』按钮就可以了,如图 7-2-12 所示。
数据库创建成功之后,就可以在『MySQL数据库服务器』页面中找到它所对应的图标了,如图 7-2-13 所示。之后再对该数据进行的任何操作,就都可以通过它来完成。
单击刚刚创建的数据库所对应的图标,进入『编辑数据库』页面。有创建当然就有删除了,单击『删除数据库』按钮可以将该数据库删除,如图 7-2-14 所示。注意,删除数据库意味着将丢失其中的所有数据,所以千万三思而后行。
数据库的职责是对数据进行有效的管理,将所有的数据都一古脑儿堆放在数据库里可不是修好办法,必须分门另类进行恰当的组织,才不至于需要时找不到。关系型数据库组织数据的方法是使用二维表格,除了创建数据库之外,管理员还得在数据库中维护一些真正用来存放数据的表格,之后才能利用数据库来存放自己的数据。
要在数据库中创建一个表,首先在『编辑数据库』页面中的『字段』文本框中输入所要创建的表格列数,然后单击『新建一个表』按钮来创建表格,如图 7-2-15 所示。
进入『创建表』页面后,首先在『表名』文本框中输入表格的名称,然后在『初始字段』区域为表格中的各个字段设置恰当的属性,最后单击『新建』按钮,在当前数据库中创建一个表,如图 7-2-16 所示。
使用 Webmin 来管理数据库中的表也很简单,在『编辑数据库』页面中不难找到新创建的表所对应的图标,如图 7-2-17 所示。通过它可以很方便地修改数据表的各种属性。
单击表格对应的图标,进入『编辑数据表』页面,数据表中各个列的属性在这里都可以看到,如图 7-2-18 所示。需要时可以对表中字段的名称、属性等进行修改。
单击要修改的字段所对应的链接,进入『修改字段』页面,此时可以重新设置字段名或数据类型,另外还可能指定该字段是否允许空值,是否对大小写敏感等,如图 7-2-19 所示。字段属性设置好后,单击『保存』按钮即可。
在修改数据库中的表时,如果改变了字段的数据类型,可能将导致数据的丢失,所以最好在建表时就确定好整个表的结构,不到万不得已最好不要对数据表的结构进行修改。
MySQL 允许你在创建数据表之后,再为其添加额外的字段,如果一开始设计数据表时没有考虑周到,这一功能可就帮上大忙了。在『编辑数据表』页面中的类型下拉框中为要添加的字段选择好数据类型,然后单击『增加字段,类型为』按钮,就可以为数据表添加一个新的字段,如图 7-2-20 所示。
此时将进入『增加字段』页面,在『字段参数』区域中设置好字段的名称、类型宽度、缺省值、主键等属性后,如图 7-2-21 所示,单击『新建』按钮,一个新的字段就被添加到数据表中了。
现在数据库创建好了,数据库中的表结构也已经定义好了,下面自然就是往表中添加数据了,这才是真正应该关心的东西。单击『编辑数据表』页面中的『查看数据』按钮,打开『表数据』页面,由于还没有往数据库里添加任何数据,所以当然是什么也没有了,如图 7-2-22 所示。
单击『增加行』按钮,打开『表数据』页面。在为数据表中的各个安段输入恰当的值后,单击『保存』按钮,就可以入数据表中添加一条记录,如图 7-2-23 所示。
以前的 MySQL 数据库管理员只能通过命令行的方式,或者编写相应的程序才能完成对数据库的操作,实现记录的添加、修改和删除。现在有了 Webmin 的帮助可就好多了,只需在『表数据』页面中选择所要修改或删除的记录,然后单击『编辑选择的行』或『删除选择的行』,就可以轻轻松松完成对表格的管理,如图7-2-24 所示。很显然,Webmin 将数据库管理员从冗长的 SQL 语句中解放出来了。
有经验的数据库管理员总会在必要时对数据库进行备份,也就是将数据库中所有信息保存下来,这样如果数据库发生意外时,就不至于手足无措了。单击『表数据』页面底部的『回到数据表列表』链接,返回到『编辑数据库』页面,现在单击『Backup Database』按钮就可以对数据库进行备份,如图 7-2-25 所示。
此时将进入『Backup Database』页面,首先在『Database backup options』区域中的『Backup to file』文本框中输入用来保存备份的文件路径,然后在『Add drop table statements to backup』区域中选择『是』单先框,再单击『Backup Now』按钮就可以完成数据库的备份,如图 7-2-26 所示。
完成对数据库的备份后,管理员就可以高枕无忧了,因为即使数据库遭到毁灭性的破坏,也可以将其瞬间恢复过来,所以千万注意要保护好数据库备份文件(备份文件最好备份到其它的机器、硬盘、光盘可磁带机上)。在『编辑数据库』页面中虽然找不到专门用来恢复数据库的按钮,但单击『执行SQL』按钮可以开始数据库的恢复操作,如图 7-2-27 所示。
此时将进入『执行SQL』页面,在『Select SQL commands file to cxecute on database address』区域中选择『From local file』单选框,然后在随后的文本框中输入数据库备份文件所在的路径,再单击『执行』按钮就可以完成数据库的恢复。
4、权限管理
在数据库中存放的数据往往都是很重要的,如果任何人都可以随意对它进行修改,那将造成严重的后果。正因如此,权限管理是数据管理员日常工作的重中之重。MySQL 数据库服务器的存取管理功能非常强大,而且比 PostgreSQL 要灵活的多。
MySQL 主要是通过用户连接数据库时的身份认证和对数据库操作时的权限设置,来完成对数据库的保护。在『MySQL数据库服务器』页面的『全局选项』区域中,可以对 MySQL 支持的各种权限进行管理,如图 7-2-29 所示。
单击『用户权限』图标,进入『用户权限』页面,在这里可以对 MySQL 用户进行管理。首先要注意的是,MySQL 用户和 Linux 系统用户之间没有任何联系。初始时 MySQL 服务器中只有两个用户:root 和匿名用户,它们都是由mysql_install_db 命令创建的,如图 7-2-30 所示。
MySQL 服务器的 root 用户具有最高的控制权,但没有密码,并且只能从本机登录。匿名用户对地址数据库或以“test_”开头的数据库具有完全的控制权,但无权访问其它数据库。
要添加 MySQL 用户,可以单击『用户权限』页面中的『创建新用户』链接,进入『创建用户』页面。在『MySQL用户详情』区域中设置好用户名、口令、主机和权限后,单击『保存』按钮就可以添加一个新的 MySQL 用户,如图 7-2-31 所示。
在『主机』区域中应该输入允许用户从哪些主机登录 MySQL 服务器,可以是IP 地址或域名。如果允许多个地址,则可以使用通配符%,如 218.168.100.% 和%.mylinux.org。
表 7-2-1 列出了可以被 MySQL 支持的权限,管理员的职责就是为用户分配恰当的权限。
表 7-2-1 用户权限
权限 范围 描述
SELECT 表 允许用户在表上执行选择操作
INSERT 表 允许用户在表上执行插入操作
UPDATE 表 允许用户在表上执行更新操作
DELETE 表 允许用户在表上执行删除操作
INDEX 表 允许用户创建和删除表索引
ALTER 表 允许用户在表上执行 ALTERE 命令
CREATE 数据库、表或索引 允许用户创建新的数据库或表
DROP 数据库或表 允许用户删除现有的数据库或表
GRANT 数据库或表 允许用户将自己的权限再赋予其它用户
RELOAD 服务器管理 允许用户执行 mysqladmin 的下列命令:
reload、refresh、flush-privileges、
flush-hosts、flush-logs、flush-tables
SHUTOWN 服务器管理 允许用户执行 mysqladmin 的 shutdown 命令,
关闭 MySQL 服务器
PROCESS 服务器管理 允许用户执行 mysqladmin 的 processlist 和
shutdown 命令管理 MySQL 进程
FILE 访问服务器文件 允许用户读写 MySQL 服务器上的文件
为 MySQL 用户赋予恰当的权限是很有讲究的,一般只允许管理员才有权关闭数据库、刷新权限表等。普通用户则只拥有 SELECT、INSERT、DELETE 和 UPDATE 权限,管理员应该为他们赋予尽可能少的权限,以免造成不必要的麻烦。
单击『用户权限』页面底部的『回到数据库列表』链接,重新回到『MySQL数据库服务器』页面,然后单击『数据库权限』图标,进入『数据库权限』页面。除了可以为用户分配恰当的权限外,MySQL 管理员还可以为每个数据库分别指定恰当的权限,如图 7-2-32 所示。根据实际需要分别为每个数据库指定恰当的权限,可以更好地保护好数据库中的数据。
单击『创建新的数据库权限』链接,进入『创建数据库』权限页面。首先在『数据库权限选项』区域的『数据库』中选择要进行权限管理的数据库,然后在『用户名』和『主机』中指定允许对数据库进行操作的 MySQL 用户和主机地址,最后在权限列表中选择恰当的权限,如图 7-2-33 所示。
在为数据库选择权限时还是同样的原则——只赋予必要的权限。在为数据库设置好权限后,单击『保存』按钮确定。
单击『数据库权限』页面底部的『回到数据库列表』链接,返回到『MySQL数据库服务器』页面,然后再单击『主机权限』图标,你就可以对允许访问 MySQL 服务器的主机进行设置了,如图 7-2-34 所示。
通过限制能够访问 MySQL 服务器的主机,可以有效地拒绝某些非法访问的请求,MySQL 默认情况下没有定义权限。
要定义新的主机权限,单击『主机权限』页面中的『创建新的主机权限』链接,进入『创建主机权限』页面。在『主机权限选项』区域中设置好允许访问的数据库、主机和权限后,再单击『保存』按钮就可以了,如图 7-2-35 所示。
通常来说,设置好用户权限、数据库权限和主机权限就可以应付绝大多数场合的需要了,但 MySQL 提供的权限管理机制还允许在表和字段一级设置权限,如图7-2-36 所示。
要为数据库中的表设置访问权限,可以单击『表权限』图标进入『表权限』页面,在下拉框中选择好表所在的数据库后,单击『在数据库中增加新权限』按钮,就可以创建新的表权限,如图 7-2-37 所示。
此时将进入『创建表权限』页面,在『表权限选项』区域的『表』、『用户名』和『主机』中指明将要被赋予访问权限的表、用户名和允许的主机后,再在『表权限』和『字段权限』中选择恰当的权限,最后单击『保存』按钮就可以创建该表权限了,如图 7-2-38 所示。
这段是数据库结构中最小的单击,MySQL 居然可以将对数据的访问权限精确到这一级别,的确令人佩服。在『MySQL数据库服务器』页面中单击『字段权限』图标,进入『字段权限』页面,在下拉框中选择好字段所在的数据表后,单击『在数据库和表中增加新权限』按钮可以创建新的字段权限,如图 7-2-39 所示。
此时将进入『创建字段权限』页面,在『字段』、『用户名』和『主机』中指明将要被赋予访问权限的表字段、用户名和允许的主机后,现从『权限』列表中为该字段选择合适的权限,最后单击『保存』按钮就可以创建该字段权限了,如图7-2-40 所示。
5、MySQL 客户端工具
管理 MySQL 客户端工具的软件有很多,笔者认为 MySQL_Front 是一款不错的软件。关于 MySQL_Front 笔者在《PHP_&_MySQL无需编程轻松创建数据库网站》一书中已做过详细介绍,如需要就查阅该书。
下载地址:http://abcmmm.googlepages.com
第七章 数据库服务
第一节 数据库系统与 SQL
做一名数据库管理员可不是一件轻松的事,成为一名优秀的数据库管理员就更难了,这是因为数据库管理涉及许多方面,要求有相当深厚的知识背景。什么是数据库?什么是数据库系统?什么是 SQL?什么是结构化查询?如果这一切都还似懂非懂,那就一起来进行一次上岗前的基本培训吧!
1、数据库系统
数据库系统简单地说就是具有数据存储与处理能力的计算机应用系统。它是一个能处理种类数据的大管家,负责对数据进行统一的保存、更新和查询。一个完整的数据库系统包含两个部分,即数据库和数据库管理系统,前者指的就是数据库中所储存的数据(通常是具有特定结构的文件),而后者则是用来处理这些数据并管理整个系统的应用程序。
虽然目前存在的数据库系统有很多种,但真正实用的还得算关系型数据库。关系型数据库以二维矩阵构成的表格来存储数据,每笔数据称为一条记录,而每条数据一般又分成多个字段。借助表格中“行”与“列”的关系,可以很轻松地获得真正所需的数据,如表 7-1-1 所示。
表 7-1-1 通讯录
Name City Telephone ID
在表 7-1-1 所示的表格中,假设要找到“kevin”所在的城市,可以由横向的“kevin”记录与纵向的“City”字段的关系相交而得。说穿了,关系型数据库就是由多个二维表格所组成的有机系统,只不过这些表格这间存在着各种各样的关系罢了。当然,这些关系可能很简单,也可能很复杂。
结构化查询语言(Structured Query Language,SQL)是目前各种关系型数据库系统采用的一种通信标准,它使得管理员可以与数据库服务器进行有效的沟通,来获得真正感兴趣的数据。可不要被 SQL 名称中的“查询”两个字给蒙蔽了,以为它只能用来查询数据,事实上对数据库的添加、删除、修改等操作,也都可以通过SQL 来完成。
SQL 最早源自 IBM 公司开发的 DB2 数据库系统,后来经美国国家标准组织(ANSI)和国际标准组织(ISO)的推动,开始被广泛地使用在关系型数据库系统之中。由于 SQL 的广泛应用,以至于许多数据库产品为了强调本身具有的 SQL 功能,都纷纷在名称中加上 SQL 几个字,最明显的莫过于 Microsoft 公司推出的 SQL Server 了。具有 SQL 执行能力的数据库系统常常被人们简称为 SQL 服务器。
Red Hat Linux AS 4 自带了两个非常优秀的 SQL 服务器:PostgreSQL 和 MySQL。
PostgreSQL 是一个优秀的对象关系型(object-relational)数据库系统,以关系型数据库的设计为基础,支持绝大多数 SQL 特性,包括子查询、事物处理以及用户自定义数据库类型等,并且是一种完全免费的数据库系统,许多 Linux 发行版都将其作为首选的 SQL 服务器。
相比之下,MySQL 是一个小型的多用户、多进程的 SQL 服务器,管理起来简单方便,因此适合于普通的应用场合,难怪许多 Linux 数据库管理员都对它情有独钟。
MySQL 目前在 Linux 操作系统上非常流行,它是一个真正意义上的多用户、多线程,并完全符合 SQL 标准的关系型数据库服务器。它提供了一个很好的客户机/服务器解决方案,不仅包含基本的服务器和客户机软件,还提供了 Perl 等语言的接口和用于 Windows 平台的 ODBC 驱动程序。MySQL 的最大魅力在于它是免费的自由软件,能和其它重量级的自由软件如 Apache 服务器、PHP 动态页面编程语言等紧密结合,从而成为架设动态网站的黄金组合。
MySQL 最主要的特点是快速、健壮、易用,其目标是提供一个在普通的硬件设备上能快速处理海量数据的 SQL 服务器。MySQL 依赖的是一组经过多年严格测试的程序,虽然它们仍处在发展阶段,但已经是一个能提供丰富功能的实用系统了。曾经有人使用 MySQL 处理了 10,000 个表格,其中有 500 个表格存有超过 700 万条的记录,数据总量达到 100GB,这对一个免费的 SQL 服务器软件来讲是非常难得的。
尽管 MySQL 还有一些 SQL 的高级特性没有实现,但在一般应用场合下,特别是在那些速度要求很快但功能要求不是很高的 Web 应用中,MySQL 可以算是最佳的选择。
2006年9月23日星期六
第四节 动态网站的开发
1、认识 PHP
早期 WWW 服务器所使用的 HTML 语言功能十分有限,只能描述简单的内容,难以进行复杂的信息处理,尤其是无法满足 Web 数据库的处理要求。为此人们绞尽脑汁想了很多解决办法,其中 SSI(Server Side Include)技术在目前被认为是一种较好的解决方案。
SSI 说得简单些其实只是一种 WWW 服务器可以识别和理解的脚本,通常将其嵌入到 HTML 页面中,当客户端浏览器在请求这种特殊的网页时,WWW 服务器会对SSI 脚本进行解释,执行相应的动作,并将执行结果输出到最后返回给浏览器的HTML 页面中,从而实现动态效果。
举个简单的例子帮助理解一下,当你登录某个网站时,位于 WWW 服务器端的一段代码 SSI 脚本被激活,它首先获得系统当前时间,然后根据结果判断出现在是上午、下午或者晚上,最后依据判断结果动态生成 HTML 页面给客户端浏览器。这就不难解释为什么你在一天中的不同时刻访问一些网站时,会看到诸如“早上好”、“下午好”、“晚上好”这样不同的欢迎信息。
实现 SSI 的方式有很多种,PHP 是在 Linux 平台下较为流行的一种,其功能十分强大,许多大型的商业网站都是采用 PHP 开发的。PHP 早期的版本只是一个简单的个人主页制作工具,仅包括一个可以解释几条指令的分析引擎和一组用于信息反馈的工具(如留言簿、计算器等)。1995年,PHP 创始人 Rasmus 重写了整个解释器,将个人主页工具、表单集成工具组合在一起,并加入了对 mSQL 数据库的支持,这样就有了 PHP/FI2.0。
到了1997年,PHP 从作者的个人爱好成功地转变为一个有组织的集体活动,整个解释器被重写,形成了 PHP3 的雏形,此时已经有大量的商业化产品(如C2的StrongHold Web Server)开始捆绑 PHP/FI 或 PHP3。
当 PHP3 在自由发展的同时,Zend 公司重写了 PHP 的核心引擎,大大提高了PHP3 的执行效率,这就是现在仍广泛使用的 PHP4。经过优化的 PHP4 执行速度更快,一点也不比传统的 CGI 或 Microsoft 的 ASP 差,更重要的是它还有更多更好的新功能和更丰富的函数库。无论你接不接受,PHP 无疑都将在 CGI 领域中掀起一场新的革命。好了,现在我们就一起开始 PHP 这段愉快的旅程吧。
PHP 实际上是一种解释性的程序设计语言,虽然也能够作为一门单独的语言使用,但更深常见的做法还是将其嵌入到 HTML 网页中,作为开发动态网站的一种方法。下面是一个最简单的 PHP 脚本 test.php:
上页的 PHP 脚本中只有几行有用,其它的都是标准的 HTML 语法。PHP 中的echo 函数类似于 C 语言中的 printf 函数,用于内容的输出,Apache 负责截取PHP 输出信息,并将其插入到 HTML 页面中,这就是 PHP 能够产生动态页面的基本方法。脚本 test.php 经 Apache 处理后将变成类似如下的 HTML 页面:
客户端浏览器负责将最终生成的 HTML 页面显示出来,如图 6-4-1 所示。由于PHP 代码的解释和执行是在 Apache 服务器上完成的,因此客户端浏览器只要能处理普通的 HTML 页面就可以了。
2、搭建 PHP 运行环境
Apache 和 PHP 简直可以算得上是天作之合。一方面 PHP 可以扩充 Apache 的功能,使其具备了动态能力,而另一方面 Apache 又为 PHP 提供了良好的运行环境,令它的功能可以得到最充分的发挥。不过为了让 Apache 能够支持 PHP,首先还得做些配置才可以。
由于 PHP 的应用范围越来越广,许多 Linux 发行版本都自带了 PHP 软件包,Red Hat Linux AS 4 使用的是 PHP4.2.2,在命令行方式下用 rpm 命令可以查看是否已经安装了 PHP:
[root@kevin ~]#rpm -qa php
php-4.2.2-17 (# 已经安装了PHP)
如果没有看到任何输出信息,则表明在安装 Red Hat Linux AS 4 时,可能忘记选择 PHP 软件包了。现在需要以 root 用户的身份登录 KDE,然后单击 KDE 主菜单,从『系统设置』菜单下选择『添加/删除应用程序』命令。当『软件包管理』窗口打开后,在『服务器』区域中将『万维网服务器』套件选中,如图 6-4-2 所示。
由于 PHP 只是一个可选的软件包,所以应该单击右侧的『细节』按钮,打开『WebServer 软件包细节』窗口,在『额外软件包』区域中将『php』项选中,如图6-4-3 所示。
选择好要安装的软件包后,单击『软件包管理』窗口中的『更新』按钮,然后按照提示插入安装光盘,就可以完成 PHP 软件包的安装了。
安装好 PHP 后,还需要对 Apache 服务器进行相应的配置,使得两者能协调一致地工作。打开浏览器并登录 Webmin 后单击『服务』→『Apache服务器』,打开『Apache WEB 服务器』页面。由于 PHP 是作为 Apache 中的一个模块动态加载的,因此需要先对 Apache 模块进行配置,如图 6-4-4 所示。
单击『Apache模块』图标,进入配置页面,在『活动模块』列表中确保mod_php4 模块已被选中,如图 6-4-5 所示。
如果找不到该模块,可能需要在『Apache WEB 服务器』页面中单击『重新配置已知的模块』图标,进入『重新配置已知的模块』页面,对 Webmin 支持的Apache 模块进行重新配置。
配置好 Apache 服务器加载的 PHP 模块后,单击『保存』按钮,退回到『Apache WEB 服务器』页面。为了让 Apache 能够通过文件扩展名识别出哪些文件中包含了 PHP 脚本,需要为其添加特定的 MIME 类型。在『Apache WEB 服务器』页面的『虚拟服务器』区域中单击『缺省服务器』图标,进入『虚拟服务器选项』页面,在这里可以对 Apache 服务器支持的 MIME 类型进行管理,如图 6-4-6 所示。
单击『MIME类型』图标进入『MIME类型』页面后,首先在『扩展MIME类型』文本框中输入为 PHP 专门定义的 MIME 类型 application/x-httpd-php,然后在『扩展』文本框中为 Apache 服务器指明以哪些扩展名结束的文件将使用 PHP 引擎进行处理,可以为同一种 MIME 类型指定多个与这对应的扩展名,如图 6-4-7 所示。设置好 MIME 类型对应的扩展名后,单击『保存』按钮确定。
好了,重新启动 Apache 服务器吧,现在应该可以处理 PHP 脚本了。可以将前面介绍的那个 test.php 脚本复制到 /var/www/html/ 目录下,然后通过访问http://www.mylinux.org/test.php 来测试一下 PHP 模块的正确性。不过还有一种更好也更全面的测试方法,那就是在 /var/www/html/ 目录下生成一个内容如下的info.php 脚本:
在浏览器中访问该脚本,如果 PHP 模块能正常工作,可以从中获得 PHP 模块运行时的各种信息。
3、用 PHP 开发动态网站
许多网站现在都有计数器功能,用于记录一共有多少人访问了该网站。用 PHP实现这一功能十分简单,从中不难领略到 PHP 的迷人魅力。计数器的原理说起来其实很简单:当用户浏览网页时,服务器程序从文件中读取该页面被访问的次数,将添加1后显示给该用户,然后再将新的计数登值存回到文件中。
首先在 /var/www/html/ 目录下生成一个内容如下的 counter.php 文件:
将 PHP 语句加入到 HTML 文件中有以下几种方法:
第一、
第二、
第三、echo"嵌入PHP语句"
第四、<% echo "嵌入PHP语句" %>
其中第一种和第二种是最常用的方法,即在小于符号后加上问号,然后可加可不加“php”,之后就是 PHP 的程序代码,在 PHP 代码结束后,再加入问号及大于号就可以了。第三种写法对熟悉 JavaScript 的用户来说有相当的亲切感。而那些从 Windows 平台下的 ASP 转向 Linux 平台下的 PHP 用户来说,对第四种写法肯定有种似曾相识的感觉。
编写 PHP 程序最好的方法是先处理纯 HTML 格式的静态页面,然后在需要动态处理的地方插入 PHP 语句,这样开发时可以达到事半功倍的效果。
上述 PHP 计数器程序的核心是 displayCounter 函数。它首先调用 fopen 函数打开保存了计数值的文件,然后从中读出当前的计数值,并将其加1后作为新的计数值显示给当前浏览网页的用户,最后通过 exec 函数执行两条 Linux 命令将新的计数值写入到文件中。
在浏览器中查看该 PHP 文件时,你将看到该段代码为你统计出来的访问次数。
PHP 语法简单、功能强大,是开发动态网站的得力助手,相信你在实际应用中会慢慢喜欢上它的。虽然 Perl、Python、ASP、JSP 等服务器端脚本语言导出不穷,但如果愿意留一次机会给 PHP,它将不会让你失望的。
第三节 授权访问
1、基于主机的授权
Apache 服务器的授权访问功能需要 mod_auth 和 mod_auth_dbm 两个模块的支持。在 Webmin 中单击『服务』图标,进入服务器管理页面,然后单击『Apache服务器』图标,进入『Apache WEB 服务器』页面,在这里可以对 Apache 服务器加载的模块进行管理,如图 6-3-1 所示。
单击『Apache模块』图标,进入『Apache模块』页,在活动模块列表中将mod_auth 和 mod_auth_dbm 两个模块均选中,如图 6-3-2 所示。
配置好 Apache 服务器动态加载的模块后,单击『保存』按钮,返回『ApacheWEB 服务器』页面。下面先来介绍基于主机的授权访问方式。
假设 www.mylinux.org 网站中有一个 /var/www/secret/ 目录,接着来看如何通过授权来限制用户对该资源的访问。由于是要对 www.mylinux.org 这一虚拟主机进行管理,因此应该在『Apache WEB 服务器』页面中的『虚拟服务器』区域中单击该虚拟主机对应的图标,如图 6-3-3 所示。
进入『虚拟服务器选项』页面后,从『创建目录、文件或目录选项』区域中的『类型』下拉框中,选择『Directory』项,并在『路径』文本框中输入要进行设置的目录“/var/www/secret”,然后单击『新建』按钮创建这一目录,如图 6-3-4所示。注意此时指定目录只是将其纳入 Apache 的管理,但该目录必须事先已经在磁盘上存在了。
新目录创建后,就可以在『按目录选项』区域中找到该目录对应的图标了,如图 6-3-5 所示。
对目录的配置与缺省服务器类似。单击该目录对应的图标,进入『按目录选项』页面。在这里可以对该目录的所有属性进行配置,其中就包括对目录访问权限的控制,如图 6-3-6 所示。
单击『访问控制』图标,进入『访问控制』页面。如果想让 IP 地址为218.168.100.5 的机器访问该目录,可能先在『约束访问』区域的『动作』列中选择『Allow』项,然后在『条件』列中选择『从IP请求』项,最后在随后的文本框中输入允许访问的 IP 地址,如图 6-3-7 所示。
单击『保存』按钮并重新回到『访问控制』页面后,就又可以在『约束访问』区域中指定其它的约束规则了。例如从『动作』列中选择『Deny』项,并从『条件』列中选择『从网络/掩码请求』项,然后在后面的文本框中输入“218.168.100.0/255.255.255.0”,可以限制子网 218.168.100 中所有主机对该目录的访问,如图 6-3-8 所示。
也许你已经注意到了,第一条访问规则允许 IP 地址为 218.168.100.5 的主机访问该目录,而第二条访问规则又拒绝 218.168.100 子网中的所有主机访问该目录,这岂不是自相矛盾吗?
单击『访问控制』页面底部的『保存』按钮,回到『按目录选项』页面后单击『文档选项』图标,进入『文档选项』页面。除了指定该目录能被哪些主机访问之外,还应该在『目录选项』中为其指定正确的操作选项,如图 6-3-10 所示。注意,若不想使用缺省值,应该将『已选择以下』单选框选中。
设置好文档目录选项后,单击『保存』按钮返回到『按目录选项』页面,然后单击页面底部的『回到服务器索引』链接,返回『虚拟服务器选项』页面,为了使用户能够更好的访问 /var/www/secret 目录,可以为它指定一个别名,如图 6-3-11 所示。
单击『别名和重定向』图标,进入『别名和重定向』页面。分别在『文档目录别名』区域中的『From』和『To』文本框中输入“/secret/”和“/var/www/secret/”,然后单击页面底部的『保存』按钮,就可以为/var/www/secret/ 目录指定一个别名 /secret/,如图 6-3-12 所示。
回到『虚拟服务器选项』页面后,单击『应用更改』链接,使新的设置值生效。在放置一些将被访问的资源到 /var/www/secret/ 目录下后,就可以进行授权访问的测试了。当从 IP 地址为 218.168.100.5 的主机通过http://www/mylinux.org/secret/ 来访问这些资源时,将看到资源列表。
但如果是从其它机器访问时,由于缺乏相应的权限,将无法浏览到该目录下的资源。
基于主机的授权方式难以满足具有较高安全要求的场合,因为即使是一个很蹩脚的初级黑客也完全有能力仿造一个假的 IP 地址,因此有时就不得不考虑基于用户的认证方式。
事实上,基于主机的授权方式和基于用户的认证方式并非是截然分开的。当用户访问 Apache 服务器的某个目录时,Apache 会先根据配置文件 httpd.conf 中Directory 的设置,来决定是否允许用户访问该目录。如果允许,则 Apache 还会继续查找该目录或其父目录中是否存在“.httpd.conf”文件,以决定是否要对用户进行身份认证。
正是因为“.httpd.conf”文件在基于用户的认证方式中起着很重要的作用,所以首先要做的事情就是在要进行身份认证的目录下生成该文件。假设要让用户必须通过身份认证后才能访问 /var/www/secret/ 目录下的资源,就应该先创建/var/www/secret/.httpd.conf 文件。虽然使用普通的文本编辑器也能手工生成该文件,但使用 Webmin 将更方便些。
单击『按目录选项文件』图标,进入『按目录选项文件』页面。接着单击『创建选项文件』右侧的『...』按钮,打开『选择文件』窗口,从中选择要为其创建“.httpd.conf”文件的目录,如图 6-3-14 所示。
选择好要进行认证的目录后,单击『创建选项文件』按钮,Webmin 就会在该目录下生成一个“.httpd.conf”文件,同时打开『按目录选项』页面。在这里可以对该文件的内容进行编辑和管理,如图 6-3-15 所示。
文件“.httpd.conf”由一系列 Apache 指令组成。那些对这些指令早就一清二楚的资深 Apache 管理员可以很轻松地使用自己熟悉的编辑器,手工修改这些文件,但对于连这些指令是什么都还不知道的初学者来说 Webmin 的确是个不错的跳板,它可以帮助你很快成为一名合格的 Apache 管理员。单击『显示指令』图标,进入『指令』页面,在『编辑Apache指令』按钮旁边的下拉框中,可以找到所有的Apache 指令,如图 6-3-16 所示。
Apache 提供的指令虽然多,但常用的也就那么几条,而且 Webmin 还提供了很好的配置界面。从 Apache 指令下拉框中选择『AuthName』指令,然后单击『编辑Apache指令』按钮,进入『访问控制』页面。可以在『认证真名』文本框中输入一个字符串作为提示信息。浏览器访问该目录时,弹出的登录提示对话框中将显示该字符串。
在『认证类型』下拉框中,可以选择进行身份认证的方式。Apache 目前提供两种认证方式:Basic(基本认证)和 Digest(简要认证)。一般使用 Basic 方式,但使用方 Digest 方式会更安全一些。
在『登录约束的访问』区域中,可以指明只允许某些特定的用户或者组登录,当然也可以允许所有的合法用户登录。注意此外的用户和组指的都是 Apache 服务器自己维护的用户和组,他们同 Linux 系统的用户和组可以没有任何瓜葛。
Apache 服务器自身维护了一个用户和组列表,同样也有用户密码文件和组文件。这两个文件存放的位置可以由你在『文本文件认证』区域中任意指定。出于安全性的考虑,建议管理员不要将该文件与网站中的数据存放在一起。至于创建该文件的方法,后面将会介绍,这里只需指定这两个文件的路径就可以了。
好了,现在单击『访问控制』页面底部的『保存』按钮,返回到『按目录选项文件』页面。接着单击该页面中的『当前模块首页』链接,进入『Apache WEB 服务器』页面。由于对 /var/www/secret/ 目录同时采用了基于主机的授权方式和基于用户的认证方式,难免会造成两者在某些地方的冲突。如果你现在从218.168.100.5 的主机访问 http://www/mylinux.org/secret/ 时,不必登录,Apache 也会将这些信息大大方方的显示出来。
为了避免这一问题,应该明确告诉 Apache 在处理“.httpd.conf”文件时,哪些指令可以覆盖 .httpd.conf 中定义的参数,这些参数包括 AuthConfig、FileInfo、Indexs、Limits 和 Options。可以同时选择多个,如果全选则可以用All 参数代替,但如果一项都不选,则应该使用 None 参数。
现在是不是有点明白了呢?没错,应该对 /var/www/secret/ 目录的选项再稍做调整,以满足基于用户认证的需要。单击『Apache WEB 服务器』页面『虚拟服务器』区域中网站 www.mylinux.org 所对应的虚拟主机图标,进入『虚拟服务器选项』页面后单击『按目录选项』区域中的『Directory /var/www/secret/』图标,打开『按目录选项』页面。由于对 /var/www/secret/ 目录采用基于用户的认证方式,因此需要配置恰当的文档选项。
单击『文档选项』图标,进入『文档选项』页面,在『选择文件可覆盖』区域中选择『已选择以下』单选框,然后从下面的列表中选择“.httpd.conf”文件要覆盖“.httpd.conf”文件中的哪些参数。
现在单击『文档选项』页面中的『保存』按钮,返回到『按目录选项』页面,单击该页面顶部『应用更改』链接根据新的设置值重新加载 Apache 服务器。此时若再从 218.168.100.5 的主机访问 http://www/mylinux.org/secret/,就可以看到要求用户先进行登录的窗口。
现在只有合法的 Apache 用户才能访问该目录下的资源了。
基于用户的认证方式可以很好地保护资源,使得只有授权的用户才能访问某些敏感的数据,不登录就访问资源现在已经变得不可能了,因为将吃到闭门羹。






























































