用PHP来写记数器(详细介绍)

PHP实例剖析:计数器
作者:Sucre_tiger
本款计数器用文本计数,没有用到数据库,可以实现如下功能:
利用一个文本文件实现多个页的计数减少服务器的I/O占用率在需要纪录的文件里,只需加入很少的几行代码                                    
基本思路如下:
服务器程序从文本文件中读取该页被浏览的次数,(因为所有文件向服务器提出请求时,他们的环境变量REQUEST_URI都代表他来自于何处... ...,所以,以请求文件的环境变量REQUEST_URI来辨别到底是那一页正被浏览。),将这个次数加一储存,并在调用这页的用户的计算机上显示出来。
请先看我的数据文本中纪录的数据样本,(红色为浏览次数,其前面为相应的被浏览的文件)
Counter.dat/script/s2.php|3|/script/s1.php|11| /script/counter.php|5| /testhtml/s2.php|7|/testhtml/s3.php|6|
Now,Let’s go!
counter.php
<html><head>
<title>计数器</title>
<head>  
<body>
<?php
/* 定义储存数据的文本文件 */
$counterFile="counter.dat\";
/* 定义一个标记,用来辨别现在需纪录的数据是否已经文本数据中 */
$sign=False;
/* 将数据以数组的方式读入变量 $sounterData 备用, */
$counterData=file($counterFile);  
/* 用count()函数计算共有多少个纪录 */
/* 用explode()函数把$counterData[$i]按符号\"|\"分开,并以数组的方式送回到变量$varArray里 */
/* 函数implode()与explode()刚刚相反,把数组$varArray以符号\"|\"连接起来送回到$counterData */
/* 还利用了环境变量$PATH_INFO
for($i=0;$i<=count($counterData)-1;$i++)  
 {
  $varArray=explode(\"|\",$counterData[$i]);  
  if ($varArray[0]==$GLOBALS[\"REQUEST_URI\"])  
   {
    $varArray[1]++;
    print($varArray[1]);
    $counterData[$i]=implode(\"|\", $varArray);
    $sign=True;
    /* 找到本纪录所在的位置后, 用break 退出循环 */   
    break;
   }  
 }
