0

これは何年もの間私を悩ませてきましたが、私はそれを理解することができません。

基本的に、ファイルに一意のIPアドレスを格納するヒットカウンターを使用しています。しかし、私がやろうとしているのは、各IPアドレスが何回ヒットしたかをカウントすることです。

したがって、ファイルを読み取る代わりに:

222.111.111.111  
222.111.111.112  
222.111.111.113  

読んでもらいたい:

222.111.111.111 - 5  
222.111.111.112 - 9  
222.111.111.113 - 41  

これは私が使用しているコードです:

    $file = "stats.php";  
    $ip_list = file($file);  
    $visitors = count($ip_list);  

    if (!in_array($_SERVER['REMOTE_ADDR'] . "\n", $ip_list))  
    {  
    $fp = fopen($file,"a");  
    fwrite($fp, $_SERVER['REMOTE_ADDR'] . "\n");  
    fclose($fp);  
    $visitors++;  
    }

私がやろうとしていたことは、それを次のように変更することです。

    if (!in_array($_SERVER['REMOTE_ADDR'] . " - [ANY NUMBER] \n", $ip_list))  
    {  
    $fp = fopen($file,"a");  
    fwrite($fp, $_SERVER['REMOTE_ADDR'] . " - 1 \n");  
    fclose($fp);  
    $visitors++;  
    }

    else if (in_array($_SERVER['REMOTE_ADDR'] . " - [ANY NUMBER] \n", $ip_list))  
    {  
    CHANGE [ANY NUMBER] TO [ANY NUMBER]+1
    }

最後に追加された部分を理解できると思いますが[ANY NUMBER]、次の番号が何であれ、IPを見つけるように部分を表すにはどうすればよいですか?

私はおそらくこれについてすべて間違っていると思いますが、誰かが私に手がかりを与えることができれば、私はそれを本当に感謝します。

ありがとう。

4

3 に答える 3

1

これは悪い考えです、このようにしないでください。

Webサイトの統計情報をファイルシステムに保存するのは通常のことですが、事前集計は適用されません。

ファイルシステムを使用する場合は、データに対して事後集計を実行します。それ以外の場合は、データベースを使用します。

于 2012-07-19T03:44:55.510 に答える
0

あなたがしていることは非常に悪い考えです

しかし、最初にあなたが尋ねている実際の質問に答えましょう。

これを行うには、最初にファイルを実際に処理して、それを可能にする何らかのデータ構造にする必要があります。の形式の配列を前もってお勧めしIP => AMOUNTます。

例 (テストされていないコード):

$fd = file($file);
$ip_list = array();
for ($fd as $line) {
   list($ip, $amount) = explode("-", $line);
   $ip_list[$ip] = $amount;
}

元のデータの性質により、コードの最後$ipと前にスペースが残るため、コードは完全ではないことに注意してください。$amountしかし、正しい方向に向けるだけでも十分に機能します。より「正確な」ソリューションには、正規表現を使用するか、元のデータ ソースをより便利な形式に変更する必要があります。


今、あなたの実際の問題に対する本当の答え

request ごとにそのファイルを開いて処理し、後ですべてを書き戻す必要があるため、プロセスはすぐにパフォーマンスのボトルネックになります (開いているファイルをインライン編集できるかどうかはわかりません) 。

ある種の IP ごとのヒット カウントを実行しようとしている場合、問題に対するより良い解決策がたくさんあります。

  • 既存のソリューションを使用します ( piwik など)
  • データに実際のデータベースを使用する
  • IPのリストだけでファイルをシンプルに保ち、定期的にオフラインで後処理して、必要な形式にします
  • ウェブサーバーのログにアクセスできる場合 (そして、元の IP ですべてのリクエストをログに記録するように設定されている場合)、そのファイルを完全に書き込むことを避けることができ、代わりにそのファイルを後処理できます。
于 2012-07-19T03:48:47.623 に答える
0

in_array()基本的な文字列一致を行うだけです。部分文字列は検索しません。データストレージにフラットファイルを使用することがどれほど悪い考えであるかを無視して、正規表現を使用できるようにするpreg_grepが必要です

$ip_list = file('ips.txt');
$matches = preg_replace('/^\d+\.\d+\.\d+\.\d+ - \d+$/', $ip_list);

もちろん、これは非常に基本的で壊れた IP アドレスの一致であり、一致した行の実際のインデックスを取得できないため、実際に $ip_list の値を変更するのに役立ちません。

于 2012-07-19T03:59:44.433 に答える