如何使用定制的PHP应用程序来获取Web服务器状态信息
创始人
2024-12-19 04:22:13
0次

  公共日志文件格式(CommonLogfileFormat,CLF)的结构

  CLF最初是NCSA为HTTPd(全球网服务器软件)而设计的。CERNHTTPd是一个由万维网联盟(WorldWideWebConsortium,W3C)维护的公共域Web服务器。W3C网站列出了该日志文件规范。基于微软和UNIX的Web服务器都可以生成CLF格式的日志文件。CLF格式如下:

  HostIdentAuthuserTime_Stamp"request"Status_codeFile_size

  例如:

  21.53.48.83--[22/Apr/2002:22:19:12-0500]"GET/cnet.gifHTTP/1.0"2008237

  下面是日志条目的细目分类:

  Host是网站访问者的IP地址或者DNS名;在上面的例子中,它是21.53.48.83。

  Ident是该访客的远端身份(RFC931)。破折号表明“未指定”。

  Authuser是用户ID(如果Web服务器已经验证了验证网站访问者的身份的话)。

  Time_Stam是服务器以“日/月/年”这种格式返回的时间。

  Request是网站访问者的HTTP请求,例如GET或者POST。

  Status_Code是服务器所返回的状态代码,例如:200代表“正确——浏览器请求成功”。

  File_Size是用户所请求文件的大小。在本例中,它为8237字节。

  服务器状态代码

  你可以在HTTP标准中找到W3C所开发的服务器状态代码规范。这些由服务器所产生的状态代码表示了浏览器和服务器之间的数据传输成功与否。这些代码一般传递给浏览器(例如非常有名的404错误“页面没有找到“)或者添加到服务器日志中去。

  收集数据

  创建我们的自定义应用程序的第一步就是获取用户数据。每当用户选择网站的某个资源时,我们就希望创建一个对应的日志条目。幸好,服务器变量的存在使得我们能够查询用户浏览器并获取数据。

  报头中的服务器变量携带了从浏览器传递到服务器的信息。REMOTE_ADDR就是一个服务器变量的例子。这个变量返回了用户的IP地址:

  例子输出:27.234.125.222

  下面的PHP代码将显示出当前用户的IP地址:

  让我们看看我们的PHP应用程序的代码。首先,我们需要定义我们想跟踪的网站资源并指定文件大小:

  //获取我们想记录的文件名称

  $fileName="cnet-banner.gif";

  $fileSize="92292";

  你无需把这些值保存到静态变量中去。如果你要跟踪许多条目,那么你可以把它们保存到数组或者数据库中去。在这种情况下,你可能会希望通过一个外部链接来找到每个条目,如下所示:

  其中“123”表示“cnet-banner.gif”所对应的记录。然后,我们通过服务器变量来查询用户浏览器。这样我们就得到在我们的日志文件中添加新条目所需的数据:

  怎样用定制的PHP应用程序来获取Web服务器的状态信息

  //得到网站浏览者的CLF信息

  $host=$_SERVER['REMOTE_ADDR'];

  $ident=$_SERVER['REMOTE_IDENT'];

  $auth=$_SERVER['REMOTE_USER'];

  $timeStamp=date("d/M/Y:H:i:sO");

  $reqType=$_SERVER['REQUEST_METHOD'];

  $servProtocol=$_SERVER['SERVER_PROTOCOL'];

  $statusCode="200";

  然后,我们检查服务器是否返回了空值(null)。根据CLF规范,空值应该用破折号来代替。这样,下一个代码块的任务就是寻找空值并用破折号来取代它:

  //给空值添加破折号(根据规范)

  if($host==""){$host="-";}

  if($ident==""){$ident="-";}

  if($auth==""){$auth="-";}

  if($reqType==""){$reqType="-";}

  if($servProtocol==""){$servProtocol="-";}

  一旦我们获取了必要的信息,这些值将被组织成一种符合CLF规范的格式:

  //创建CLF格式的字符串

  $clfString=$host."".$ident."".$auth."[".$timeStamp."]\"".$reqType."/".$fileName."".$servProtocol."\"".$statusCode."".$fileSize."\r\n";

  创建自定义日志文件

  现在,格式化之后的数据可以存放到我们的自定义日志文件中去。首先,我们将创建一种文件命名协定,并编写每日产生一个新日志文件的方法(函数)。在本文所举的例子中,每个文件都以“weblog-”开头,然后是按月/日/年表示的日期,文件扩展名为.log。.log扩展名一般表示服务器日志文件。(实际上,绝大多数日志分析器都搜索.log文件。)

  //用当前日期来命名日志文件

  $logPath="./log/";

  $logFile=$logPath."weblog-".date("mdy").".log";

  现在,我们需要判断当前日志文件是否存在。如果存在,我们就向它添加条目;否则,应用程序就创建新的日志文件。(新日志文件的创建一般发生在日期更改时,因为这时文件名发生变化了。)

  //检查日志文件是否已经存在

  if(file_exists($logFile)){

  //如果存在,则打开已存在的日志文件

  $fileWrite=fopen($logFile,"a");}

  else{

  //否则,创建新的日志文件

  $fileWrite=fopen($logFile,"w");}

  如果你在写或者追加文件时,收到“权限不足(PermissionDenied)”错误信息,请更改目标日志文件夹的权限来允许写操作。绝大多数Web服务器的默认权限为“可读可执行”。你可以用CHMOD命令或者使用FTP客户端来改变文件夹的权限。

  然后,我们创建文件锁定机制,这样当两个或者更多用户同时访问日志文件时,只有其中的一个用户可以对该文件进行写操作:

  //创建文件写操作的锁定机制

  flock($fileWrite,LOCK_SH);

  最后,我们写入条目的内容:

  //写CLF条目

  fwrite($fileWrite,$clfString);

  //解除文件锁定状态

  flock($fileWrite,LOCK_UN);

  //关闭日志文件

  fclose($fileWrite);

  处理日志数据

  在该系统产品化之后,客户希望得到对所收集到的访问者数据的详细统计分析。由于所有的定制日志文件都是按照一个标准的格式组织的,因此任何一个日志分析器都可以处理它们。日志分析器是一个工具,它分析大的日志文件并产生饼图、直方图以及其它统计图形。日志分析器也用来收集数据,并综合出提供哪些用户访问你的网站、点击数等方面的信息。

  下面列出了几个比较流行的日志分析器:

  WebTrends是一个非常不错的日志分析器,它适用于大规模网站以及企业级的网络。

  Analog是一个颇受欢迎的免费日志分析器。

  Webalizer是一个免费的分析程序。它可以产生HTML报告,这样大多数网络浏览器都可以查看它的报告。

  遵守标准

  我们可以轻松的扩展该应用程序来让它支持其它类型的日志记录。这样你就可以捕获到更多的数据,如浏览器类型以及referrer(referrer指得是链接到当前网页的前一个网页)。这里的经验就是:在你编程的时候遵循标准或者惯例终究会简化工作。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...