/* 在这里,利用implode()这个函数的功能,将数据整理好了,一起写入文本文件中 */
/* 这样,对服务器的I/O占用就降到了最低点
$data=implode(\"\",$counterData);
/* 打开文本文件,将数据写入 */
$fp=fopen($counterFile,\"w\");
fputs($fp,$data);  
/* 如果需要纪录的数据不在文本里,标志$sign= Flase, 那么就往文本里添加数据 */  
if (!$sign) {fputs($fp,\"\\n\".$GLOBALS[\"REQUEST_URI\"].\"|\".\"1\".\"|\");
print(\"1\");
/* 关闭数据文件 */
fclose($fp);
?>
</body>
</html>  
我们已经看到了这段程序的工作过程,也都知道了思路,但如果,每个文件里都这样写,岂不是太麻烦.
别慌! 我们还有PHP提供的强大的require()功能呢! 我们把counter.php写成函数,使用就方便许多了。那还等什么,下面就是你所要的函数:
counter.inc
<?php  
function Counter()
{
  $counterFile=\"/freespace/sucre/public_html/counter.dat\";
  $counterData=file($counterFile);
  $sign=False;
  for($i=0;$i<=count($counterData)-1;$i++)  
   {
    $varArray=explode(\"|\",$counterData[$i]);  
    if ($varArray[0]==$GLOBALS[\"REQUEST_URI\"])  
     {  
       $varArray[1]++;  
       print($varArray[1]);
       $counterData[$i]=implode(\"|\", $varArray);
       $sign=True; break;
     }
   }
  $data=implode(\"\",$counterData);
  $fp=fopen($counterFile,\"w\");  
  fputs($fp,$data);  
  if (!$sign)  
   {
    fputs($fp,\"\\n\".$GLOBALS[\"REQUEST_URI\"].\"|\".\"1\".\"|\");
    print(\"1\");
   }  
  fclose($fp);
}  
?>  
最好的检验方法就是“实践”,好了来看我们怎样调用它,先看一个例子:
counterTest.php
<?php
require(\"counter.inc\");
?>
<html>  
<head>  
<title> 网页计数器 终结版 </title>
</head>
<body>
您是第<? counter();?>位阅读者
</body>
</html>
您只需在要计数的HTML文件的文件头加入require()函数,引入counter()函数为homepage的一部分。在需要的地方加入<? counter();?>就可以了。
还有几点要注意的问题:
1、    记录数据的文件一定要有“写”的权限,一般设成“666”即可,如果该文件存放在一个子目录下,则对这个“目录”也要有“写”的权限;
2、    我在调试过程中遇到这样一个问题,我将counter.inc和counter.dat放在一个子目录include下面,然后在不同的子目录下面用require()函数进行调用,格式如下:<?php  
      require(“../include/counter.inc”)
    ?>
可是总是出现“权限不够”的错误,如有高手请指教。

时间: 2024-09-02 23:32:46

用PHP来写记数器(详细介绍)的相关文章

PHP Streams(流)详细介绍及使用

  这篇文章主要介绍了PHP Streams(流)详细介绍及使用,PHP Streams是内置核心操作,可能一般的开发者很少用,它用于统一文件.网络.数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口,需要的朋友可以参考下 PHP Streams是内置核心操作,可能一般的开发者很少用,它用于统一文件.网络.数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口. 一个stream就是一个具有流式行为的资源对象,每个stream对象都有一个包装类.Stream 可以通过

详细介绍ASP.NETWeb相关服务

经过长时间学习ASP.NETWeb,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西.学习ASP.NETWeb时,你可能会遇到相关问题,这里将介绍ASP.NETWeb问题的解决方法. 该结构分三个层次:表示层.业务层.数据层.数据层:代表物理数据库.业务层:负责数据层与表示层之间的数据传输.表示层:应用程序的客户端,它通过业务层来访问数据库. 表示层所操作的是驻留在内存中的本地数据,当需要更新数据库数据时,要通过业务层提供的更新方法实现.这样可以大大提高应用程序的性能,而且

详细介绍CSS的三种selector

css|select CSS的三种selector 上一节开始我们讨论 CSS (Cascading Style Sheet) 的基础. 告诉你有三种 Selector. 但只介绍了其中的 HTML selector. 这一节我们把三种都详细介绍给你HTML selector.class selector.ID selector: HTML selector HTML selector 就是 HTML 的 tags, 比如 P, DIV, TD 等. 如你用 CSS 定义了它们, 在整页中, 这

PHP模板引擎smarty详细介绍

  这篇文章主要介绍了PHP模板引擎smarty详细介绍,本文讲解了什么是smarty.smarty优点.不适合使用smarty的地方.smarty目录结构及版本,需要的朋友可以参考下 /* 一.什么是smarty? smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲, 目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要. 二.smar

Mysql字符串处理函数详细介绍、总结

 这篇文章主要介绍了Mysql字符串处理函数详细介绍.总结,需要的朋友可以参考下 一.简明总结 ASCII(char) 返回字符的ASCII码值 BIT_LENGTH(str) 返回字符串的比特长度 CONCAT(s1,s2-,sn)  将s1,s2-,sn连接成字符串 CONCAT_WS(sep,s1,s2-,sn) 将s1,s2-,sn连接成字符串,并用sep字符间隔 INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果

jQuery异步上传文件插件ajaxFileUpload详细介绍

这篇文章主要介绍了jQuery异步上传文件插件ajaxFileUpload详细介绍,本文首先讲解了ajaxFileUpload的参数.错误提示等知识,然后给出了简单使用实例和ASP.NET MVC模式下的使用实例,需要的朋友可以参考下     一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数说明: 1.url 上传处理程序地址. 2,fileEl

Linux shell脚本基础学习详细介绍(完整版)

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可

Javascript优化技巧之短路表达式详细介绍

 这篇文章主要介绍了Javascript优化技巧之短路表达式详细介绍,本文讲解了什么是短路表达式,并给出了一些示例,需要的朋友可以参考下     什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值.这是这两个操作符的一个重要属性. 一个最简单的例子:   代码如下: foo = foo||bar;   这行代码是什么意思?答案:  

windows 7系统任务栏的详细介绍

win7任务栏相信有使用win7的人都不陌生,而这篇文章是要写个还在用xp系统的.让他们知道win7任务栏有多强大,也可以说是win7任务栏的详细介绍吧! 1 大图片的外观 当鼠标遇到该程序的时候,任务栏会自动展现出大图片,这让我们在判断自己打开什么程序的时候更好判断.如图: 2 一个软件打开多个更好找 我们在使用电脑的过程中,经常打开多个IE.有的适合我们要找到我们想要的IE需要一个个去查找,而win7让我们更方便,不用一个个点开,只需要看下缩略图就行了. 3 人性化的设置 有的人打开多个进程

JavaScript中的分号插入机制详细介绍

 这篇文章主要介绍了JavaScript中的分号插入机制详细介绍,本文讲解JavaScript中各种情况下的分号插入机制,需要的朋友可以参考下     仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 代码如下: function square(x) { var n = +x return n * n } 但是却不可以写的像下面代码一样,这样就报错了哦 代码如下: function area(r) {