linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > php >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·PHP生成静态页面的一些经验
·PHP无限分类与树型论坛的实现方
·php5学习笔记
·入门级PHP程序员面试题
·PHP 和 MySQL初学入门
·PHP入门速成
·vim的代码折叠
·文件下载统计php编程代码
·如何建立自己的新闻发布系统
·织梦CMS中文转换拼音函数研究
·Windows下Apache+Tomcat+MySQL
·PHP初学者头疼问题总结
·Cookie及其使用详细介绍
·生成sessionid和随机密码的例子
·使用无限生命期Session的方法
最新文章
·PHP入门速成
·用php实现广告轮播
·Zend Optimizer 问题浅析
·功能强大的CGI语言----PHP3
·用Session对Web页面进行保护
·PHP--进行模块化设计
·如何将PHP的结果输出到非PHP页
·如何开发一个虚拟域名系统
·PHP4调用自己编写的COM组件
·简单的页面缓冲技术(三)
·简单的页面缓冲技术(二)
·简单的页面缓冲技术(一)
·用Socket发送电子邮件(二)
·用Socket发送电子邮件(一)
·PHP/MySQL 购物车
Google
 
用定制的PHP应用程序来获取Web服务器的状态信息
[ 作者:  加入时间:2007-11-22 11:15:36  来自:Linux联盟收集整理 ]
大多数网站托管(Web hosting)公司都支持客户对Web站点统计数据的访问,但是你往往会觉得服务器所产生的状态信息不够全面。例如,配置不正确的Web服务器不能识别某些文件类型,这些类型的文件就不会出现在状态信息之中。幸好,你可以用PHP来定制状态信息收集程序,这样你就可以获取你所需要的信息了。 hDJLinux联盟
   hDJLinux联盟
   hDJLinux联盟
  公共日志文件格式(Common Logfile Format,CLF)的结构 hDJLinux联盟
   hDJLinux联盟
   hDJLinux联盟
  CLF最初是NCSA为HTTPd(全球网服务器软件)而设计的。CERN HTTPd是一个由万维网联盟(World Wide Web Consortium,W3C)维护的公共域Web服务器。W3C网站列出了该日志文件规范。基于微软和UNIX的Web服务器都可以生成CLF格式的日志文件。CLF格式如下: hDJLinux联盟
  Host IdentAuthuserTime_Stamp "request" Status_codeFile_size hDJLinux联盟
   hDJLinux联盟
  例如: hDJLinux联盟
  21.53.48.83 - - [22/Apr/2002:22:19:12 -0500] "GET /cnet.gif HTTP/1.0" 200 8237 hDJLinux联盟
   hDJLinux联盟
  下面是日志条目的细目分类: hDJLinux联盟
   hDJLinux联盟
  Host是网站访问者的IP地址或者DNS名;在上面的例子中,它是21.53.48.83。 hDJLinux联盟
  Ident是该访客的远端身份(RFC 931)。破折号表明“未指定”。 hDJLinux联盟
  Authuser是用户ID(如果Web服务器已经验证了验证网站访问者的身份的话)。 hDJLinux联盟
  Time_Stam是服务器以“日/月/年”这种格式返回的时间。 hDJLinux联盟
  Request是网站访问者的HTTP请求,例如GET或者POST。 hDJLinux联盟
  Status_Code是服务器所返回的状态代码,例如:200代表“正确——浏览器请求成功”。 hDJLinux联盟
  File_Size是用户所请求文件的大小。在本例中,它为 8237字节。 hDJLinux联盟
   hDJLinux联盟
   hDJLinux联盟
  服务器状态代码 hDJLinux联盟
   hDJLinux联盟
   hDJLinux联盟
  你可以在HTTP标准中找到W3C所开发的服务器状态代码规范。这些由服务器所产生的状态代码表示了浏览器和服务器之间的数据传输成功与否。这些代码一般传递给浏览器(例如非常有名的404错误“页面没有找到“)或者添加到服务器日志中去。 hDJLinux联盟
   hDJLinux联盟
   hDJLinux联盟
  收集数据 hDJLinux联盟
   hDJLinux联盟
  创建我们的自定义应用程序的第一步就是获取用户数据。每当用户选择网站的某个资源时,我们就希望创建一个对应的日志条目。幸好,服务器变量的存在使得我们能够查询用户浏览器并获取数据。 hDJLinux联盟
   hDJLinux联盟
  报头中的服务器变量携带了从浏览器传递到服务器的信息。REMOTE_ADDR就是一个服务器变量的例子。这个变量返回了用户的IP地址: hDJLinux联盟
  例子输出:27.234.125.222 hDJLinux联盟
   hDJLinux联盟
  下面的PHP代码将显示出当前用户的IP地址: hDJLinux联盟
  <?php echo $_SERVER['REMOTE_ADDR']; ?> hDJLinux联盟
   hDJLinux联盟
  让我们看看我们的PHP应用程序的代码。首先,我们需要定义我们想跟踪的网站资源并指定文件大小: hDJLinux联盟
  //获取我们想记录的文件名称 hDJLinux联盟
  $fileName="cnet-banner.gif"; hDJLinux联盟
  $fileSize="92292"; hDJLinux联盟
   hDJLinux联盟
  你无需把这些值保存到静态变量中去。如果你要跟踪许多条目,那么你可以把它们保存到数组或者数据库中去。在这种情况下,你可能会希望通过一个外部链接来找到每个条目,如下所示: hDJLinux联盟
  <a href="weblogger.php?bannerid=123"><imgsrc="cnet-banner.gif" border="0"></a> hDJLinux联盟
   hDJLinux联盟
  其中“123”表示“cnet-banner.gif”所对应的记录。然后,我们通过服务器变量来查询用户浏览器。这样我们就得到在我们的日志文件中添加新条目所需的数据: hDJLinux联盟
  //得到网站浏览者的CLF信息 hDJLinux联盟
  $host=$_SERVER['REMOTE_ADDR']; hDJLinux联盟
  $ident=$_SERVER['REMOTE_IDENT']; hDJLinux联盟
  $auth=$_SERVER['REMOTE_USER']; hDJLinux联盟
  $timeStamp=date("d/M/Y:H:i:s O"); hDJLinux联盟
  $reqType=$_SERVER['REQUEST_METHOD']; hDJLinux联盟
  $servProtocol=$_SERVER['SERVER_PROTOCOL']; hDJLinux联盟
  $statusCode="200"; hDJLinux联盟
   hDJLinux联盟
  然后,我们检查服务器是否返回了空值(null)。根据CLF规范,空值应该用破折号来代替。这样,下一个代码块的任务就是寻找空值并用破折号来取代它: hDJLinux联盟
  //给空值添加破折号(根据规范) hDJLinux联盟
  if ($host==""){ $host="-"; } hDJLinux联盟
  if ($ident==""){ $ident="-"; } hDJLinux联盟
  if ($auth==""){ $auth="-"; } hDJLinux联盟
  if ($reqType==""){ $reqType="-"; } hDJLinux联盟
  if ($servProtocol==""){ $servProtocol="-"; } hDJLinux联盟
   hDJLinux联盟
  一旦我们获取了必要的信息,这些值将被组织成一种符合CLF规范的格式: hDJLinux联盟
  //创建CLF格式的字符串 hDJLinux联盟
  $clfString=$host." ".$ident." ".$auth." [".$timeStamp."] \"".$reqType." /".$fileName." ".$servProtocol."\" ".$statusCode." ".$fileSize."\r\n"; hDJLinux联盟
   hDJLinux联盟
  创建自定义日志文件 hDJLinux联盟
   hDJLinux联盟
  现在,格式化之后的数据可以存放到我们的自定义日志文件中去。首先,我们将创建一种文件命名协定,并编写每日产生一个新日志文件的方法(函数)。在本文所举的例子中,每个文件都以“weblog-”开头,然后是按月/日/年表示的日期,文件扩展名为.log。.log扩展名一般表示服务器日志文件。(实际上,绝大多数日志分析器都搜索.log文件。) hDJLinux联盟
  // 用当前日期来命名日志文件 hDJLinux联盟
  $logPath="./log/"; hDJLinux联盟
  $logFile=$logPath."weblog-".date("mdy").".log"; hDJLinux联盟
   hDJLinux联盟
  现在,我们需要判断当前日志文件是否存在。如果存在,我们就向它添加条目;否则,应用程序就创建新的日志文件。(新日志文件的创建一般发生在日期更改时,因为这时文件名发生变化了。) hDJLinux联盟
  //检查日志文件是否已经存在 hDJLinux联盟
  if (file_exists($logFile)){ hDJLinux联盟
  //如果存在,则打开已存在的日志文件 hDJLinux联盟
  $fileWrite = fopen($logFile,"a");} hDJLinux联盟
  else { hDJLinux联盟
  //否则,创建新的日志文件 hDJLinux联盟
  $fileWrite = fopen($logFile,"w"); } hDJLinux联盟
   hDJLinux联盟
  如果你在写或者追加文件时,收到“权限不足(Permission Denied)”错误信息,请更改目标日志文件夹的权限来允许写操作。绝大多数Web服务器的默认权限为“可读可执行”。你可以用CHMOD命令或者使用FTP客户端来改变文件夹的权限。 hDJLinux联盟
   hDJLinux联盟
  然后,我们创建文件锁定机制,这样当两个或者更多用户同时访问日志文件时,只有其中的一个用户可以对该文件进行写操作: hDJLinux联盟
  //创建文件写操作的锁定机制 hDJLinux联盟
  flock($fileWrite, LOCK_SH); hDJLinux联盟
   hDJLinux联盟
  最后,我们写入条目的内容: hDJLinux联盟
  //写CLF条目 hDJLinux联盟
  fwrite($fileWrite,$clfString); hDJLinux联盟
  //解除文件锁定状态 hDJLinux联盟
  flock($fileWrite, LOCK_UN); hDJLinux联盟
  //关闭日志文件 hDJLinux联盟
  fclose($fileWrite); hDJLinux联盟
   hDJLinux联盟
  处理日志数据 hDJLinux联盟
   hDJLinux联盟
   hDJLinux联盟
  在该系统产品化之后,客户希望得到对所收集到的访问者数据的详细统计分析。由于所有的定制日志文件都是按照一个标准的格式组织的,因此任何一个日志分析器都可以处理它们。日志分析器是一个工具,它分析大的日志文件并产生饼图、直方图以及其它统计图形。日志分析器也用来收集数据,并综合出提供哪些用户访问你的网站、点击数等方面的信息。 hDJLinux联盟
   hDJLinux联盟
  下面列出了几个比较流行的日志分析器: hDJLinux联盟
   hDJLinux联盟
  WebTrends是一个非常不错的日志分析器,它适用于大规模网站以及企业级的网络。 hDJLinux联盟
  Analog是一个颇受欢迎的免费日志分析器。 hDJLinux联盟
  Webalizer是一个免费的分析程序。它可以产生HTML报告,这样大多数网络浏览器都可以查看它的报告。 hDJLinux联盟
   hDJLinux联盟
  遵守标准 hDJLinux联盟
   hDJLinux联盟
  我们可以轻松的扩展该应用程序来让它支持其它类型的日志记录。这样你就可以捕获到更多的数据,如浏览器类型以及referrer(referrer指得是链接到当前网页的前一个网页)。这里的经验就是:在你编程的时候遵循标准或者惯例终究会简化工作。 hDJLinux联盟
   hDJLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Web服务器控件ConfirmButton介绍  (2007-10-26 11:45:41)
 ·简单几步设置Web服务器集群  (2007-10-18 10:57:00)
 ·FreeBSD 6.1 入门级Web服务器配置手记  (2007-10-16 11:42:51)
 ·FreeBSD平台下架设安全高效的Web服务器  (2007-10-16 11:23:05)
 ·LinuxWeb服务器和FTP服务器的安装  (2007-10-11 11:42:18)
 ·构建SCO UNIX下的Web服务器  (2007-09-19 12:00:00)
 ·FreeBSD平台安装配置web服务器  (2007-09-18 11:56:16)
 ·web服务器重装手记  (2007-09-17 11:42:01)
 ·某网站Web服务器安装配置及升级手册  (2007-09-14 11:56:04)
 ·web服务器的iptables脚本实例  (2007-09-14 11:38:56)