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

📄 cgi3.htm

📁 perl快速入门。由浅入深
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<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>
2)读取计数<br>
3)自增<br>
4)写入新值<br>
5)关闭文件
</blockquote>
<a name="2.3">3、文件锁定</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;当更新文件内容时,该文件可能同时被另一个进程修改。对计数器程序而言,如果两个或多个人同时访问页面调用了计数器程序,就会出现多个进程同时修改同一文件的情况,这样有的进程的修改就会失效。当然这并不是太大的问题,只是失去一些计数而已,不过计数器就不准确了,访问的人越多,这个问题就越大。解决办法就是修改时通知其它试图打开该文件的进程等待,或叫文件锁定,修改完再释放,允许其它进程打开文件并修改。有两种方法,一是创建自己的锁定机制,一种是使用系统函数flock()。<br>
1)创建自己的文件锁<br>
&nbsp;&nbsp;&nbsp;&nbsp;这种方法具体实现是创建和删除一个特定名称的文件,这在资源共享机制中通常称作semaphore。下面是个例子:<br>
<blockquote>
01: While(-f counter.lock){<br>
02: &nbsp;    select(undef,undef,undef,0.1);}<br>
03: open(LOCKFILE,"&gt;counter.lock);<br>
04: dbmopen(%COUNTERS, $DOCUMENT_ROOT/DBM_FILES/counters,0666);<br>
05: if(!(defined($counters{'my_counter'})){<br>
06: &nbsp;    $counters{'my_counter'}=0;}<br>
07: $counters{'my_counter'})++;<br>
08: $count=$counters{'my_counter'};<br>
09: dbmclose (counters);<br>
10: close(LOCKFILE);<br>
11: unlink(counter.lock);
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;首先检查锁定标志文件是否存在,如果存在,就说明另一个进程正在使用该文件,于是等待直到该文件(此处命名为counter.lock)不存在为止。此处用select()的特殊形式循环等待,此语句使程序进入休眠状态一段时间,该时间段由最后一个参数定义。之所以不用sleep()函数是因为其基本单位为秒,对这种文件锁定而言太长了,几个微秒就足够了。<br>
&nbsp;&nbsp;&nbsp;&nbsp;当锁定标志文件不再存在,就创建自己的锁定标志文件并开始修改计数,完成后关闭该文件并用unlink函数将之删除,这样其它的进程又被允许修改计数。锁定标志文件并不是特殊的文件,其文件名也可以由你自己随意选择。<br>
2)使用flock()<br>
&nbsp;&nbsp;&nbsp;&nbsp;其实锁定文件是很普通的编程步骤,系统函数flock()提供了这一功能,如果在你的系统上不提供的话,可以使用前面介绍的方法自己实现。<br>
&nbsp;&nbsp;&nbsp;&nbsp;flock()的语法为:<br>
&nbsp;&nbsp;&nbsp;&nbsp; flock (filehandle, lock_type);<br>
&nbsp;&nbsp;&nbsp;&nbsp;参数filehandle为用open()函数打开的文件句柄,lock_type可以为下面四个值之一:<br>
<blockquote>
1:定义共享锁。对计数器而言不适用。<br>
2:定义排他锁。<br>
3:定义非阻止锁。此处亦不用。<br>
4:解除锁定。
</blockquote>
&nbsp;&nbsp;&nbsp;&nbsp;使用flock()实现的文件锁定例子如下:<br>
<blockquote>
1a: dbmopen(%counters,"filename", 0666);<br>
or<br>
1b: OPEN(counters,"&lt;filename")'<br>
2:  flock(counters,2);<br>
3:  if(!(defined($counters{'my_counter'})){<br>
4:  &nbsp;        $counters{'my_counter'}=0;}<br>
5:  $counters{'my_counter'})++;<br>
6:  $count=$counters{'my_counter'};<br>
7:  dbmclose (counters);<br>
8:  flock(counters,8);
</blockquote>
<a name="2.4">4、输出计数结果</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;现在一切就绪,只剩下输出我们的计数结果了,有三种输出方法:<br>
<blockquote>
1)用上面谈到的SSI方法输出。<br>
2)创建各种文本格式输出。<br>
3)生成各种漂亮的图形结果输出,本教程的《动态创建图像》一章讲述了基本原理并提供了一个x-bitmap格式的小例子,下面介绍两个更完善和漂亮的程序/库,这两个例子均需要C编译器。
</blockquote>
<a name="2.5">5、www Homepage Access Counter</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;这是一个广为应用的网页计数程序,它利用已有的GIF图象连接起来生成一个GIF图象,此程序是用C语言写的,有适用于各种操作系统的版本,可以在<a target="_blank" href="http://www.fccc.edu/users/muquit/Count.html">www.fccc.edu/users/muquit/Count.html</a>下载。它提供了很多参数,功能比较齐全,生成的图象结果也很漂亮,可以选择图像格式,其自带了一些数字样式,但你可以增加自己的数字图像生成各种想要的图像,<a target="_blank" href="http://cervantes.comptons.com/digits/digits.htm">cervantes.comptons.com/digits/digits.htm</a>提供了很多GIF数字图象。其参数通过QUERY_STRING传递,且必须是小写字母,下面是个较复杂的调用例子:<br>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;img src="/cgi-bin/Count.cgi?ft=9|frgb=69;139;50|tr=0|trgb=0;0;0|wxh=15;20|md=6|dd=A|st=5|sh=1|df=count.dat" align=absmiddle&gt;; <br>
&nbsp;&nbsp;&nbsp;&nbsp;其参数详细说明和使用方法详见上述下载网址。如果有必要的话,研究并修改一下其源程序可以使你生成更适合于自己需要的图象。<br>
<a name="2.6">6、使用GD图形库</a><br>
&nbsp;&nbsp;&nbsp;&nbsp;www Homepage Access Counter利用现有的数字图象简化了一部分的工作,其目的就是用于图形计数器。GD图形库的功能更加强大,不仅可以用于创建图形计数器,还可以生成各种统计图表,还提供了Perl接口库。GD及其衍生的程序详见本教程《动态创建图像》一章。<br>
&nbsp;&nbsp;&nbsp;&nbsp;在下载的程序中有一个名为gddemo.c的程序演示了其使用方法,在<a target="_blank" href="http://sparke.cs.nyu.edu:8086/cgi.htm">sparke.cs.nyu.edu:8086/cgi.htm</a>有其用于计数器的例子。下面是一个通过GD.pm调用GD图形库生成图像的Perl程序例:<br>
<blockquote>
#!/usr/bin/perl<br>
<br>
use GD;<br>
<br>
# create a new image<br>
$im = new GD:Image(100,100);<br>
# allocate some colors<br>
$white = $im-&gt;colorAllocate(255,255,255);<br>
$black = $im-&gt;colorAllocate(0,0,0);<br>
$red = $im-&gt;colorAllocate(255,0,0);<br>
$blue = $im-&gt;colorAllocate(0,0,255);<br>
# make the background transparent and interlaced<br>
$im-&gt;transparent($white);<br>
$im-&gt;interlaced('true');<br>
# Put a black frame around the picture<br>
$im-&gt;rectangle(0,0,99,99,$black);<br>
# Draw a blue oval<br>
$im-&gt;arc(50,50,95,75,0,360,$blue);<br>
# And fill it with red<br>
$im-&gt;fill(50,50,$red);<br>
# Convert the image to GIF and print it on standard output<br>
print $im-&gt;gif;
</blockquote>

<p align="center"><a href="cgi2.htm">上一章</a> <a href="cgi4.htm">下一章</a> <a href="index.htm">目录</a></p>

  	  </td>
      </tr>        
      </table>
    </td>
  </tr>
</table>

</body>
</html>

⌨️ 快捷键说明

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