php统计图片使用,反向链接等。

mumubangditu 2015-01-18 12:44:15
最近想做一个统计,谁用了我网站的图片、链接等数据。

图片统计大概可以这样。
/var/www/html/1.jpg
/var/www/html/tracker.php
/var/www/html/.htacess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(.*).jpg$ tracker.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<?php
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和浏览器等数据。但是如何统计反向链接呢? 比如:另一个网站使用了这张图片<img src="http://www.mydomain,com/1.jpeg" />,那么怎样统计到底有多少网站使用了我的图片?(而不是单纯的浏览器打开)

另外,比如我制作一个小插件。允许用户嵌入该插件到他们的网站 <iframe framemargin=0 frameborder=0 width=300 height=250 scrolling=no src="http://www.mydomain.com/script.php"></iframe> 那么script.php应该写一些怎样的代码,可以统计哪些网站使用了我的插件?

我只想知道代码怎么写?返回的数据与数据库的联系可以另外设计。谢谢。
...全文
318 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mumubangditu 2015-02-05
  • 打赏
  • 举报
回复
谢谢,明白了。
xuzuning 2015-01-31
  • 打赏
  • 举报
回复
可能与 Apache 的版本有关 http://apache.chinahtml.com/logs.html 关于读取日志文件,你好像没有理解我的意思 日志文件是不定长记录文件,在没有索引的情况下,是无法定位到指定行的 不过自己构建索引文件也是没有必要的,毕竟日志里都是“旧闻”,读过了也就没必要再读了 文件函数集中有: ftell -- 返回文件指针读/写的位置 fseek -- 在文件指针中定位 你只需在每次 fgets 之后用 ftell 读取偏移位置,并保存 下次再读时,取回上次保存的偏移位置,用 fseek 定位 就可接着读了 一定会有人说 fgets 一次一行效率太低,但用 fread 一次一大块时,尾部的半截行,处理起来也并非易事
mumubangditu 2015-01-31
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
1、静态文件由 web 服务器直接读取,而php动态读取则需要先启动 php 解析程序,再由 php 程序读取 板板脚趾头都会知道谁的效率高 2、日志文件是只增不减的,并且已存在的内容也不会被修改。所以你只需记住上一次读到哪里,这次接着读就可以了
找到一个方法,http://httpd.apache.org/docs/2.2/programs/rotatelogs.html 用rotatelogs每分钟生成一个新的log文件。但为什么重启apache后没有生成想要的日志呢?
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" com                                                                                        bined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I                                                                                         %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" combined env=!dontlog
    CustomLog "|sbin/rotatelogs -f logs/my_log 60" combined env=!dontlog
    SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
    SetEnvIf Remote_Addr "::1" dontlog
</IfModule>
mumubangditu 2015-01-31
  • 打赏
  • 举报
回复
引用 11 楼 zy205817 的回复:
如果通过日志文件去分析图片使用情况,我觉得不是很可靠,就想刚才群主说的,日志文件只增不减,分析的话,准确度不好把握。
准确度的话,可以用 date_default_timezone_set () 为服务器的时区,然后用getdate();获取当前时间。crontabm每一分钟执行,只要正则出当前时间前一分钟的所有记录。 最主要的问题还是php如何高效的打开一个大文件的最后几条,可以多读取一点,设置每次读取为access_log的最后1000条记录。我的服务器有32GB内存,但是需要较低CPU开销。谢谢。
码无边 2015-01-25
  • 打赏
  • 举报
回复
如果通过日志文件去分析图片使用情况,我觉得不是很可靠,就想刚才群主说的,日志文件只增不减,分析的话,准确度不好把握。
智商众筹 2015-01-25
  • 打赏
  • 举报
回复
只知道nginx服务器可以配置referer防盗链,并且自定义log,将referer写进去 apache也肯定有 需要php分析log的话...定时导入到sql,然后清空log如何?
mumubangditu 2015-01-23
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
1、静态文件由 web 服务器直接读取,而php动态读取则需要先启动 php 解析程序,再由 php 程序读取 板板脚趾头都会知道谁的效率高 2、日志文件是只增不减的,并且已存在的内容也不会被修改。所以你只需记住上一次读到哪里,这次接着读就可以了
明白了那么怎么写一段PHP代码分析日志文件呢?循环,正则读取,然后怎么才能记住上一次读取到哪儿呢? SSH可以用类似 cat /var/log/httpd/access_log | grep "1.jpeg",打印出所有访问过1.jpeg的用户几百个MB的日志也就1秒钟 PHP不懂,还得讲究效率,占用资源少。
bear63 2015-01-20
  • 打赏
  • 举报
回复
并不是所有的虚拟主机 日志存放路径 可以自行修改的。 所以你开发的这个项目,只能用于 云服务器的站长, 当然,大家对图片给谁动用了,并不觉得有什么,不是吗? 中国的网络是开放的,没多少人会去在乎注意这些东西,应该应该本着共享的精神。 如果有一天,发现图片给动用得非常多了。那么只需要一个伪静态代码,就可以把访问图片引用变成一个logo或者其它精心制作的广告图, 你有没有发现有很多图片有时候显示“该图片来自 XXX站,请进入***访问”,那些都是伪静态,一句话就搞定了。只要别人引用了网站图片,那图片就会变成伪静态设定好的另外一张图片。
傲雪星枫 2015-01-19
  • 打赏
  • 举报
回复
靜態快很多, php讀取會慢。 最好用靜態。
xuzuning 2015-01-19
  • 打赏
  • 举报
回复
1、静态文件由 web 服务器直接读取,而php动态读取则需要先启动 php 解析程序,再由 php 程序读取 板板脚趾头都会知道谁的效率高 2、日志文件是只增不减的,并且已存在的内容也不会被修改。所以你只需记住上一次读到哪里,这次接着读就可以了
mumubangditu 2015-01-19
  • 打赏
  • 举报
回复
引用 3 楼 fdipzone 的回复:
楼上讲的对,如果你的图片全部都是用动态php去显示的,你的程序已经可以了。加上$_SERVER['HTTP_REFERER']获取来源。 而静态图片则可以通过获取apache log来分析。
哦,谢谢。小问一下,php动态读取和静态读取图片相比,是不是会花费更多的CPU,内存和IO?是不是会增加许多?
mumubangditu 2015-01-19
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
你的代码只能统计动态的请求,对于静态的 url 就无能为力了,比如 http://www.mydomain,com/1.jpeg 正确的做法是分析 web 服务器的日志文件
php分析access_log? 那个log每天都有近百MB,如果cron脚本每5分钟运行一次,怎么高效的读取log文件?(时间段:当前时间-5分钟,到当前,那么是不是也要完整读取整个log文件?) 还有怎么做foreach?按/r/n换行还是别的?然后再正则,再放进数据库? 大侠,能不能给段高效点的代码?谢谢。
xuzuning 2015-01-18
  • 打赏
  • 举报
回复
你的代码只能统计动态的请求,对于静态的 url 就无能为力了,比如 http://www.mydomain,com/1.jpeg 正确的做法是分析 web 服务器的日志文件
傲雪星枫 2015-01-18
  • 打赏
  • 举报
回复
怎样统计到底有多少网站使用了我的图片?(而不是单纯的浏览器打开) 只要統計http請求,不需要知道是否用瀏覽器打開。 你可以在tracker.php中加上$_SERVER['HTTP_REFERER'] 來獲取來源地址,即請求你這張圖的頁面的地址。 然後通過正則,獲取url的domain入庫。統計直接 group by photo 就可以了 表結構 id photo domain
傲雪星枫 2015-01-18
  • 打赏
  • 举报
回复
楼上讲的对,如果你的图片全部都是用动态php去显示的,你的程序已经可以了。加上$_SERVER['HTTP_REFERER']获取来源。 而静态图片则可以通过获取apache log来分析。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