⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi3.htm

📁 中文教程Perl语言参考手册(中文html)
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80">
<title>ChinaPerl</title>
<LINK rel="stylesheet" href="article.css" type="text/css">
</head>
<body>

<p align="center">第三章 计数器的编写方法(未定稿)</p>

<p align="center"><a target="_blank" href="http://flamephoenix.126.com">by flamephoenix</a></p>

<a href="#1">一、记录(log)文件</a><br>
 &nbsp; <a href="#1.1">1、grep</a><br>
 &nbsp; <a href="#1.2">2、page-stats</a><br>
 &nbsp; <a href="#1.3">3、wusage</a><br>
<a href="#2">二、创建自己的计数器</a><br>
 &nbsp; <a href="#2.1">1、使用DBM文件</a><br>
 &nbsp; <a href="#2.2">2、文本文件</a><br>
 &nbsp; <a href="#2.3">3、文件锁定</a><br>
 &nbsp; <a href="#2.4">4、输出计数结果</a><br>
 &nbsp; <a href="#2.5">5、www Homepage Access Counter</a><br>
 &nbsp; <a href="#2.6">6、使用GD图形库</a><br>

<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;计数器(Access Counter)可以记录网页被访问的次数,在万维网上的使用十分普遍,其编写方法很多,从简单的SSI命令到用CGI程序生成内嵌图像等。计数器除了记录点击次数外,还可以记录访问者的IP、OS、浏览器类型等内容,使你对自己网站的访问情况有个全面的了解,本章主要介绍点击次数的统计和显示方法。<br><br>
<a name="1">一、记录(log)文件<br>
<a name="1.1">1、grep</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;对于Web服务器而言,都有记录文件记录着详细的访问信息,其名称通常为access_log,下面是一个例子:<br>
<blockquote>
01: dialup-9.austin.io.com - - [02/Oct/1995:20:18:05 -0500] "GET /phoenix/ HTTP/1.0" 200 2330<br>
02: crossnet.org - - [08/Oct/1995:19:56:45 -0500] "HEAD / HTTP/1.0" 200 0<br>
03: dialup-2.austin.io.com - - [09/Oct/1995:07:54:56 -0500] "GET /leading-rein/orders HTTP/1.0" 401 -<br>
04: onramp1-9.onr.com - - [10/Oct/1995:11:11:40 -0500] "GET / HTTP/1.0" 200 1529<br>
05: onramp1-9.onr.com - - [10/Oct/1995:11:11:43 -0500] "GET /accn.jpg HTTP/1.0" 200 20342<br>
06: onramp1-9.onr.com - - [10/Oct/1995:11:11:46 -0500] "GET /home.gif HTTP/1.0" 200 1331<br>
07: dialup-3.austin.io.com - - [12/Oct/1995:08:04:27 -0500] "GET /cgi-bin/env.cgi?<br>
08:    SavedName=+&First+Name=Eric&Last+Name=Herrmann&Street=&City=&State=&<br>
09:    zip=&Phone+Number=%28999%29+999-9999+&Email+Address=&<br>
10:    simple=+Submit+Registration+ HTTP/1.0" 200 1261<br>
11: dialup-20.austin.io.com - - [14/Oct/1995:16:40:04 -0500] "GET /leading-rein/index.cgi?unique_id=9658-199.170.89.58-813706781 HTTP/1.0" 200 1109
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;注;当主页在srm.conf中被命名为welcome.html、index.cgi、index.shtml等时,对其的访问记录,可能只含有目录名而不包含该文件名。<br>
&nbsp;&nbsp;&nbsp;&nbsp;我们可以用UNIX命令grep来统计主页被访问的次数,grep命令通常输出每一行匹配结果,但可以加上参数-c以输出匹配行的数目,grep详见UNIX帮助。下面是一个简单的例子grep.cgi:<br>
<blockquote>
1: #!/usr/local/bin/perl<br>
2: print "content-type: text/html\n\n";<br>
3: $num = `grep -c 'GET / HTTP' /your-server-root/logs/access_log` ;<br>
4: $num += `grep -c 'GET /index.shtml' /your-server-root/logs/access_log` ;<br>
5: $num += `grep -c 'GET /index.html' /your-server-root /logs/access_log` ;<br>
6: print "$num\n";
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;现在就可以在主页中加上SSI指令来显示计数了,例如:<br>
<blockquote>
01: &lt;html&gt;<br>
02: &lt;head&gt;&lt;title&gt;grep test&lt;/title&gt;<br>
03: &lt;body&gt;<br>
04: &lt;hr noshade&gt;<br>
05: This page has been accessed<br>
06: &lt;!--#exec cgi="grep1.cgi" --&gt; times.<br>
07: &lt;hr noshade&gt;<br>
08: &lt;/body&gt;<br>
09: &lt;/html&gt;
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;别忘了把此文件扩展名改为.shtml。在grep.cgi中,grep命令中包围模式的单引号告诉UNIX shell不改变该串的内容以精确匹配。<br>
&nbsp;&nbsp;&nbsp;&nbsp;这种方法有许多缺陷,首先是效率低,用grep来匹配花时间较长,可能要几秒钟的时间,这对一个简单的文本计数器而言太长了。其次,对每一个需要计数器的页面CGI文件均不相同。最后一个对某些人来说不算是个问题,就是要把Web服务器设置成允许SSI执行,即将其目录映射略加修改。<br>
<a name="1.2">2、page-stats</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;有一个叫page-stats的程序较好地解决了grep的问题。它查看HTTP daemon的access_log并寻找在标识文件中指定网页的访问,然后计算其数目并生成一个HTML形式的统计页面。这样,你既得到了页面的详细统计信息,同时又得到了可显示的结果页面,这样的例子可在<a target="_blank" href="http://www.sci.kun.nl/thalia/page-stats/page-stats_sci.html">http://www.sci.kun.nl/thalia/page-stats/page-stats_sci.html</a>找到。还可以用grep命令在统计页面中查找所需信息并生成自己的显示形式,这样速度就快多了。<br>
&nbsp;&nbsp;&nbsp;&nbsp;注意不应在建立自己的统计时运行该程序,否则会导致冲突。应该把它放到任务列表中用UNIX命令cron定时执行,每天、每小时甚至每几分钟运行一次。cron详见UNIX帮助。<br>
<a name="1.3">3、wusage</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;另外一个广为应用的服务器统计程序是由Thomas Boutell(<a href="mailto:boutell@boutell.com">boutell@boutell.com</a>)编写的应用于整个服务器的wusage,它生成很详细的信息,包括服务器怎样、何时及从何处被访问等等。它每周运行一次,可以生成漂亮的图表结果,十分直观。<br>
&nbsp;&nbsp;&nbsp;&nbsp;使用wrsage要求使用ncSA或CERN的Web Server或任何有标准记录文件格式的服务器,还需要有C编译器,wusage可在<a href="http://www.boutell.com">www.boutell.com</a>得到。<br>
&nbsp;&nbsp;&nbsp;&nbsp;随着时间推移,access_file会越来越庞大,必须定期截留,这时先查看最近一周wusage是否已生成了完整的报表,确定统计结束时间,然后把access_log中该时间前的访问记录删掉,并把wusage生成的结果保存在一个目录中,以便wusage可以生成过去访问情况的图表。<br><br>
<a name="2">二、创建自己的计数器</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;除了使用access_log记录文件外,我们可以创建自己的计数器。这时首先必须决定用何种形式存贮计数结果,是用文本文件还是用DBM文件,然后要决定是否进行文件同步访问的保护,这是用文件锁定来实现的,最后就是确定数据的存贮格式了。<br>
<a name="2.1">1、使用DBM文件</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;对DBM文件而言,常用的函数有dbmopen()、dbmclose()、reset()、each()、values()和keys(),用于计数器时,主要使用前两个函数。dbmopen()函数把DBM文件与关联数组绑定,调用语法为:<br>
&nbsp;&nbsp;&nbsp;&nbsp; dbmopen (%array_name, DB_filename, Read_write_mode);<br>
&nbsp;&nbsp;&nbsp;&nbsp;如果这时指定的数据库文件不存在,则自动创建两个名为DB_filename.dir和DB_filename.pag的文件,除非把读写模式设为undef值。<br>
&nbsp;&nbsp;&nbsp;&nbsp;缺省的,只有64个记录被读进内存,可以通过给%array_name分配大小来改变此缺省值。如果你只是给自己的网页做计数,缺省值已经足够了,但如果是给整个服务器建立计数器,一般需要更大的值。<br>
&nbsp;&nbsp;&nbsp;&nbsp;现在看看这三个参数。当调用dbmopen时,%array_name原有的值都被清除(如果有的话),用DBM文件中的值替换掉,给之赋予新值很简单:$array_name{'new_key'} = value; 当调用dbmclose (%array_name);语句时绑定被解除,关联数组中的内容被写如DBM文件,也可以不关闭文件而将内容写入,方法是调用reset (%array_name);语句,注意此语句并不是重置DBM文件,而是将内存中的数据写入文件。第二个参数DB_filename是不包含扩展名的,至于读写模式详见本教程的语言部分。<br>
&nbsp;&nbsp;&nbsp;&nbsp;下面是个使用DBM文件的计数器的简单例子:<br>
<blockquote>
1: dbmopen(%COUNTERS, $DOCUMENT_ROOT/DBM_FILES/counters,0666);<br>
2: if(!(defined($counters{'my_counter'})){<br>
3:    $counters{'my_counter'}=0;}<br>
4: $counters{'my_counter'})++;<br>
5: $count=$counters{'my_counter'};<br>
6: dbmclose (counters);
</blockquote>
<a name="2.2">2、文本文件</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;如果不用DBM文件而用文本文件,除了打开、关闭文件外,还要涉及到数据的读写问题,必须确定合适的数据格式,基本步骤如下:<br>
<blockquote>
1)打开文件<br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -