2016-01-01 56 views
6

好吧,我知道這是一個奇怪的問題,可能是不可能的,這樣的想法,將不勝感激。如何監視用戶的帶寬消耗在PHP

無論如何,我想知道我給每個用戶帶來多少帶寬。當他登錄到網站時,我確定了一個用戶。

因此,基本上對於每個請求,我想知道該請求使用了多少帶寬。如果用戶當時登錄的,我會的量添加到他的帳戶。

將使用笨,但我懷疑有差別。

所有的東西都會在同一臺基於Linux的服務器上運行Apache,至少現在是這樣。

理想情況下,我想要一個不限於託管類型的解決方案。

將使用谷歌要麼雲或Amazon AWS。如果解決方案僅限於谷歌雲或aws,它將起作用。

+0

是在同一臺服務器上的一切嗎? – Clay

+0

而且,你在運行什麼web服務器? Apache的?或另一個? – Clay

+0

@Clayton對於遲到的回覆感到抱歉。是的,一切都在同一臺服務器上,並將使用Apache –

回答

2

既然你說你是在Apache,這裏有2個想法。

第一個想法(馬馬虎虎的想法,但有趣的思考......):

Cookie與服務器(包括所有圖像等),在每次請求發送。當用戶登錄時設置PHP和名字的cookie它USERTOKEN它的價值,然後設置爲用戶的ID的MD5 +鹽。

%{USERTOKEN}C%B插入到自定義LogFormat指令中。現在

%{Foobar}C The contents of cookie Foobar in the request sent to the server. 
      Only version 0 cookies are fully supported. 

%B   Size of response in bytes, excluding HTTP headers. 

,您創建一個自定義日誌格式,看起來像這樣:

LogFormat "%B %{USERTOKEN}C" php_bandwidth_log 
CustomLog "logs/php_bandwidth_log" php_bandwidth_log 

然後,創建一個腳本來解析php_bandwidth_log並將其映射到原始用戶的ID。

不幸的是,這個想法並非萬無一失,因爲有人仍然可以通過不通過cookie(可能)來假設訪問網站內容。總之,根據您的情況,這可能爲你工作,如果不是,另一種更好的思路是基本的路線,通過PHP腳本的所有內容,所以你可以做任何記錄你想就可以了。

設想二(更好):

因此,創建一個可以這樣調用/files.php?path=/blah/blah.jpg(簡單化了這個例子,可以與mod_rewrite的規則來美化了一番)一個PHP文件,然後裏面的它,你你可以記錄該用戶的ID並跟蹤訪問的文件。這假設你只想跟蹤文件。這不會跟蹤在頁面上生成的HTML - 您可以使用前面提到的自定義Apache日誌記錄想法,但稍微修改它以獲取該信息。

下面是一些僞代碼,以幫助你的想法:

if (!$hasSession) { 
    die("Invalid session"); 
} 
$size = filesize($path); 
insert_into_bandwidth_table($userId, $size); 
header("Content-Type: ..."); 
readfile($path); 

以下是如何追蹤只是爲了執行PHP腳本響應的大小,但如果你正在運行PHP,因爲它只會工作一個模塊。

在你的PHP中添加這樣的東西。基本上,這使得阿帕奇讀取這個變量日誌寫作目的:

apache_note("PHP_USER_ID", 1234); 

apache_note - apache_note - 獲取和設置Apache的要求指出

說明:此功能是Apache的table_get和table_set的包裝。它編輯請求期間存在的筆記表。該表的目的是允許Apache模塊進行通信。

Read more here

在httpd.conf日誌配置

然後做這樣的事情:

LogFormat "%B %{PHP_USER_ID}n" php_bandwidth_log 
CustomLog "logs/php_bandwidth_log" php_bandwidth_log 

信息就說明從文檔:

%{Foobar}n The contents of note Foobar from another module. 

而且...只是如果你沒有把它作爲一個模塊運行,你會意識到還有一種替代方法可以使用apache_note。你的PHP代碼反而會做到這一點:

apache_setenv('PHP_USER_ID', $userId, TRUE); 

然後登錄你會使用這個LogFormat指令:

LogFormat "%B %{PHP_USER_ID}e" php_bandwidth_log 
+1

謝謝你。這些都是美妙的想法!在這些方向上進行一些探索可以解決這個問題。基於cookie思路的另一個想法。我們知道哪個用戶在什麼時間通過哪個IP訪問網站。解析apache日誌文件時,我們可以使用這些信息(在日誌文件中使用ip打印帶寬)。這將解決空的cookie問題,但使其他事情更復雜。 –

+0

如果您想要了解第二個想法,那麼我只是編寫了執行PHP腳本的請求大小。缺點是它會迫使你將PHP用作一個可能不合意的模塊。儘管我們在之前的工作中做過這個,但它工作得很好。所以,這個+文件路由將使它始終擁有用戶ID。 – Clay

+0

aha ...它看起來像你可以使用'apache_setenv'而不是'apache_note',我相信它會繞過將PHP作爲模塊的需要。再次,apache_note/apache_setenv將只能記錄在會話中運行的PHP腳本的大小,而不是任何外部加載的不是PHP腳本的文件。 – Clay

0

您可以使用amazon的API檢查帶寬使用情況,而不是使用日誌的 。如您所說您使用s3來管理 資產,如果您爲每個用戶 創建一個新存儲區並檢查帶寬使用情況,並在其超過該限制時限制該帳戶,那麼將會很有用。

Source: 

可能的解決方案:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

永久用戶的新桶? Yeesh。 AWS在默認情況下將您限制爲100個存儲桶。 – ceejayoz