php流量图形化,用php引用cacti中的网络流量图表
Cacti 在英文中的意思是仙人掌的意思,Cacti是一套基于PHP,MySQL,SNMP及RRDTool開發的網絡流量監測圖形分析工具。它通過snmpget來獲取數據,使用 RRDtool繪畫圖形,而且你完全可以不需要了解RRDtool復雜的參數。它提供了非常強大的數據和用戶管理功能,可以指定每一個用戶能查看樹狀結 構、host以及任何一張圖,還可以與LDAP結合進行用戶驗證,同時也能自己增加模板,功能非常強大完善。
在管理系統中,已經實現了設備上下架功能,可以按機柜來查看機柜中的設備,但有一個缺憾就是設備的流量圖設置在cacti系統中,要想看設備流量圖還要切換到cacti中查看。若是能直接在管理系統中,選中設備就能查看該設備的cacti流量圖就更好了,并且可以按時間查詢,就象使用cacti一樣。出于這個目的,我使用PHP的curl擴展實現了此功能。
要實現引用cacti的流量圖表,先要分析cacti圖表的鏈接。仔細觀察cacti圖表,發現流量圖鏈接有個特點。
http://xxx.xxx.xxx.xxx/cacti_cnc/graph_image.php?local_graph_id=2068&rra_id=0&graph_start=1282207985&graph_end=1282553585
可以發現,cacit圖的鏈接有兩個關鍵的參數,一個是graph_id,一個是rra_id,graph_id不必說,是設備流量圖的標識碼,rra_id是什么呢?其實是流量圖的類型。
當rra_id=all時,查看該設備的所有流量圖
當rra_id=0時,可以按任意時間段查看流量圖均值。
當rra_id=1時,查看最近一天的流量圖均值
當rra_id=2時,查看最近一周流量圖均值。
當rra_id=3時,查看最近一月流量圖均值。
當rra_id=4時,查看最近一年流量圖均值。
注意到,當rra_id=0時,只要給出時間段參數,就可以得到任意范圍的流量圖。于是,查看設備流量圖,就可以從rra_id=0下手。
要查看設備流量圖,必須有個地方保存流量圖的url。經過考慮,我把URL保存在設備IP表中(在設備IP表上添加一個字段)。保存的url不包含最后&graph_start及graph_end這兩個參數,這兩個參數值我在界面上傳入。另外要查看cacti的圖表,必須先登錄。
經過分析后,思路就變得簡單了:
登錄cacti
傳入url,返回結果
用個來指向這個結果就可以顯示了。
由于cacti是要驗證session的,而且登錄成功后,會寫一串cookie,所以要拿到流量圖URL,先得保存cookie。
php的curl擴展允許保存cookie,并且允許用保存下來的cookie再次請求。這是解決問題的關鍵。核心代碼如下:
//getChart.php
$graph_start = $_REQUEST['graph_start'];
$graph_end = $_REQUEST['graph_end'];
$url= $_REQUEST['chart_url'];
$url = url_decode($url);
$username= "xxxxxx";
$password = "xxxxxx";
$data = "&action=login&login_username=" . $username . "&login_password=" . $password;
$cookie_file = tempnam ( './tmp', 'cookie' );
$curl = curl_init (); // 啟動一個CURL會話
curl_setopt ( $curl, CURLOPT_URL, $url); // 要訪問的地址
curl_setopt ( $curl, CURLOPT_USERAGENT, $_SERVER ['HTTP_USER_AGENT'] ); // 模擬用戶使用的瀏覽器
curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自動跳轉
curl_setopt ( $curl, CURLOPT_AUTOREFERER, true ); // 自動設置Referer
curl_setopt ( $curl, CURLOPT_POST, true ); // 發送一個常規的Post請求
curl_setopt ( $curl, CURLOPT_COOKIEJAR, $cookie_file ); //保存cookie
curl_setopt ( $curl, CURLOPT_COOKIEFILE, $cookie_file ); //發送cookie
curl_setopt ( $curl, CURLOPT_POSTFIELDS, $data ); // Post提交的數據包
curl_setopt ( $curl, CURLOPT_TIMEOUT, 30 ); // 設置超時限制防止死循環
curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 顯示返回的Header區域內容
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 獲取的信息以文件流的形式返回
curl_exec ( $curl ); // 執行操作
if (curl_errno ( $curl )) {
echo "error";
} else {
if(!empty($graph_start)) $url .= "&graph_start=".$graph_start;//附上起始時間
if(!empty($graph_end)) $url .= "&graph_end=".$graph_end;//附上結束時間
curl_close ( $curl ); // 關閉CURL會話
$ch2 = curl_init ();
curl_setopt ( $ch2, CURLOPT_URL, $url );
curl_setopt ( $ch2, CURLOPT_HEADER, false );
curl_setopt ( $ch2, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch2, CURLOPT_COOKIEFILE, $cookie_file );
$img = curl_exec ( $ch2 );
curl_close ( $ch2 );
echo $img;//輸出流量圖
}
unlink ( $cookie_file );
showchart.php
$url = url_encode("http://xxx.xxx.xxx.xxx/cacti_cnc/graph_image.php?local_graph_id=2068&rra_id=0");
echo '
?>
以上代碼只是核心示意性代碼,界面上的元素比如傳遞時間參數,本文中為了突出重點內容,沒有提及。
總結
以上是生活随笔為你收集整理的php流量图形化,用php引用cacti中的网络流量图表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正交表 软件测试作业,软件测试单元3 黑
- 下一篇: ThinkPHP_防止表单重复提交