2016-01-01 21 views
6

私はこれが奇妙な問題であり、可能ではない可能性があることを知っています。PHPでユーザの帯域幅消費を監視する方法

とにかく、私はどのくらいの帯域幅を各ユーザーに与えているのか調べたいと思います。私は彼がウェブサイトにログインするときにユーザーを特定します。

基本的にリクエストごとに、そのリクエストでどれだけの帯域幅が使用されているかを知りたいと思います。ユーザーがその時点でログインしていた場合、その金額をアカウントに追加します。

私は違いがあるとは思われますが、codeigniterを使用します。

すべてのものは、少なくともApache用のLinuxベースのサーバーにインストールされます。

理想的には、ホスティングの種類に限定されないソリューションがほしいと思います。

GoogleクラウドまたはアマゾンAWSを使用します。ソリューションがGoogleのクラウドまたはawsに制限されている場合、それは動作します。

+0

を同じサーバー上のすべてのものですか? – Clay

+0

そして、あなたはどのWebサーバーを実行していますか? Apache?または別のもの? – Clay

+0

@Claytonは遅く応答して申し訳ありません。はい、すべてが同じサーバー上にあり、Apacheを使用しています –

答えて

2

あなたがApacheの上にあると述べたので、ここでは2つのアイデアがあります。

まず考え方(考えるので、そのアイデアが、楽しみが...):

クッキーは、(すべての画像などを含む)は、サーバー上のすべての要求で送信されます。ユーザーがログインしてPHPでクッキーを設定し、USERTOKENという名前をつけたら、その値をそのユーザーのIDのmd5 + saltに設定します。

%{USERTOKEN}C%BをカスタムLogFormatディレクティブに挿入します。あなたがphp_bandwidth_logを解析し、元のユーザーのIDにマッピングするためのスクリプトを作成し、その後

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

%{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. 

は今、あなたはこのようになりますカスタムログ形式を作成します。

残念ながら、誰かが(おそらく)Cookieを渡さずにサイトのコンテンツにアクセスする可能性があるので、この考え方は間違いありません。とにかく、あなたの状況に応じて、これはあなたのために働くかもしれませんが、そうでなければ、代わりに、もっと良いアイデアは基本的にPHPスクリプトを使ってすべてのコンテンツをルーティングするので、

セカンドアイデア(良い):

ので、この/files.php?path=/blah/blah.jpgのように呼び出すことができるPHPファイルを作成します(この例では単純化しすぎ、mod_rewriteのルールにアップprettiedすることができる)、それの内側にあなたあなたそのユーザーの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のログ書き込みのために、この変数を読み取ることができます:

apache_note("PHP_USER_ID", 1234); 

apache_note - apache_note - Apacheリクエストを取得し、設定

説明注意事項:この関数は、Apacheのtable_getおよびtable_setのラッパーです。リクエスト中に存在するノートの表を編集します。表の目的は、Apacheモジュールが通信できるようにすることです。

Read more here

その後、あなたのhttpd.confログの設定では、このような何か:ちょうど

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

そして...:ドキュメントからノートに

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

情報をあなたがモジュールとしてそれを実行していない場合に備えて、apache_noteに代わるものがあることを認識しました。あなたはこのLogFormatディレクティブ使用するログインに続いて

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

::あなたのPHPコードの代わりにこれを行うだろう

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

ありがとうございました。これらはすばらしいアイデアです!これらの方向への少しの調査は、問題を解決する可能性があります。クッキーのアイデアに基づく別のアイデア。どのユーザーがいつどのIPを介してWebサイトにアクセスしているかわかります。この情報は、Apacheログファイルの解析時に使用できます(ログファイルのipで使用される印刷帯域幅)。それは空のクッキーの問題を解決しますが、他のものはもっと複雑にします。 –

+0

2番目のアイデアをお持ちの場合は、実行されたPHPスクリプトのリクエストサイズをどのように編集できるかを編集しました。欠点は、PHPをモジュールとして使用することが望ましくないことです。私たちは以前の仕事でこれをやったが、うまくいった。だから、+ファイルのルーティングはあなたが常にユーザIDを持つようにするでしょう。 – Clay

+0

aha ...あなたは 'apache_note'の代わりに' apache_setenv'を使うことができます。これは、PHPをモジュールとして持つ必要性を回避すると考えています。 apache_note/apache_setenvは、セッション内で実行されるPHPスクリプトのサイズだけをログに記録することができます。これは、PHPスクリプト以外の外部ロードされたファイルではありません。 – Clay

0

アマゾンのAPIを使用して、ログを使用して の代わりに帯域幅の使用状況を確認できます。 の資産を管理するためにs3を使用していると言えば、すべてのユーザーに新しいバケットを作成して、帯域幅の使用状況を確認し、 がその制限を超える場合はアカウントを制限するとよいでしょう。

Source: 

考えられる解決策:

Limiting Membership By Bandwidth

Track User Bandwidth With PHP Application

+1

これまでのユーザーのための新しいバケットですか? Yeesh。 AWSではデフォルトで100バケットに制限されています。 – ceejayoz

関連する問題