一个用php3编写的简单计数器

2014-03-28  来源:本站原创  分类:php基础  人气:0 

php具有极其强大的图像处理能力,用它可以很轻易的动态生成web图像。
一下是一个使用php做成的一个简单计数器。

1. 总体思路:
把以往的访问人数记录在一个文本文件中,当网页被访问的时候,从打开该文件
并从中读出以往的访问人数,加 1,得到最新的访问人数,并把该数目格式化成
标准的格式,再调用图像处理函数,把该数字输出成图片,再把新的访问数字回
写到纪录访问人数的文件中。

2. 程序所用到的函数说明:
A. 相关的文件操作:
a. 打开文件:
函数的原型:int fopen(string filename, string mode);
返回结果:如果打开文件成功,函数返回文件流指针,否则返回 FALSE(0)。
参数说明:
string filename -- 要打开的文件名,必须为字符串形式。
例如, "zzm.txt"、"..\zzm.txt"等。
string mode -- 打开文件的方式,必须为字符形式。
'r',只读形式,文件指针指向文件的开头
'r+',可读可写,文件指针指向文件的开头
'w',只写形式,文件指针指向文件的开头,把文件长度截成0,
如果文件不存在,将尝试建立文件。
'w+',可读可写,文件指针指向文件的开头,把文件长度截成0,
如果文件不存在,将尝试建立文件。
'a',追加形式(只可写入),文件指针指向文件的最后,如果文
件不存在,将尝试建立文件。
'a+',可读可写,文件指针指向文件的最后,如果文件不存在,
将尝试建立文件。
例子:用只读形式打开当前目录下面的"zzm.txt"
$fp = fopen("zzm.txt", "r");

b. 关闭文件:
函数原型:int fclose(int fp);
返回结果:成功返回1,失败返回0
参数说明:int fp是 fopen函数返回的文件流指针。
例子:关闭干刚才用fopen打开的zzm.txt文件
fclose($fp);

c. 读文件:
函数原型:string fgets(int fp, int length);
返回结果:返回 length -1 长度的字符串,如果到文件结尾,返回 EOF(End Of File)

参数说明:
int fp -- 要读入数据的文件流指针,由fopen函数返回的数值
int length -- 读入的字符个数,实际读入字符个数为 length -1 个
例子:从 $fp 中读取9个字符
$str1 = fgets($fp,10);

d. 写文件:
函数原型:int fputs(int fp, string str, int [length]);
返回结果:和fclose同
参数说明:
int fp -- 要写入信息的文件流指针,由fopen函数返回的数值
string str -- 要写入文件的字符串。
int length -- 写入的长度,可选的,如果不提供length,则整个串将被写入,
否则,写入length长度个字符。
例子:向 $fp 写入 "0000000001"
fput($fp, "0000000001");

B. 相关的字符串函数:
a. 计算字符串长度:
函数原型:int strlen(string str);
返回结果:返回字符串的长度
参数说明:
string str -- 要计算长度的字符串
例子:计算 "000000000" 的字符串长度
$str2 = "000000000";
$len2 = strlen($str);

b. 字符串相加:最简单不过了,用一个 . 把两个字符串连接起来。
例子:把 $str1和$str2相加
$str = $str1.$str2

C. 相关的图形函数:
a. 新建图像:
函数原型:int imagecreate(int x_size, int y_size);
返回结果:返回一个 X*Y 像素大小的空图像识别号(ImageID)
参数说明:x_size,y_size分别是新建图像的宽度和高度(以像素为单位)
例子:新建一个 88*31 像素大小的空图片
$ImageID = imagecreate(88, 31);

