最近、私のウェブサイト上の写真、リンク、その他のデータを誰が使用したかに関する統計を作成したいと思いました。
写真の統計はおそらくこんな感じです。
/var/www/html/1.jpg
/var/www/html/tracker.php
/var/www/html/.htacess
RewriteEngine オン
RewriteBase /
RewriteRule ^ (.*).jpg$ tracker.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
header('Content-type:image/jpeg');
readfile($_GET['id'].'.jpg');
//file_put_contents('log.txt',$) _GET['id'].' '.$_SERVER['REMOTE_ADDR'].' '.var_dump(apache_request_headers())); 上記のコードは、イメージが開かれた回数をカウントできます。訪問者数 IP やブラウザなどのデータ。しかし、バックリンクをカウントするにはどうすればよいでしょうか?例: 別の Web サイトがこの写真を使用しています では、私の写真を使用している Web サイトの数をどのように数えるのでしょうか? (単にブラウザを開くのではなく)
また、例えば、小さなプラグインを作成します。ユーザーがこのプラグインを Web サイトに埋め込むことを許可します
コードの書き方を知りたいだけですか?返されるデータとデータベースの関係は個別に設計できます。ありがとう。
ディスカッション (解決策) への返信
tracker.php に $_SERVER['HTTP_REFERER'] を追加すると、ソース アドレス、つまりアクセスが要求されているページのアドレスを取得できます。
次に、正しい方法で URL のドメイン名を入力します。 ??写真
テーブルでグループ化するだけ??
ID 写真ドメイン
コードでカウントできるのは動的リクエストのみであり、 http://www.mydomain,com/1 などの静的 URL については何もできません。 jpeg
正しいアプローチは、Web サーバーのログ ファイルを分析することです
上記で述べたことは正しいです。すべての写真が動的 php を使用して表示されている場合、プログラムはすでに問題ありません。 $_SERVER['HTTP_REFERER'] を追加してソースを取得します。
Apacheのログを取得することで静的画像を解析できます。
コードでカウントできるのは動的リクエストのみであり、http://www.mydomain,com/1.jpeg などの静的 URL については何もできません
php access_log を分析しますか? そのログは毎日 100 MB 近くあります。cron スクリプトが 5 分ごとに実行される場合、どうすればログ ファイルを効率的に読み取ることができますか? (期間: 現在時刻 - 5 分、現在まで、ログ ファイル全体を完全に読み取る必要もありますか?)
ああ、ありがとう。ちょっとした質問ですが、PHP イメージの動的読み取りには、イメージの静的読み取りよりも多くの CPU、メモリ、IO がかかりますか?すごく増えるのかな?
?? はるかに速く、
php?
一番使いやすい??
すべての仮想ホストのログ ストレージ パスを自分で変更できるわけではありません。
つまり、あなたが開発したプロジェクトは、クラウド サーバーの Web マスターだけが使用できるということです。もちろん、誰が画像を使用するかは重要ではありません。
中国のインターネットは、こうしたことを気にする人は多くありません。共有の精神を持っているはずです。
ある日、写真がたくさん使われていることに気づいたら。その後、アクセスした画像参照をロゴやその他の慎重に作成された広告画像に変換するための疑似静的コードのみが必要になります
多くの画像に「この画像は XXX サイトからのものです。*** アクセスを入力してください」と表示されることに気づきましたか。 、これらはすべて擬似静的であり、1 つの文で実行できます。誰かがウェブサイトの画像を引用している限り、その画像は擬似的に静的に設定された別の画像になります。 ... ファイルは追加のみ可能で、削除はできません。また、既存のコンテンツは変更されません。前回読んだ場所を覚えて、今回も読み続けるだけで済みます。
SSH は cat /var/log/httpd/access_log | grep "1.jpeg" のようなものを使用して、1.jpeg にアクセスしたすべてのユーザーの数百 MB のログをわずか 1 秒で出力できます
PHP はわかりません。そのため、効率を重視し、占有するリソースを減らす必要があります。
nginx サーバーがリファラーのアンチホットリンクを設定し、リファラーを書き込むようにログをカスタマイズできることだけがわかっています
ログファイルを使って画像の使用状況を分析する場合、先ほどグループリーダーが言ったように、ログファイルは増加するだけで減少しないため、精度を把握するのは困難だと思います。 。
主な問題は、PHP で大きなファイルの最後の数レコードを効率的に開く方法です。詳細を読み取り、各読み取りを access_log の最後の 1000 レコードに設定できます。私のサーバーには 32 GB の RAM が搭載されていますが、低い CPU オーバーヘッドが必要です。ありがとう。 ... 追加のみが可能で、削除はできません。また、既存のコンテンツは変更されません。したがって、前回読んだ場所を覚えていて、今回も読み続けるだけで済みます
http://httpd.apache.org/docs/2.2/programs/rotatelogs.html のメソッドを見つけます
ログ ファイルの読み取りに関して、私の意味が理解できないようですね
ログ ファイルは可変ですインデックス作成の場合、指定した行を見つけることはできません
ただし、一度読んだログはすべて「古い情報」ですので、自分で作成する必要はありません。再度読み取る必要はありません
fgets を一度に 1 行ずつ実行するのは効率が悪すぎると言う人も確実にいます。しかし、fread を一度に 1 つの大きなブロックを使用する場合、最後の半分の行を処理するのは簡単ではありません
ありがとう、わかりました。