程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用定制的PHP應用程序來獲取Web服務器的狀態信息

用定制的PHP應用程序來獲取Web服務器的狀態信息

編輯:關於PHP編程

大多數網站托管(Web hosting)公司都支持客戶對Web站點統計數據的訪問,但是你往往會覺得服務器所產生的狀態信息不夠全面。例如,配置不正確的Web服務器不能識別某些文件類型,這些類型的文件就不會出現在狀態信息之中。幸好,你可以用PHP來定制狀態信息收集程序,這樣你就可以獲取你所需要的信息了。


公共日志文件格式(Common Logfile Format,CLF)的結構

 
CLF最初是NCSA為HTTPd(全球網服務器軟件)而設計的。CERN HTTPd是一個由萬維網聯盟(World Wide Web Consortium,W3C)維護的公共域Web服務器。W3C網站列出了該日志文件規范。基於微軟和UNIX的Web服務器都可以生成CLF格式的日志文件。CLF格式如下:
Host IdentAuthuserTime_Stamp "request" Status_codeFile_size

例如:
21.53.48.83 - - [22/Apr/2002:22:19:12 -0500] "GET /cnet.gif HTTP/1.0" 200 8237

下面是日志條目的細目分類:

Host是網站訪問者的IP地址或者DNS名;在上面的例子中,它是21.53.48.83。
Ident是該訪客的遠端身份(RFC 931)。破折號表明“未指定”。
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 echo $_SERVER['REMOTE_ADDR']; ?>

讓我們看看我們的PHP應用程序的代碼。首先,我們需要定義我們想跟蹤的網站資源並指定文件大小:
//獲取我們想記錄的文件名稱
$fileName="cnet-banner.gif";
$fileSize="92292";

你無需把這些值保存到靜態變量中去。如果你要跟蹤許多條目,那麼你可以把它們保存到數組或者數據庫中去。在這種情況下,你可能會希望通過一個外部鏈接來找到每個條目,如下所示:
<a href="weblogger.php?bannerid=123"><imgsrc="cnet-banner.gif" border="0"></a>

其中“123”表示“cnet-banner.gif”所對應的記錄。然後,我們通過服務器變量來查詢用戶浏覽器。這樣我們就得到在我們的日志文件中添加新條目所需的數據:
//得到網站浏覽者的CLF信息
$host=$_SERVER['REMOTE_ADDR'];
$ident=$_SERVER['REMOTE_IDENT'];
$auth=$_SERVER['REMOTE_USER'];
$timeStamp=date("d/M/Y:H:i:s O");
$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"); }

如果你在寫或者追加文件時,收到“權限不足(Permission Denied)”錯誤信息,請更改目標日志文件夾的權限來允許寫操作。絕大多數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. 下一頁:
Copyright © 程式師世界 All Rights Reserved