b. 给图像分配一种颜色:
函数原型:int imagecolorallocate(int im, int red, int green, int blue);
返回结果:给图像($im)返回一个RGB颜色识别号
参数说明:int im 图像识别号
int red、green、blue分别是红绿蓝三种颜色的分量,取值范围 0 - 255
例子:给图像$im 分配一个识别号为$white白色颜色,白色的RGB为(255,255,255)
$white = imagecolorallocate($im, 255, 255, 255);
c. 给图像填充颜色:
函数原型:int imagefill(int im, int x, int y, int col);
返回结果:成功返回1,否则返回0
参数说明:int im,图像的识别号
int x, int y,从图像的(x,y)坐标开始填充颜色
(0,0)表示图像的左上角
int col,颜色的识别号
例子:从图像的左上角开始(即整个图片)填入黑色(已经用imagecolorallocate函数
定义了黑色的颜色识别号为$black了)。
imagefill($im, 0, 0, $black);

d. 计算图像的宽度:
函数原型:int imagesx(int im);
返回结果:返回图像的宽度(单位为像素)
参数说明:int im,图像的识别号。
例子:计算图像$im的宽度
$px = imagesx($im);

e. 在图像中写入水平文字:
函数原型:int imagestring(int im, int font, int x, int y, string s, int col)

返回结果:成功返回1,否则返回0
参数说明:int im,图像的识别号
int font,字体识别号,内建字体1到5,用户可以用imageloadfont()自己?
?
载字体.
int x,int y,开始写入字体的坐标,(0,0)为图片的左上角。
string s,要写入的字串
int col,字体的颜色识别号
例子:在图像(3,3)位置写入字号为3,颜色为白(已经用imagecolorallocate()函数
定义了黑色的颜色识别号为$white)的字串"E&J Counter"
ImageString($im, 3, 3, 3, "E&J Counter", $white);

f. 在图像中划直线:
函数原型:int imageline(int im, int x1, int y1, int x2, int y2, int col);
返回结果:成功返回1,否则返回0
参数说明:int im,图像的识别号
int x1,int y1,划线的起坐标
int x2,int y2,划线的止坐标
int col,线的颜色识别号
例子:在图像$im中划一条从(1,14)到(85,14)颜色为$white的直线
imageline($im, 1, 14, 85, 14, $white);

g. 把图像输出成GIF格式:
函数原型:int imagegif(int im, string filename);
返回结果:成功返回1,否则返回0
参数说明:int im,图像的识别号
string filename,生成图片的名字,可选的,如果filename为空,则直接?
氖涑?
图片,你需要用Header("Content-type: image/gif")预先定义php输出的内
容为图片
例子:把图像$im输出成文件名为"image1.gif"的图片
imagegif($im, "image1.gif");

h. 释放图像:
函数原型:int imagedestroy(int im);
返回结果:成功返回1,否则返回0
参数说明:int im,要释放的图像识别号。该函数会释放识别号im的图像及图像所占
用的系统资源。
例子:释放图像$im
imagedestroy($im);

3. 如何安装这个计数器:
A. 系统必须安装了PHP解释器。PHP可以在http://www.php.net/上下载,在该站点上还有很
详细
的技术资料可以浏览或者下载阅读。如何安装PHP请参照它自己的说明。
B. 把下面的程序清单拷贝到一个文件中,并取扩展名为php,放入能够运行php脚本的目录?
旅妫?
并在目录下面建立一个纯文本文件,名字为zzm.txt。这个文件的作用是用来记录以往的
访问人
数用的。你可以预先设置计数器的初始值,例如5000。
C. 在网页如何调用这个计数器?你可以通过以下方式来调用:
<img src="YourURL/Counter.php">

附:完整的程序清单
<?
Header("Content-type: image/gif");
//定义输出为图像类型

$fp = fopen("zzm.txt", "r");
//以读形式打开记录以往访问人数的文件zzm.txt

$str1 = fgets($fp,10);
//从文件中读入9个字符,本计数器最大能记录的访问人数为999999999

$str1++;
//计数器加入

fclose($fp);
//关闭文件

$fp = fopen("zzm.txt", "w");
//一写的方式打开记录访问人数的文件zzm.txt

fputs($fp, $str1);
//把最新的访问人数写入文件

fclose($fp);
//关闭文件

