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