/*
以下是把访问人数格式化输出,如果访问人数位数不够9位,例如时5000(4位),
则把访问人数变换成000005000的形式输出。方法是计算访问人数的位数,并且
把它和000000000的位数(9位)比较,得到相差的位数,然后在数字前面不上相
应个0。例如5000,和000000000两者的长度相差5,因此要在5000前面补5个0。
*/

$len1 = strlen($str1);
//计算访问人数的位数

$str2 = "000000000";
$len2 = strlen($str);
//定义计数器最大的计数位数

$dif = $len2 - $len1;
//计算两者的位数之差,即前面要补的0的个数

$rest = substr($str2, 0, $dif);
//截取要补的0

$string = $rest.$str1;
//前面补0

$font = 4;
//定义字号

$im = imagecreate(88,31);
//新建图象

$black = ImageColorAllocate($im, 0,0,0);
//定义黑色

$white = ImageColorAllocate($im, 255,255,255);
//定义白色

imagefill($im, 0,0,$black);
//把计数器的底色设置成黑色

$px = (imagesx($im)-8.3*strlen($string))/2;
//根据字串的长度,计算字串开始写入的水平坐标,目的是尽量让字串水平对中

ImageString($im,3,$px,2,"E&J Counter",$white);
//向图象写入"E&J Counter"

imageline($im, 1, 14, 85, 14, $white);
//划一根水平线

ImageString($im,$font,$px,15.5,$string,$white);
//写访问人数

ImageGif($im);
//把图象输出成GIF格式
ImageDestroy($im);
//释放图象
?>

相关文章
  • 一个用php3编写的简单计数器 2014-03-28

    php具有极其强大的图像处理能力,用它可以很轻易的动态生成web图像. 一下是一个使用php做成的一个简单计数器. 1. 总体思路: 把以往的访问人数记录在一个文本文件中,当网页被访问的时候,从打开该文件 并从中读出以往的访问人数,加 1,得到最新的访问人数,并把该数目格式化成 标准的格式,再调用图像处理函数,把该数字输出成图片,再把新的访问数字回 写到纪录访问人数的文件中. 2. 程序所用到的函数说明: A. 相关的文件操作: a. 打开文件: 函数的原型:int fopen(string f

  • 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务 2014-11-03

    在当今这个协作和社交应用的世界里,其关键是要有一个能简单构建和易于部署的后台.许多组织机构都依赖于一个应用栈(Application Stack),其使用下面三项技术: Node.js Express MongoDB 这个栈对于移动应用来说相当流行,因为原生数据格式是JSON,它容易被应用解析,例如通过使用 Cocoa 的NSJSONSerialization类或其它类似的解析器. 在本教程中,你将学会如何搭建了一个 Node.js 环境,驱动 Express:在此平台之上,你将构建一个通过 R

  • php编写的简单页面跳转功能实现代码 2013-12-17

    这篇文章主要介绍了php编写的简单页面跳转功能实现代码,有需要的朋友可以参考一下 不多说,直接上代码 //链接数据库'查询 mysql_connect('localhost','username','userpwd')or die("数据库链接失败".mysql_error()); mysql_select_db('库名'); mysql_query('set names utf8'); $sql1="select * from user "; $query1=my

  • 分享一个PHP数据流应用的简单例子 2014-04-24

    分享一个PHP数据流应用的简单例子,需要的朋友可以参考下 <?php $count = 5; start: if($count < 5) echo "You can try {$count} time, "; echo "Put Password: "; $handle = fopen ("php://stdin","r"); $line = fgets($handle); if(trim($line) != '1

  • c# dataTable 合并两个列到一个新列中的简单实例 2014-09-09

    这篇文章介绍了c# dataTable 合并两个列到一个新列中的简单实例,有需要的朋友可以参考一下 public static DataTable UniteDataTableColumns(DataTable dt, String newColumnName, string ColumnName1, string ColumnName2) { //汇总的表达式 string expression = ""; expression = String.Format("{0}+'

  • 一个简单计数器的源代码 2015-04-25

    <? $memo_file="phpcount/vst.txt"; if ($phpxcount<>$REMOTE_ADDR){ $visits = file($memo_file); $number_of_last_visit = $visits[0]; $number_of_new_visit = ++$number_of_last_visit; $fp = fopen($memo_file, "w"); $fw = fwrite($fp, $

  • 一个可以防止刷新的JSP计数器 2013-12-24

    <%@ page contentType="text/html;charset=gb2312" %> <!--jsp计数器--> <%-- 以前学ASP时,用ASP做防止刷新的计数器很简单,以下是一个用JSP做的计数器--%> <html> <head> <title>jsp计数器</title> </head> <body> <%@ page import="j

  • 一个自定义位数的php多用户计数器代码 2015-02-20

    此计数器能够自定义任意位数,而且在免费提供的时候能够显示一个简单的广告. 运行的时候需要在计数器目录下创建一个nobody帐户有权改写的目录datas. 实际运行的例子在 http://www.hnpts.ha.cn/freecount.htm <? Header("Content-type: image/png"); if ($user=="") $user="test"; $fn="datas/".$user.&qu

  • 魔兽世界新BUG:创建一个亡灵圣骑士 就是这么简单 2013-12-08

    一些魔兽世界外服玩家爆出有一个简单的方法--在不使用任何角色模型修改工具的情况下来改变目前的魔兽角色人物模型.这个方法是在经过多方核实后,是可行的.详细步骤如下: 创建一个新的人物,选择你喜欢的种族,性别和外观.然后,进入新的1级人物角色的游戏世界,然后登出返回的人物列表.左键单击选择你想改变其模型的高等级人物角色,然后将鼠标移动到新创建的人物上. 牛头人盗贼 现在,用鼠标点住新创建的人物,按住回车,同时点击鼠标左键.如果你抓住时机并且有好运气,你的高级别人物模型将转变为新建的人物模型.使用此方

  • 基于C中一个行压缩图的简单实现代码 2014-07-20

    首先简单说一下什么是行压缩图,其实严格意义上应该是行压缩矩阵 首先简单说一下什么是行压缩图,其实严格意义上应该是行压缩矩阵.正常情况下,矩阵是用二维数组简单存储的,但是如果是稀疏矩阵,也就是零很多的时候,这样比较浪费空间.所以就有各种节省空间的存储方式,三元组存储就是其中一种. 什么是三元组呢?一个三元组就是(row,col,value),这样把所有不为零的值组成一个向量.这种存储方式比二维数组节省了不少空间,当然还可以进一步节省,因为三元组里面row或者col重复存储了,一行或者一列存一次就行

  • 主题:从with关键字到编写自己简单的ContextManager 2012-05-24

    contextlib.contextmanager的用法是怎样的?我摘抄一下模块源代码 引用 Typical usage: @contextmanager def some_generator(<arguments>): <setup> try: yield <value> finally: <cleanup> This makes this: with some_generator(<arguments>) as <variable>

  • 也发一个自己实现的android简单文件选择器代码.支持多卡,排序 2014-10-14

    一个很简单的文件选择器对话框,支持双sd卡,当然前提是要有sd卡..并且实现了排序效果. 只有100多行的代码,基本的思路就是用listview显示目录下的所有子文件,再判断是文件还是目录. 利用Collections.sort方法进行排序. 代码如下: 1 package net.yunstudio.demo; 2 3 import java.io.File; 4 import java.text.Collator; 5 import java.util.ArrayList; 6 import

  • 一个备份MySQL数据库的简单Shell脚本 2013-12-05

    Shell脚本是我们写不同类型命令的一种脚本,这些命令在这一个文件中就可以执行.我们也可以逐一敲入命令手动执行.如果我们要使用shell脚本就必须在一开始把这些命令写到一个文本文件中,以后就可以随意反复运行这些命令了. 我首先要在本文带给你的是完整脚本.后面会对该脚本做说明.我假定你已经知道shell scripting. mysqldump和crontab. 适用操作系统:任何Linux或UNIX. 主脚本(用于备份mysql数据库): 该Shell脚本可以自动备份数据库.只要复制粘贴本脚本到

  • 一个导航条布局的简单写法 2015-04-10

    我希望能用最简单的代码去解决问题! CSS部分 <style> #menu ul {list-style:none;margin: 0px;padding: 0px;} #menu li {float:left;font-size:12px; background: #999; padding:2px 20px;border:1px solid #000; margin-left: -1px;} </style> 内容部分: 如需引入外部Js需刷新才能执行]

  • 做了一个 62 进制的简单实现 2014-09-26

    62 进制需要的字符及次序: 0..9 a..z A..Z; 只实现了 62 进制字符串与正整数的互换. unit H62; interface uses SysUtils; function IntToH62(N: UInt64): string; //整数转到 62 进制字符串 function H62ToInt(S: string): UInt64; //62 进制字符串转到整数 implementation function _C2B(C: Char): Byte; inline; be

  • c#编写的简单登录(login)窗口 2015-04-12

    启动VC 2010 代码如下: this.AcceptButton = this.btnOK; this.CancelButton = this.btnCancel; private void btnOK_Click(object sender, System.EventArgs e) { // Here is to use fixed username and password // You can check username and password from DB if( txtUser

  • 解析:用SAAJ解决SOA集成问题 2012-03-09

    面向服务的架构(SOA)和面向服务的集成(SOI)得到了广泛的应用,并且有一种需求变得越来越明显:业务需要集成系统,并允许消费者利用基于标准的方法访问服务.SOA是一种架构范例.在这种架构中,可重用的业务逻辑表现为包含基于标准的.定义良好的接口的服务集,并且可以以松散耦合方式访问它.因为Web Service标准的供应商的支持,以及利用基于这种标准的软件集成不同的系统相对容易,所以在解决企业集成问题方面,SOA得到了普遍的认可. 基于Java的中间件和企业应用程序集成(EAI)产品已经被使用了一

  • 用Python编写一个简单的FUSE文件系统的教程 2014-05-26

    这篇文章主要介绍了用Python编写一个简单的FUSE文件系统的教程,对于数据的备份很有帮助,需要的朋友可以参考下 如果你是我的长期读者,那么你应该知道我在寻找一个完美备份程序,最后我写了一个基于bup的我自己的加密层. 在写encbup的时候,我对仅仅恢复一个文件就必须要下载整个巨大的档案文件的做法不甚满意,但仍然希望能将EncFS和 rdiff-backup一起使用来实现可远程挂载.加密.去重.版本化备份的功能. 再次试用obnam 后(??乱痪洌核?故锹?某銎?,我注意到了它有一个moun

  • JQuery入门-编写一个简单的JQuery应用案例 2014-07-20

    首先引入JQuery文件库只需将文件导入页面中即可,即在<head></head>中,接下来详细介绍,感兴趣的朋友可以了解下 一.官方网站下载:http://jquery.com 二.引入JQuery文件库 下载完后不用安装,只需将文件导入页面中即可,即在<head></head>中加入如下代码:<script language="javascript" type="text/javascript" src=&q

  • 通过perl实现一个简单的NIDS 2015-03-08

    使用perl实现一个简单的NIDS,有需要的朋友可以参考下 随着对网络安全需求的深入开发,基于网络的入侵检测技术已经成为一个重要且有意思的研究方向.想学习NIDS技术除了去读一些现成的资料和一些开源系统的源码,最好的办法莫过于自己去写一个NIDS程序,只有那样才能真正体会到一些NIDS的实现需求和设计妙处. 本质上说NIDS只是一种网络流量的分析工具,通过对网络流量的分析识别出一些已知或未知的攻击行为,一个最简单的NIDS完成的主要工作也就是抓包->协议解码->匹配,众所周知PERL是极其强大